我正在寻找一种类似于graphviz的工具,它可以渲染图形,但这样我就可以只约束每个节点的x坐标。然后,该工具将自动选择y坐标以使图形看起来整洁。
基本上,我想制定时间表。
语言/平台/渲染媒介不是很重要。
答案 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,但如果需要,可以更改它。
Hooke
和Coulomb
函数计算节点之间的相应力;第一个是顶点之间的距离是线性的,第二个是二次的,所以有一个保证均衡。这些函数看起来像
def hooke(u, v)
return -k * |u.position - v.position|
def coulomb(u, v)
return C * |u.position - v.position|
其中大多数计算都是矢量形式。 C和k具有实际值,但可以通过实验来获得所需的图形。这通常不是必需的,因为缩放因子在两个维度上几乎会扩展或收缩整个图形,但是这里设置x距离以便得到一个好看的图形,你必须稍微改变一下这些值