检查两条线是否几乎平行会产生错误的结果

Vah*_*hid 0 c# geometry line

我正在使用以下等式来查找两条线是否平行.但是当线条几乎平行并最终在远处相遇时,我遇到了问题.我想要一个将这两条几乎平行的线视为平行的方程式.

var la = new Line {X1 = 1005, Y1 = 773, X2 = 1202, Y2 = 1198};
var lb = new Line {X1 = 1239, Y1 = 1181, X2 = 1550, Y2 = 1856};

var d = (lb.Y2 - lb.Y1) * (la.X2 - la.X1) - (lb.X2 - lb.X1) * (la.Y2 - la.Y1);
if (Math.Abs(d) < 0.001)
{
    // Return if lines are parallel
}
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,上面的公式d得出的数字远远大于0.我在这里错了什么?我使用了错误的等式吗?

我正在使用这篇文章:http: //paulbourke.net/geometry/pointlineplane/

Nic*_*ler 6

斜坡很难比较.具有斜面7和8的两条线与具有斜面1和2的两条线彼此更接近,尽管斜率差总是相同的.

相反,我们应该比较可以用点积计算得到的角度:

dx1 = la.X2 - la.X1
dy1 = la.Y2 - la.Y1
dx2 = lb.X2 - lb.X1
dy2 = lb.Y2 - lb.Y1
cosAngle = abs((dx1 * dx2 + dy1 * dy2) / sqrt((dx1 * dx1 + dy1 * dy1) * (dx2 * dx2 + dy2 * dy2)))
Run Code Online (Sandbox Code Playgroud)

如果线是完全平行(或反平行),cosAngle则将为1.它将减少两条线之间的角度的余弦.因此,如果线之间存在10°的角度,cosAngle则为0.9848.您可以指定一个任意阈值,在该阈值之上,行被视为平行.然后

if(cosAngle > threshold) //threshold = cos(threshold angle)
    // parallel or anti-parallel
else
    // not parallel 
Run Code Online (Sandbox Code Playgroud)

如果你想区分反平行度,请abs离开.那么负值代表反平行性.

  • 反平行意味着一个矢量指向一个方向而另一个指向相反方向.它通常与线路无关(因为它们没有前向和后向),因此可以假定反并行性是平行的 (2认同)