绘制边缘方向的算法

本文关键字:算法 方向 边缘 绘制 | 更新日期: 2023-09-27 18:18:08

我正在开发图形应用程序。在应用程序窗口中,有由边连接的顶点。用户可以移动顶点,同时边也会移动。我有问题,找到模式来绘制箭头表示边缘方向取决于两个顶点的位置。

下面是一个例子。

假设顶点为width/height = 20px;,边从顶点1的中心绘制到顶点2的中心

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);

问题是:知道边的起始点/结束点的位置,如何计算箭头点?

绘制边缘方向的算法

假设边的起点坐标为(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

很抱歉格式这么差,我不知道如何在这里使用数学标记。我希望我没有在计算中犯任何错误。

EDIT:您没有指出您的应用程序类型。如果你使用的是WinForms,这可能会很有用。这是MSDN关于LineCap的文章