2012-12-29 22 views

回答

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距離以獲得一個漂亮的圖形,您將必須稍微更改這些值。