博客
关于我
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/

    你可能感兴趣的文章
    2025版最新0基础怎么转行网络安全?零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新Bash Shell入门指南,零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新C++快速入门(适合小白)零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新CTF选手必藏的50个实战解题思路,零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新Java教程(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新Kali Linux渗透测试教程(全面详细)零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新LangChain框架快速入门,零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新Metasploit安装使用教程(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    2025版最新Nessus 工具介绍与使用教程,零基础入门到精通,收藏这一篇就够了
    查看>>
    2025版最新wireshark怎么抓包?Wireshark入门指南,零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新一文彻底搞懂大模型 - Agent(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新关于HW护网行动的一些知识,零基础入门到精通,收藏这篇就够了
    查看>>
    (建议收藏)2024最新 URL Scheme大全APP跳转界面地址更新中 ios快捷指令快捷方式链接跳转微信小程序必备autojs可用免root (可定制开发和提取URL Scheme 参数提取)
    查看>>
    2025版最新大模型学习路线,零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新大模型开发流程(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    (干货)数据分析案例--以上海二手房为例
    查看>>
    (大部分安卓手机通用)一加OnePlus Ace3扬声器优化教程 外放直接媲美苹果
    查看>>
    2025版最新大模型微调方法(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新大模型算法岗位薪资指南,零基础入门到精通,收藏这一篇就够了
    查看>>
    2025版最新大语言模型的指令微调,零基础入门到精通,收藏这篇就够了
    查看>>