我正在使用以下等式来查找两条线是否平行.但是当线条几乎平行并最终在远处相遇时,我遇到了问题.我想要一个将这两条几乎平行的线视为平行的方程式.
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/
斜坡很难比较.具有斜面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离开.那么负值代表反平行性.