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

时间:2014-06-02 07:30:33

标签: 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
}

令我惊讶的是,d的上述等式导致数字远大于0。 我在这里错了什么?我使用了错误的等式吗?

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

1 个答案:

答案 0 :(得分: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)))

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

if(cosAngle > threshold) //threshold = cos(threshold angle)
    // parallel or anti-parallel
else
    // not parallel 

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