碰撞检测:判断点是否在多边形内部

2024-02-04 10:48

本文主要是介绍碰撞检测:判断点是否在多边形内部,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee

本文demo演示:
在这里插入图片描述

基本判断原理:

判断一个点是否在一个多边形中,有一个简单的做法:
从这个点发射一条射线,统计射线与多边形

有多少条边相交,
奇数表示点在多边形内,偶数表示点不在多边形内。
为了简化计算,射线是水平的。

如下图所示:
在这里插入图片描述

点 A 水平向右的射线有 5 个交点,奇数,A在多边形内。
点 B 水平向右的射线有 2 个交点,偶数,B 在多边形外部。

如果一个点在多边形内,穿过这个点的水平直线,点左边的相交点个数是奇数,点右边的相交点是奇数。
算法只要统计点的一侧(左边或者右边)的相交点个数即可。

特殊情况:

  • 射线穿过的是多边形的顶点,射线交点和多边形顶点重合。

如图:
在这里插入图片描述

点 A 的射线穿过多边形的一个顶点,这应该视为穿过了多边形的一条边,只有一个交点。
为了防止被判断为穿过了多边形的2条边,有如下做法:
可以规定与测试点y重叠的顶点要么在y上面空间,要么在y下面空间。
具体做法之一:如果测试点的y轴小于线段最小y值的顶点,就认为不相交。
也就是说,让2个相邻的线段的交点不重叠,一个线段占用顶点的位置,一个线段让出顶点的位置。

  • 射线穿过多个多边形的顶点

如图:
在这里插入图片描述
点 A 和多边形一条边相交,然后和2个顶点相交。
这种情况,要判断交点的2条线段,是否是都同时在点A的一侧,上面或者下面,如果都在一侧,可以认为没相交。

  • 射线穿过一个交点和一条边平行再穿过一个交点

如图:
在这里插入图片描述

  • 多边形多条边排成一个直线,射线穿过这个直线。

如图:
在这里插入图片描述

射线交点法的问题是,有很多特殊情况,要做特殊处理。
本文暂且不介绍所有特殊情况的处理。^_^
简单起见,可以再投一条射线检测另一个方向的情况。增大正确判断的概率。

demo工程下载:

本工程是 cocos creator 写的,只考虑了简单的穿越顶点的问题,其他特殊情况暂未考虑。
下载地址:https://download.csdn.net/download/stevenkylelee/10981923

这篇关于碰撞检测:判断点是否在多边形内部的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/677235

相关文章

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

JavaScript全屏,监听页面是否全屏

在JavaScript中,直接监听浏览器是否进入全屏模式并不直接支持,因为全屏API主要是关于请求和退出全屏模式的,而没有直接的监听器可以告知页面何时进入或退出全屏模式。但是,你可以通过在你的代码中跟踪全屏状态的改变来模拟这个功能。 以下是一个基本的示例,展示了如何使用全屏API来请求全屏模式,并在请求成功或失败时更新一个状态变量: javascriptlet isInFullscreen =

改变背景颜色+碰撞检测

1.让类继承CCLayerColor比如 class HelloWorld:public cocos2d::CCLayerColor{ public : 在.cpp文件中 bool HelloWorld::init(){ if(!CCLayerColor::initWithColor(ccc4(255,255,255,25

【Python如何输入升高和体重判断你是偏胖还是偏瘦】

1、求体质指数得Python代码如下: # BMI(Body Mass Index)指数:简称体质指数,# 是国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。# 常用指标:BMI<18.5 偏瘦 18.5<=MBI<=24 正常 MBI>24 偏胖# 计算公式:BMI=体重kg/身高的平方ma = eval(input("请输入你的体重(kg):")) # 输入体重b = e

Spring 内部类获取不到@Value配置值问题排查(附Spring代理方式)

目录 一、实例问题 1、现象 2、原因 3、解决 二、Spring的代理模式 1、静态代理(Static Proxy) 1)原理 2)优缺点 3)代码实现 2、JDK动态代理(JDK Dynamic Proxy) 1)原理 2)优缺点 3)代码实现 3、cglib 代理(Code Generation Library Proxy) 1)原理 2)优缺点 3)代码实

算法11—判断一个树是不是二叉查询树

问题: 给定一个二叉树,判断它是否是二叉查询树。 思路: 要判断是否是二叉查询树,标准就是看每一个节点是否满足:1、左节点及以下节点的值比它小;2、右节点及以下节点的值比它大。当然,前提是子节点都存在的情况。所以,我们需要从根节点不断向下递归,只要所有节点都满足,那么就是BST,否则,就不是。 代码: [java]  view plain copy pri

算法7— 判断一个单链表是否有环,如果有,找出环的起始位置

第一种方法是从单链表head开始,每遍历一个,就把那个node放在hashset里,走到下一个的时候,把该node放在hashset里查找,如果有相同的,就表示有环,如果走到单链表最后一个node,在hashset里都没有重复的node,就表示没有环。 这种方法需要O(n)的空间和时间。 第二种方法是设置两个指针指向单链表的head, 然后开始遍历,第一个指针走一步,第二个指针走两步,如果没

算法6— 判断两个链表是否相交

问题: 给出两个单向链表的头指针,比如h1、h2,判断链表是否相交,如果不相交返回NULL;如果相交,返回指向第一个相交节点的指针。时间复杂度控制在O(n)。 分析: 如果两单向链表相交的话,一定是Y型相交,不可能出现X型,弄清楚这点后接下来的工作就是: (1)先找到h1,h2的最后一个节点L1和L2,同时记录节点数量a,b;(这里假设 a > b) (2)判断最后一个节点是否相同

IntelliJ IDEA svn chekout 项目发生svn不是内部命令

错误信息: 1、Cannot checkout from svn: 'C:\Program' 不是内部或外部命令,也不是可运行的程序 或批处理文件 2、server ssl cerificate verification failed:certificate issued for a different hostname.issuer is not trusted (服务器ssl证书验证失败

新建帐套提示“无法创建数据库!请检查目录…是否存在,以及系统空间是否充足.

1、在K/3安装路径下K3ERP文件夹下,找到DBFILE文件夹;2、右击单击“DBFILE”文件夹,选择“属性”→【安全】→【添加】,选择【高级】→【立即查找】→找到everyone用户;3、把该用户添加到【用户和组】中,并赋予“完全控制权限”。