示例#1
0
    public static Vector3 ClosestPointToTriangle(Vector3 a, Vector3 b, Vector3 c, Vector3 p)
    {
        var r  = Quaternion.Inverse(Quaternion.LookRotation(-Vector3.Cross(a - b, a - c)));
        var ra = r * a;
        var rb = r * b;
        var rc = r * c;
        var rp = r * p;

        var a2 = D2D_Helper.VectorXY(ra);
        var b2 = D2D_Helper.VectorXY(rb);
        var c2 = D2D_Helper.VectorXY(rc);
        var p2 = D2D_Helper.VectorXY(rp);

        if (PointLeftOfLine(a2, b2, p2) == true)
        {
            return(ClosestPointToLineSegment(a, b, p));
        }

        if (PointLeftOfLine(b2, c2, p2) == true)
        {
            return(ClosestPointToLineSegment(b, c, p));
        }

        if (PointLeftOfLine(c2, a2, p2) == true)
        {
            return(ClosestPointToLineSegment(c, a, p));
        }

        var barycentric = GetBarycentric(a2, b2, c2, p2);

        return(barycentric.x * a + barycentric.y * b + barycentric.z * c);
    }