我使用以下等式来查找两条线是否平行。但是当线条几乎平行并最终在远处相遇时,我遇到了问题。 我想要一个将这两条几乎平行的线视为平行的方程式。
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。
我在这里错了什么?我使用了错误的等式吗?
答案 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
。那么负值代表反平行性。