计算几何,判断点在三角形内的2个方法

本文提供2个判断点在三角形内的方法

  • 是我编写帧同步寻路方案时留下的资料

方法1

  • 根据<<计算机图形几何工具算法详解>>一书实现
  • 本方法方便使用定点数改造,我已经实现了对应定点数的方法,准确可用
public static bool IsPointInTriangle(Vector2 P, Vector2 V0, Vector2 V1, Vector2 V2)
{
    var e0 = V1 - V0;
    var e1 = V2 - V1;
    var e2 = V0 - V2;

    //对应的垂直向量
    var n0 = new Vector2(e0.y, -e0.x);
    var n1 = new Vector2(e1.y, -e1.x);
    var n2 = new Vector2(e2.y, -e2.x);

    var c0 = -Vector2.Dot(n1, P - V1) / Vector2.Dot(n1, e0);
    var c1 = -Vector2.Dot(n2, P - V2) / Vector2.Dot(n2, e1);
    var c2 = -Vector2.Dot(n0, P - V0) / Vector2.Dot(n0, e2);

    var cAll = c0 + c1 + c2;

    return Mathf.Approximately(cAll,1) 
           && 0 <= c0 && c0 <= 1 && 0 <= c1 && c1 <= 1 && 0 <= c2 && c2 <= 1;
}

方法2

  • 参考链接
  • 这个方法不方便做定点数改造
/// 
 /// 这个方法输入的时候就要保证输入点和三角形是在同一个平面的,否则需要自己对点进行处理
 /// 
 /// 
 /// 
 /// 
 /// 
 /// 
 public static bool IsPointInTriangle(Vector3 P, Vector3 A, Vector3 B, Vector3 C)
 {
     // Compute vectors        
     var v0 = C - A;
     var v1 = B - A;
     var v2 = P - A;

     // Compute dot products
     var dot00 = Vector3.Dot(v0, v0);
     var dot01 = Vector3.Dot(v0, v1);
     var dot02 = Vector3.Dot(v0, v2);
     var dot11 = Vector3.Dot(v1, v1);
     var dot12 = Vector3.Dot(v1, v2);

     // Compute barycentric coordinates
     var invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
     var u = (dot11 * dot02 - dot01 * dot12) * invDenom;
     var v = (dot00 * dot12 - dot01 * dot02) * invDenom;

     // Check if point is in triangle
     return (u >= 0) && (v >= 0) && (u + v < 1);
 }

你可能感兴趣的:(游戏中的物理引擎,几何计算)