2010-03-17 36 views
18

我特別想知道的不僅僅是一個圖形的佈局,但是當用戶選擇一個圖形節點並開始在屏幕區域中拖動它時,必須不斷重繪該行以反映它看起來的樣子如果用戶要釋放該節點。我想這是佈局算法的一部分?在圖形節點之間繪製線條有哪些好的算法?

另外一些應用程序有點花哨,不要簡單地以一種很好的彎曲方式畫出線條,而且還可以以幾乎直角彎曲方形節點周圍的線條。請參閱附加的圖像,並記住,拖動節點時,該線條被繪製爲行軍螞蟻,並重新排列,同時保留其彎曲的風格。

alt text http://img260.imageshack.us/img260/5458/nodesr.png

回答

8

如果你的圖是不是瘋了滿你不應該需要這個額外的花哨的算法,只是用一些常識。

  1. 覆蓋表面帶有矩形網格,然後找到一個方法來連接到與直線沿着網格線與角度的最低數量框:如果紙箱不在同一網格線和你不無論你在哪裏連接,你都需要一個角度,如果沒有其他節點在之間。如果有例如節點的方式至少需要一個角度。

  2. 作爲更完整圖表的第二步,添加代碼不僅優化最小邊數,而且最小長度的線。如果你的圖表不夠瘋狂,那麼在應用程序響應方面應該很難察覺。

  3. 對於考慮到兩條腿的長度以及檢查表面上其他物體的交叉點的角度,可以在角度範圍內增加眼睛的糖果。我會使用90°圓圈並調整圓的半徑(顯然不是以上所做的) - 對於較長的腿,半徑應該更大。也許你正在使用的工具包可以幫助你。

+1

爲1一個完整的網格可能是沒有必要的,一個漢南網格的點連接和位,以避免應該足夠我認爲 – 2010-03-17 09:43:22

+0

謝謝,我不想重新發明輪子,雖然我相信我們可以都提出了精細調整算法的近似值。我想知道有沒有什麼能夠在一定程度上爲你做到這一點? – ApplePieIsGood 2010-03-17 11:17:26

+1

答案本身引入了一些不平凡的問題來處理(它解釋了一個過程,但缺乏「如何」部分)。是否有「經典」算法來覆蓋它? – gpilotino 2011-04-26 14:11:07

0

您是否知道Graphviz?我不確定佈局算法的「動態」和可重構性,但它可能是一個很好的起點。

0

有沒有真正需要什麼戲劇性超出繪圖直接到笛卡爾座標。簡單的啓發式算法可以用來處理路徑,並且可能在大多數時間內達到最佳的最小角度數,但可能更經常是最短路徑。所有這些都可以根據需要動態地完成,但是在保持圖形精度的同時,不需要更加分散地將屏幕分離出來(像素應該保持最離散的水平),而不需要複雜的算法。

對於疊加層,只需將所有像素設置爲線的顏色,並根據像素是否爲線的一部分將Alpha通道位修改爲透明或不透明。要確定哪些位是該行的一部分需要一些幾何圖形,但是一旦你擁有了一切,這是一塊蛋糕。

要弄清楚如何在Alpha通道上繪製線條,您需要弄清楚線條的樣式。你會做很多事情取決於風格。一種常見的風格是使用水平方向的直線和直角四分之一圓對齊的直線。

對於「避免」算法,當您只想避免代表節點的「盒子」時,這些算法不會太難實現......要將所有線條都消除一點,甚至連Visio都沒有僱傭。爲了避免盒子/節點,使用盒子邊緣之間的中點(例如geo1和geo3之間的垂直邊緣)很適合對稱,然後選擇一個簡單的預定義距離以保持非連接線條(即線條沒有連接到特定的盒子)遠離箱子也運作良好。對此的一種通用算法很簡單,但在這裏描述有點過於冗長,但本質上是一組廣義檢查和開關,用於水平和垂直對齊線和四分之一圈。如果您最終希望得到關於如何做到這一點的更多細節,只需發表評論就可以了。

如果你正在尋找一些已經爲你做的事情,你想要的連接類型和重新安排取決於應用程序,而不是很多人制作低需求或特定需求的工具。顯然這種類型的軟件已經存在,因爲Visio和其他人使用它,但是不管它是否可以作爲開放源代碼或其他免費庫的一部分提供,我不確定。

相關問題