我正在尋找一種類似於graphviz的工具來渲染圖形,但這將允許我僅限制每個節點的x座標。然後,該工具將自動選擇y座標以使圖形看起來整潔。是否有一個圖形繪製工具,可以讓我約束x,並自動佈局y?
基本上,我想製作一個時間表。
語言/平臺/渲染介質不是很重要。
我正在尋找一種類似於graphviz的工具來渲染圖形,但這將允許我僅限制每個節點的x座標。然後,該工具將自動選擇y座標以使圖形看起來整潔。是否有一個圖形繪製工具,可以讓我約束x,並自動佈局y?
基本上,我想製作一個時間表。
語言/平臺/渲染介質不是很重要。
如果你想要一個整潔的圖形,強制執行算法將是你最好的選擇。其中最好的一個是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距離以獲得一個漂亮的圖形,您將必須稍微更改這些值。