确定一个点是否在一条线上的两个其他点之间

时间:2017-03-17 22:44:24

标签: c# unity3d

我一直试图弄清楚如何检查一个点是否在同一条线上以及两个其他点之间。如果直线是对角的,但如果直线垂直或水平直线,则它似乎有效。

这是我的方法:

public bool isBetween(Vector3 C, Vector3 A, Vector3 B)
{
    Vector3 sum = Vector3.Cross(A,B) + Vector3.Cross(A,C) + Vector3.Cross(B,C);

    if (sum.x == 0 && sum.z == 0 && sum.y == 0)
    {
        Vector3 min = Vector3.Min(A, B);
        Vector3 max = Vector3.Max(A, B);

        // only checking 2 dimensions
        if (C.x > min.x && C.x < max.x && C.z > min.z && C.z < max.z)
        {
            return true;
        }
    }
    return false;
}

适用于某些情况但不适用于所有情况的100%。不确定如何修复它以使其正常工作。

1 个答案:

答案 0 :(得分:3)

假设point1和point2不同,首先检查点是否在线上。为此你只需要一个矢量point1 - &gt;的“交叉产品”。 currPoint和point1 - &gt;点2。

dxc = currPoint.x - point1.x;
dyc = currPoint.y - point1.y;

dxl = point2.x - point1.x;
dyl = point2.y - point1.y;

cross = dxc * dyl - dyc * dxl;

当且仅当交叉等于零时,你的观点才在线上。

if (cross != 0)
 return false;

现在,如你所知,这一点确实存在于线上,是时候检查它是否位于原始点之间。这可以通过比较x坐标,如果线“比水平更垂直”,或者y坐标

轻松完成。
if (abs(dxl) >= abs(dyl))
 return dxl > 0 ? 
   point1.x <= currPoint.x && currPoint.x <= point2.x :
   point2.x <= currPoint.x && currPoint.x <= point1.x;
else
 return dyl > 0 ? 
   point1.y <= currPoint.y && currPoint.y <= point2.y :
   point2.y <= currPoint.y && currPoint.y <= point1.y;

注意,如果输入数据是整数,则上述算法如果完全是整数,即它不需要整数输入的浮点计算。在计算交叉时要小心潜在的溢出。

P.S。该算法绝对精确,这意味着它将拒绝非常接近线但不精确在线上的点。有时这不是我们需要的。但那是一个不同的故事。