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

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

本文demo演示:
碰撞检测:判断点是否在多边形内部_第1张图片

基本判断原理:

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

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

如下图所示:
碰撞检测:判断点是否在多边形内部_第2张图片

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

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

特殊情况:

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

如图:
碰撞检测:判断点是否在多边形内部_第3张图片

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

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

如图:
碰撞检测:判断点是否在多边形内部_第4张图片
点 A 和多边形一条边相交,然后和2个顶点相交。
这种情况,要判断交点的2条线段,是否是都同时在点A的一侧,上面或者下面,如果都在一侧,可以认为没相交。

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

如图:
碰撞检测:判断点是否在多边形内部_第5张图片

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

如图:
碰撞检测:判断点是否在多边形内部_第6张图片

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

demo工程下载:

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

你可能感兴趣的:(Cocos,Creator,算法实践,Cocos,Creator,碰撞检测)