有没有一个图形绘制工具,可以让我约束x,并自动布局y?

时间:2012-12-29 23:40:24

标签: graphics graph graphviz

我正在寻找一种类似于graphviz的工具,它可以渲染图形,但这样我就可以只约束每个节点的x坐标。然后,该工具将自动选择y坐标以使图形看起来整洁。

基本上,我想制定时间表。

语言/平台/渲染媒介不是很重要。

1 个答案:

答案 0 :(得分:0)

如果你想要一个看起来很整洁的图形,那么力导向算法将是你最好的选择。其中最好的一个是SFDP(由AT& T开发,包含在graphviz中),虽然我似乎无法找到伪代码或简单的实现。我不认为有任何算法这种专业。值得庆幸的是,您可以轻松编写自己的代码。我将呈现一些伪代码,大部分是维基百科,但适当的一维修改。我假设你有n个顶点,x位置的矢量是x,由x.i订阅。

set all vertex velocities to (0,0)
set all vertex positions to (x.i, random)
while (KE > epsilon)
    KE = 0
    for each vertex v
        force = (0,0)
        for each vertex u != v
            force = force + (0, coulomb(u, v).y)
            if u is incident to v
                force = force + (0, hooke(u, v).y)
        v.velocity = (v.velocity + timestep * force) * damping
        v.position = v.position + timestep * v.velocity
        KE = KE + |v.velocity| ^ 2

这里.y表示获得力的y分量。这可以确保顶点位置的x分量永远不会改变您设置的位置。 epsilon参数由您设置,与您预期的KE(动能)相比应该是一个小的参数。此外,|v|表示向量v的大小(除了KE之外,所有计算都是上面的2向量)。注意我将所有节点的质量设置为1,但如果需要,可以更改它。

HookeCoulomb函数计算节点之间的相应力;第一个是顶点之间的距离是线性的,第二个是二次的,所以有一个保证均衡。这些函数看起来像

def hooke(u, v)
    return -k * |u.position - v.position|

def coulomb(u, v)
    return C * |u.position - v.position|

其中大多数计算都是矢量形式。 C和k具有实际值,但可以通过实验来获得所需的图形。这通常不是必需的,因为缩放因子在两个维度上几乎会扩展或收缩整个图形,但是这里设置x距离以便得到一个好看的图形,你必须稍微改变一下这些值