如何确定GDI +中两条线的交点?

Rob*_* S. 2 .net c# graphics geometry gdi+

我正在使用.NET来创建一个具有绘图表面的应用程序,类似于Visio.UI使用Graphics.DrawLine连接屏幕上的两个对象.这个简单的实现工作正常,但随着表面变得更复杂,我需要一种更健壮的方式来表示对象.这些强大要求之一是确定两条线的交叉点,因此我可以通过某种图形来指示分离.

所以我的问题是,有人可以提出一种方法吗?也许使用不同的技术(可能是GraphViz)或算法?

Chr*_*son 9

由y = mx + c表示的线对于计算机图形是有问题的,因为垂直线要求m是无穷大的.

此外,计算机图形中的线条具有起点和终点,而不像数学线条在范围上是无限的.如果交叉点位于所讨论的两个线段上,则通常只对线交叉感兴趣.

如果你有两个线段,一个从向量x1到x1 + v1,一个从向量x2到x2 + v2,那么定义:

a = (v2.v2 v1.(x2-x1) - v1.v2 v2.(x2-x1)) / ((v1.v1)(v2.v2) - (v1.v2)^2)
b = (v1.v2 v1.(x2-x1) - v1.v1 v2.(x2-x1)) / ((v1.v1)(v2.v2) - (v1.v2)^2)
Run Code Online (Sandbox Code Playgroud)

其中,对于矢量p =(px,py),q =(qx,qy),pq是点积(px*qx + py*qy).首先检查(v1.v1)(v2.v2)=(v1.v2)^ 2 - 如果是,则线是平行的并且不交叉.

如果它们不是平行的,那么如果0 <= a <= 1且0 <= b <= 1,则交点位于两个线段上,并由点给出

x1 + a * v1
Run Code Online (Sandbox Code Playgroud)

编辑 a和b的等式的推导如下.交点满足矢量方程

x1 + a*v1 = x2 + b*v2
Run Code Online (Sandbox Code Playgroud)

通过采取这一方程的点积用v1,并用v2,我们得到两个等式:

v1.v1*a - v2.v1*b = v1.(x2-x1)
v1.v2*a - v2.v2*b = v2.(x2-x1)
Run Code Online (Sandbox Code Playgroud)

它形成了a和b的两个线性方程.求解该系统(通过将第一个等式乘以v2.v2,将第二个等式乘以v1.v1并减去或以其他方式)得到a和b的等式.