相交 - 点是否在三角形内 - 同侧法
同侧法
点p在三角形三条边的同侧时,点p在三角形内。可以通过叉乘结果是否都为正或负来判断是否同侧
1) 三角形顶点逆时针时
1-a) ab与ap, bc与bp, ca与cp的夹角均为右手逆时针锐角,sin(锐角)>0,即:叉乘结果>0,此时p在三角形内。
1-b) bc与bp的夹角为0度,sin(0)=0,即:叉乘结果=0,此时p在三角形内。
1-c) bc与bp的夹角为右手顺时针锐角,sin(-锐角)<0,即叉乘结果<0,而ab与ap, ca与cp的夹角均为右手逆时针180度内(叉乘结果>0),符号不一致所以p在三角形外。
2) 三角形顶点为顺时针时
2-a) ab与ap, bc与bp, ca与cp的夹角均为右手顺时针锐角,sin(-锐角)<0,即:叉乘结果<0,此时p在三角形内。
2-b),2-c)与上面类似
//点是否在三角形内 public static bool IsPointInTriangle(Vector2 p, Vector2 a, Vector2 b, Vector2 c) { //确定顶点是顺时针还是逆时针 var ab = b - a; var ac = c - a; float cross = V2Cross(ref ab, ref ac); var ap = p - a; if (V2Cross(ref ab, ref ap) * cross < 0) return false; var bc = c - b; var bp = p - b; if (V2Cross(ref bc, ref bp) * cross < 0) return false; var ca = a - c; var cp = p - c; if (V2Cross(ref ca, ref cp) * cross < 0) return false; return true; } public static float V2Cross(ref Vector2 a, ref Vector2 b) { float result = a.x * b.y - a.y * b.x; return result; }
内角和法
如果∠pab+∠pba+∠pbc+∠pcb+∠pca+∠pac等于180度,则p在三角形内;否则不在三角形内。
效率较低,这边没有实现。
投影法判断(待写)
参考
【数学基础】玩法常用几何计算汇总 - 知乎 (zhihu.com)