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

如何判断点是否在多边形内?附相关Java实现代码咨询

如何判断一个点是否位于多边形内部?

判断点是否在多边形内部最常用的方案是射线法(Ray Casting Algorithm),核心逻辑很直观:从目标点向任意方向(通常选向右)发射一条射线,统计这条射线与多边形边的交点数量——如果是奇数,说明点在多边形内部;偶数则在外部。

下面是完整的Java实现代码(基于你提供的片段补全):

import java.util.List;

class Point {
    private double x;
    private double y;

    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }
}

class Polygon {
    private List<Point> points;

    public Polygon(List<Point> points) {
        this.points = points;
    }

    @Override
    public boolean contains(Point aPoint) {
        int j = points.size() - 1;
        boolean oddNodes = false;

        for (int i = 0; i < points.size(); i++) {
            Point pI = points.get(i);
            Point pJ = points.get(j);

            // 检查当前边是否跨越了目标点的y轴范围(射线可能与之相交)
            if ((pI.getY() < aPoint.getY() && pJ.getY() >= aPoint.getY())
                || (pJ.getY() < aPoint.getY() && pI.getY() >= aPoint.getY())) {
                // 计算射线与边的x轴交点位置
                double xIntersect = (aPoint.getY() - pI.getY()) * (pJ.getX() - pI.getX()) / (pJ.getY() - pI.getY()) + pI.getX();
                // 仅当交点在目标点右侧时,切换奇偶标记
                if (aPoint.getX() < xIntersect) {
                    oddNodes = !oddNodes;
                }
            }
            j = i; // 更新j为当前i的位置,准备下一轮循环
        }

        return oddNodes;
    }
}

算法关键细节说明:

  • 遍历多边形的每一条边:通过i和j交替,j始终是i的前一个点,形成闭环遍历所有边
  • 先做范围过滤:判断边是否跨越了目标点的y坐标,避免无效计算
  • 交点有效性判断:只有当交点在目标点右侧时,才计入统计(因为射线是向右发射的)
  • 结果判定:最终根据奇偶标记返回,奇数代表点在内部,偶数代表外部

补充:这个算法支持凹多边形,但默认不处理「点刚好在多边形边上」的边界场景,如果需要覆盖这种情况,还需要额外添加边的包含判断逻辑。

内容的提问来源于stack exchange,提问作者fwefwf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:30:32