如何判断点是否在多边形内?附相关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
相关产品推荐
相关产品推荐

