简单的集大家之长总结了已验证work的方法
分三种情况
通过计算向量AP在向量AB上的投影判断属于哪种情况
public float DistPointSegment(Vector3 p, Vector3 s1, Vector3 s2, out Vector3 objP)
{
Vector3 ab = s2 - s1;
Vector3 ap = p - s1;
float r = Vector3.Dot(ab, ap) / ab.LengthSquared;
if (r <= 0)
{
objP = s1;
return ap.Length;
}
if (r >= 1)
{
objP = s2;
Vector3 bp = s2 - p;
return bp.Length;
}
Vector3 projP = Vector3.Dot(ab, ap) / ab.Length * Vector3.Normalize(ab);
objP = projP + s1;
return Vector3.Cross(ab, ap).Length / ab.Length;
}
参考: