C# 检查两条线是否几乎平行会给出错误的结果

C# 检查两条线是否几乎平行会给出错误的结果,c#,geometry,line,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 -

我用下面的等式来确定两条线是否平行。但当两条线几乎平行并最终在远处相遇时,我遇到了问题。 我想要一个方程,它认为这两条几乎平行的线是平行的

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。 我怎么会在这里出错?我用错方程式了吗

我正在使用这篇文章:
坡度很难比较。坡度为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)))
如果直线完全平行或反平行,则余角为1。它将减少两条线之间夹角的余弦。因此,如果两条线之间的夹角为10°,则cosAngle将为0.9848。您可以指定一个任意阈值,在该阈值以上的线被视为平行线。然后

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

如果你想区分反平行性,把abs放在一边。那么负值代表反并行性。

这里的数据类型是什么?int、double、decimal或其他类型?不要乘、除!并通过0检查Div@Damien_不相信数据类型是双重的。我认为你的公式不正确。。。您应该计算每条线的坡度并进行比较。看看这篇文章:是的,这些都是特殊情况,必须单独处理;这是免费的Div by 0测试!谢谢尼科,什么是反平行?你是说几乎平行?反平行意味着一个向量指向一个方向,另一个指向相反的方向。它通常与直线无关,因为它们没有向前和向后,所以反平行性可以假定为平行的