2011-12-18 140 views
3

我正在開發圖形應用程序。在應用程序窗口中有由邊緣連接的頂點。用戶可以移動頂點,並且邊緣也移動。我有問題找到模式來繪製箭頭表示邊緣方向取決於兩個頂點的位置。繪製邊緣方向的算法

下面是一個例子。

可以說頂點有​​邊緣從Vertex1的中心繪製到Vertex2的中心。

Vertex1.position = new Point(0,0); 
Vertex2.position = new Point(100,0); 
Edge.point1 = new Point(10,10); 
Edge.point2 = new Point(110,10); 
//Arrow representing direction from Vertex1 to Vertex2 
Arrow.point1 = new Point(100,10); 
Arrow.point2 = new Point(90,20); 
Arrow.point3 = new Point(90,0); 

問題是:知道邊緣開始/結束點的位置,如何計算箭頭點?

+0

1)定義相對於點(頂部)的徑向項(角度/距離)的箭頭點,2)計算連接頂點的矢量的角度(角度與x或y軸無關), 3)根據你使用的角度,從中增加或減去你的箭頭點角度,4)使用sin和cos,計算每個箭頭(左右)點的頂部箭頭點的x和y偏移量,5)add這些值的頂部箭頭點 – neeKo 2011-12-18 19:44:21

回答

3

假設邊緣的起點座標爲(ax, ay),終點(bx, by),頂點具有半徑w,你的箭有其指針l的箭頭邊緣alpha 之間的長度和角度。然後在僞代碼:

ex := (bx - ax) 
ey := (by - ay) 
ex := ex/sqrt(ex^2 + ey^2) 
ey := ey/sqrt(ex^2 + ey^2) 

箭頭的第一點:

a1x := bx - w * ex 
a1y := by - w * ey 

箭頭的第二點:

a2x := bx - (w + l) * ex + l * tg(alpha/2) * ey 
a2y := by - (w + l) * ey - l * tg(alpha/2) * ex 

箭頭的第三點:

a3x := bx - (w + l) * ex - l * tg(alpha/2) * ey 
a3y := by - (w + l) * ey + l * tg(alpha/2) * ex 

對不起,這種惡劣的格式,我不知道怎麼在這裏用數學的標記。我希望我在計算中不會犯任何錯誤。

+0

謝謝,很好的回答。 – Zaphood 2011-12-18 22:52:34

0

編輯:你沒有指向你的應用程序類型。如果使用WinForms this可能會有用。 Here是關於LineCap的MSDN文章。