You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现判断点是否在三角形内的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;
}

逻辑说明

  1. 叉积的几何意义:二维叉积的结果符号代表两个向量的相对方向——正表示逆时针,负表示顺时针,0表示共线。
  2. 对于三角形的每条边,我们把边看作从一个顶点指向另一个顶点的向量,再计算该顶点到目标点的向量与边向量的叉积。如果点在三角形内部,那么它相对于三条边的方向应该是一致的(要么都在每条边的左侧,要么都在右侧);如果点在边上,对应那条边的叉积为0。

内容的提问来源于stack exchange,提问作者Oleg L.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.10 14:12:02