0

对于两条线或两条路径或两个点列表作为 WPF 和 c# 中的形状,有没有人知道如何检测交叉点并将交叉点绘制成圆形以使眼睛清楚地看到这两条线没有连接( MS visio 之类的)?我只需要这样做的原理,尽管一些代码会有所帮助。谢谢。

4

2 回答 2

1

这个相关问题,基本上你可以认为你的线段是一个点和一个向量的组合。您可以通过选择一个作为“原点”并从另一个点的 X 和 Y 中减去其 X 和 Y,从而产生“增量”,从而在此表格中得到两个点。对另一条线段执行相同的操作。

现在,如果这两个向量交叉,将有两个标量可以应用,一个用于每个向量,以生成一个较短的向量,该向量与相应的向量共线,并将表示原点和 Y 之间的 X 和 Y 的增量十字路口。这些标量可以通过两个向量的叉积函数找到;有关确切的数学,请参阅相关问题。最后,为了使两条线段相交,相交的向量必须在其原始定义的长度内进行;也就是说,表示向量到交点的长度的两个标量都必须是0 < s < 1

于 2012-09-10T20:28:20.623 回答
1

有一种使用齐次坐标的方法可以轻松获得您想要的东西。要表示一个点,请P1使用 aVector3并使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

于 2012-09-10T20:47:39.753 回答