2020-01-09 14:51:29
如何高效的判断一个点是否是包含在一个三角形的内部是计算几何里的一个基础问题。
In Triangle Test问题也可以用来解决计算几何里的一个基础问题就是 凸包问题 。
问题描述:
给出一个点s,判断其是否在一个三角形(p, q, r)内部。
问题求解:
判断一个点是否在三角形内部等价于对于三条边分别做To left test的结果一致。
那么现在的问题就是如何高效和精确的实现To left test。
关于这个可以使用空间坐标系的海伦公式来求解。
| p.x p.y 1 |
2 * S = | q.x q.y 1 |
| s.x s.y 1 |
并且这个公式是有向的,当三个点是逆时针排列的时候该行列式的返回结果是正数,当三个点是顺时针排列的时候行列式的返回结果是负数。
bool to_left_test(int[] p, int[] q, int[] s) { return area2(p, q, s) > 0; } int area2(int[] p1, int[] p2, int[] p3) { return p1[0] * p2[1] + p1[1] * p3[0] + p2[0] * p3[1] - p2[1] * p3[0] - p1[1] * p2[0] - p1[0] * p3[1]; }
To left test 几乎贯穿了整个计算几何,不仅是计算凸包的核心,也是很多其他计算几何问题的关键算法。
例如:判断两条线段是否相交,只需要做4次to left test即可。