射线法——判断一个点是否在多边形内部(适用于凸多边形和凹多边形)【关键原理解释+文字伪代码】

简介: 射线法——判断一个点是否在多边形内部(适用于凸多边形和凹多边形)【关键原理解释+文字伪代码】

问题介绍

给定一个点和一个多边形(由点集的点依次连接构成),需要判断该点是否在多边形的内部。


方法简述

要判断一个点是否在多边形内部,只需要从点出发,水平向右做一条射线,然后计算射线与多边形的交点数量。若交点数量为偶数,则点在多边形外部;若交点数量为奇数,则点在多边形内部。


计算交点数量

计算交点的方法主要有以下三种:

  1. 射线直接与某一条边相交(非边的端点)
  2. 射线与两条边的交点相交
  3. 射线与一条边有重合片段(边的斜率为0,且y轴坐标与射线的y轴坐标相等)


7a7a632cf5254086b207ec63cb03b1d2.png

图1 交点类型

要判断出上面的左拐、右拐情况,需要借助向量叉乘

图2 判断左右拐

一般多边形可以由一个点集合表示,点集合中的各个点按照顺序相连即可形成多边形



遍历过程

for (int i = 0; i < pointList.size(); i++) {
    //多边形线1(line2):pointI-pointIPlus1; 
    //多边形线2(line3):pointIPlus1-pointIPlus2;
    //多边形线3(line4):pointIPlus2-pointIPlus3
    Point pointI = pointList.get(i);
    Point pointIPlus1 = pointList.get((i + 1) % pointList.size());
    Point pointIPlus2 = pointList.get((i + 2) % pointList.size());
    Point pointIPlus3 = pointList.get((i + 3) % pointList.size());
    if(射线与line2相交){
        直接把相交点数+1
    }eles if(pointIPlus1在射线上面){
        if(pointIPlus2不在射线上面){
            判断是否满足图1的第二种情况,满足则交相交点+1
        }else{
            判断是否满足图1的第三种情况,满足则交相交点+1
        }
    }
}


注意点

图4 不可以+1的情况

目录
相关文章
|
Ubuntu Linux
【Ubuntu】内存不够如何用外接U盘扩容(挂载)
【Ubuntu】内存不够如何用外接U盘扩容(挂载)
|
数据可视化 Linux C#
Visual Studio 高手进阶的 10 个效率与洞察力利器
本文深入解析10个Visual Studio中常被忽视的高级功能与技巧,专为资深开发者设计。内容涵盖性能剖析、调试增强、内存布局查看、自定义调试可视化、条件断点、并行调试、正则搜索、构建管理、热重载突破及WSL2集成等,助你挖掘VS潜能,显著提升开发效率与问题诊断能力,成为真正的VS忍者。
442 0
|
前端开发 Java 数据库连接
一个完整 Java 项目常包含的各层次详解与全面解析
本内容介绍了Java项目的典型分层架构,涵盖开放接口层、终端显示层、Web层、Service层、Manager层、Mapper层及常用辅助层次,如实体层、DTO层、VO层等。通过合理划分各层职责,结合Spring Boot等框架,实现系统的高内聚、低耦合,提升可维护性与扩展性,适用于微服务与MVC架构设计。
1158 0
|
缓存 网络协议 Linux
PCIe 以太网芯片 RTL8125B 的 spec 和 Linux driver 分析备忘
本文详细介绍了 Realtek RTL8125B PCIe 以太网芯片的规格以及在 Linux 中的驱动安装和配置方法。通过深入分析驱动源码,可以更好地理解其工作原理和优化方法。在实际应用中,合理配置和优化驱动程序可以显著提升网络性能和稳定性。希望本文能帮助您更好地使用和管理 RTL8125B,以满足各种网络应用需求。
2067 33
|
定位技术 开发工具 数据安全/隐私保护
GIS数据格式坐标转换(地球坐标WGS84、GCJ-02、火星坐标、百度坐标BD-09、国家大地坐标系CGCS2000)
GIS数据格式坐标转换(地球坐标WGS84、GCJ-02、火星坐标、百度坐标BD-09、国家大地坐标系CGCS2000)
5535 1
|
Kubernetes 架构师 Java
史上最全对照表:大厂P6/P7/P8 职业技能 薪资水平 成长路线
40岁老架构师尼恩,专注于帮助读者提升技术能力和职业发展。其读者群中,多位成员成功获得知名互联网企业的面试机会。尼恩不仅提供系统化的面试准备指导,还特别针对谈薪酬环节给予专业建议,助力求职者在与HR谈判时更加自信。此外,尼恩还分享了阿里巴巴的职级体系,作为行业内广泛认可的标准,帮助读者更好地理解各职级的要求和发展路径。通过尼恩的技术圣经系列PDF,如《尼恩Java面试宝典》等,读者可以进一步提升自身技术实力,应对职场挑战。关注“技术自由圈”公众号,获取更多资源。
|
算法
空间判断点是否在线段上
空间判断点是否在线段上
439 0
|
Python
Python——pip安装weditor失败
Python——pip安装weditor失败
378 0
|
消息中间件 Java Spring
Spring Boot与NATS消息系统的集成方法
Spring Boot与NATS消息系统的集成方法

热门文章

最新文章