博客
关于我
java判断某个点是否在所画范围内(多边形)
阅读量:794 次
发布时间:2023-01-28

本文共 2732 字,大约阅读时间需要 9 分钟。

判断点是否在多边形内

这是一种常见的计算几何问题,可以通过算法判断给定点是否位于任意多边形内。以下是实现该功能的Java代码,以及基于该算法的示例测试。

代码逻辑说明

此算法基于“叉积判断”方法,即通过计算点与多边形边的交叉点数来确定点的位置关系。具体来说:

  • 初始化必要变量,包括交叉点计数器和边界点标志
  • 遍历多边形的每一条边,检查点相对于边的位置
  • 如果点在边上或是顶点上,则直接返回true
  • 若点位于多边形外部,则返回false
  • 根据交叉点数的奇偶性,确定点的位置
  • 代码实现

    public static boolean IsPtInPoly(Point2D point, List
    pts) { 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("点在多边形外"); } }

    总结

    通过上述代码及测试案例,可以方便地判断任意给定点是否位于多边形内。该算法在保持简洁的同时,具备较高的准确性和效率,是解决实际问题的有效方法。

    转载地址:http://vjryk.baihongyu.com/

    你可能感兴趣的文章
    element-plus的el-date-picker日期范围选择控件,根据开始日期限定结束日期的可选范围为开始日期到开始日期+30天
    查看>>
    18 个一线工作中常用 Shell 脚本【实用版】
    查看>>
    element-ui:el-input输入数字-整数和小数
    查看>>
    ElementUI-el-progress改变进度条颜色跟文字样式
    查看>>
    element事件(change,click)不触发
    查看>>
    ELK原理与介绍(转)
    查看>>
    ELK学习笔记(三)单台服务器多节点部署
    查看>>
    ELK应用日志收集实战
    查看>>
    elTable火狐浏览器换行
    查看>>
    15个Python数据处理技巧(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    2023年深信服、奇安信、360等大厂网络安全校招面试真题合集(附答案),让你面试轻松无压力!
    查看>>
    2024年全国程序员平均薪资排名:同样是程序员,为什么差这么多?零基础到精通,收藏这篇就够了
    查看>>
    0基础成功转行网络安全工程师,年薪30W+,经验总结都在这(建议收藏)
    查看>>
    100个电脑常用组合键大全(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>
    10个程序员可以接私活的平台
    查看>>
    10个运维拿来就用的 Shell 脚本,用了才知道有多爽,零基础入门到精通,收藏这一篇就够了
    查看>>
    10条sql语句优化的建议
    查看>>
    10款宝藏编程工具!新手必备,大牛强烈推荐! 从零基础到精通,收藏这篇就够了!
    查看>>
    10款最佳免费WiFi黑客工具(附传送门)零基础入门到精通,收藏这一篇就够了
    查看>>
    15个Python数据分析实用技巧(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>