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