线交叉点

时间:2012-09-10 20:15:05

标签: c# wpf graphics intersection shapes

对于WPF和c#中的两条线或两条路径或两个点列表作为形状,是否有人知道如何检测交叉点并以圆角形状绘制交点,以使眼睛清楚地知道这两条线是没连接(MS visio喜欢)? 我只需要这样做的原则,虽然一些代码会有所帮助。感谢。

2 个答案:

答案 0 :(得分:1)

this related question开始,基本上您可以将线段视为点和矢量的组合。通过选择一个作为“原点”并从另一个点的X和Y中减去其X和Y,可以得到这个形式的两个点,产生“delta”。对其他线段执行相同操作。

现在,如果这两个向量交叉,将会有两个可应用的标量,每个向量一个,以生成一个与相应向量共线的较短向量,并表示X和Y之间的三角形。起源和交叉点。这些标量可以通过两个载体的叉积的函数找到;查看相关问题的确切数学。最后,为了使两个线段相交,相交的矢量必须在其原始定义的长度内这样做;也就是说,表示交叉点向量长度的两个标量必须为0 < s < 1

答案 1 :(得分:1)

有一种方法可以使用齐次坐标轻松获得您想要的效果。要表示点P1,请使用Vector3并使z坐标等于1.

P1 = [x1, y1, 1]
P2 = [x2, y2, 1]

连接这两个点的线是L12 = CROSS(P1,P2) = [a, b, c],其中CROSS是矢量叉积,线的等式是a*x+b*y+c=0

现在,如果你有两行

L12 = [a,b,c]
L34 = [e,f,g]

这两条线的交点是Q = CROSS(L12,L34) = [qx,qy,qw],坐标为

x = qx/qw
y = qy/qw

示例:两行,L12将点(1,1)连接到(2,8),将L34连接点(4,-2)连接到(9,3)。找到两条线的交点。

L12 = CROSS( [1,1,1], [2,8,1] ) = [-7, 1, 6]     //eq: -7*x+y+6=0
L34 = CROSS( [4,-2,1], [9,3,1] ) = [-5, 5, 30]   //eq: -5*x+5*y+30=0
Q = CROSS([-7,1,6], [-5,5,30]) = [0, 180, -30]
x = 0/(-30) = 0
y = 180/(-30) = -6

GeoGebra截图: GeoGebra4