
java判断某个点是否在所画范围内(多边形)
初始化必要变量,包括交叉点计数器和边界点标志 遍历多边形的每一条边,检查点相对于边的位置 如果点在边上或是顶点上,则直接返回true 若点位于多边形外部,则返回false 根据交叉点数的奇偶性,确定点的位置
发布日期:2025-04-02 00:52:16
浏览次数:11
分类:精选文章
本文共 2732 字,大约阅读时间需要 9 分钟。
判断点是否在多边形内
这是一种常见的计算几何问题,可以通过算法判断给定点是否位于任意多边形内。以下是实现该功能的Java代码,以及基于该算法的示例测试。代码逻辑说明
此算法基于“叉积判断”方法,即通过计算点与多边形边的交叉点数来确定点的位置关系。具体来说:
代码实现
public static boolean IsPtInPoly(Point2D point, Listpts) { int N = pts.size(); boolean boundOrVertex = true; int intersectCount = 0; double precision = 2e-10; Point2D p1 = pts.get(0); Point2D p = new Point2D(testX, testY); for (int i = 1; i <= N; ++i) { if (p.equals(p1)) { return boundOrVertex; } Point2D p2 = pts.get(i % N); if (p.x < Math.min(p1.x, p2.x) || p.x > Math.max(p1.x, p2.x)) { p1 = p2; continue; } if (p.x > Math.min(p1.x, p2.x) && p.x < Math.max(p1.x, p2.x)) { if (p.y <= Math.max(p1.y, p2.y)) { if (p1.x == p2.x && p.y >= Math.min(p1.y, p2.y)) { return boundOrVertex; } if (p1.y == p2.y) { if (p1.y == p.y) { return boundOrVertex; } else { ++intersectCount; } } else { double xinters = (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y; if (Math.abs(p.y - xinters) < precision) { return boundOrVertex; } if (p.y < xinters) { ++intersectCount; } } } else { if (p.x == p2.x && p.y <= p2.y) { Point2D p3 = pts.get((i+1) % N); if (p.x >= Math.min(p1.x, p3.x) && p.x <= Math.max(p1.x, p3.x)) { ++intersectCount; } else { intersectCount += 2; } } } } p1 = p2; } return intersectCount % 2 == 0 ? false : true; } ### 测试案例 为了验证该算法的准确性,可以编写以下测试用例: ```java public static void main(String[] args) { Point2D point = new Point2D(116.404072, 39.916605); List pts = new ArrayList<>(); pts.add(new Point2D(116.395, 39.910)); pts.add(new Point2D(116.394, 39.914)); pts.add(new Point2D(116.403, 39.920)); pts.add(new Point2D(116.402, 39.914)); pts.add(new Point2D(116.410, 39.913)); if (IsPtInPoly(point, pts)) { System.out.println("点在多边形内"); } else { System.out.println("点在多边形外"); } }
总结
通过上述代码及测试案例,可以方便地判断任意给定点是否位于多边形内。该算法在保持简洁的同时,具备较高的准确性和效率,是解决实际问题的有效方法。
发表评论
最新留言
不错!
[***.144.177.141]2025年05月06日 15时02分05秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
我用wxPython搭建GUI量化系统之最小架构的运行
2019-03-07
selenium+python之切换窗口
2019-03-07
map[]和map.at()取值之间的区别
2019-03-08
VTK:可视化之RandomProbe
2019-03-09
Java时间
2019-03-09
【编程】C语言入门:1到 100 的所有整数中出现多少个数字9
2019-03-09
pair的用法
2019-03-09
javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
2019-03-11
echarts 基本图表开发小结
2019-03-11
TreeSet、TreeMap
2019-03-11
JVM内存模型
2019-03-11
可变长度参数
2019-03-11
GitHub上传时,项目在已有文档时直接push出现错误解决方案
2019-03-11
嵌入式系统试题库(CSU)
2019-03-12
00010.02最基础客户信息管理软件(意义类的小项目,练习基础,不涉及数据库)
2019-03-12
00013.05 字符串比较
2019-03-12
UE4 错误列表 error码(只记录我遇到的情况,持续添加,未完成)
2019-03-13