计算几何,判断点在三角形内的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

/// <summary>
 /// 这个方法输入的时候就要保证输入点和三角形是在同一个平面的,否则需要自己对点进行处理
 /// </summary>
 /// <param name="P"></param>
 /// <param name="A"></param>
 /// <param name="B"></param>
 /// <param name="C"></param>
 /// <returns></returns>
 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);
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值