如何实现判断点是否在三角形内的inTriangle方法?
实现
inTriangle方法的简洁思路 要判断点是否在三角形内部或边界上,最直观简洁的思路是利用叉积的符号一致性来实现:
- 核心逻辑:对于三角形的三条边,分别计算边向量与边到目标点的向量的叉积。如果三个叉积的符号全部相同(全正或全负),说明点在三角形内部;如果其中任意一个叉积为0,说明点在三角形的某条边上。满足这两种情况都返回
true,否则返回false。
具体实现代码(以Java为例)
假设Point类包含x和y两个浮点型属性:
public boolean inTriangle(Point p, Point tr1, Point tr2, Point tr3) { // 计算三个叉积 double cross1 = crossProduct(tr2.x - tr1.x, tr2.y - tr1.y, p.x - tr1.x, p.y - tr1.y); double cross2 = crossProduct(tr3.x - tr2.x, tr3.y - tr2.y, p.x - tr2.x, p.y - tr2.y); double cross3 = crossProduct(tr1.x - tr3.x, tr1.y - tr3.y, p.x - tr3.x, p.y - tr3.y); // 判断叉积符号是否一致,或存在0(在边上) boolean hasPositive = (cross1 > 0) || (cross2 > 0) || (cross3 > 0); boolean hasNegative = (cross1 < 0) || (cross2 < 0) || (cross3 < 0); // 没有同时存在正负,说明要么全同号(内部),要么有0(边界) return !(hasPositive && hasNegative); } // 辅助方法:计算二维叉积 private double crossProduct(double ax, double ay, double bx, double by) { return ax * by - ay * bx; }
逻辑说明
- 叉积的几何意义:二维叉积的结果符号代表两个向量的相对方向——正表示逆时针,负表示顺时针,0表示共线。
- 对于三角形的每条边,我们把边看作从一个顶点指向另一个顶点的向量,再计算该顶点到目标点的向量与边向量的叉积。如果点在三角形内部,那么它相对于三条边的方向应该是一致的(要么都在每条边的左侧,要么都在右侧);如果点在边上,对应那条边的叉积为0。
内容的提问来源于stack exchange,提问作者Oleg L.
相关产品推荐
相关产品推荐

