本文提供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);
}