2011-12-18 212 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文章。