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

本文乃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

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容简介  《实时碰撞检测算法技术》详细阐述了与碰撞检测问题相关的高效解决方案及相应的数据结构和算法,主要包括:碰撞检测系统中的设计问题、数学和几何学入门、包围体、基本图元测试、层次包围体技术、空间划分、BSP树层次结构、凸体算法、基于GPU的碰撞检测、数值健壮性、几何健壮性以及优化操作。另外,《实时碰撞检测算法技术》还提供了相应的算法、代码以及伪代码,以帮助读者进一步理解计算方案的实现过程。  《实时碰撞检测算法技术》适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学教材和参考手册。第1章 概述1.1 内容概览1.2 关于本书的代码第2章 碰撞检测系统中的设计问题2.1 碰撞算法的设计因素2.2 应用程序中对象的表达方式2.3 查询类型2.4 环境模拟参数2.5 性能2.6 健壮性2.7 实现与使用的简洁性2.8 小结第3章 数学和几何学入门3.1 矩阵3.2 坐标系统和顶点3.3 向量3.4 质心坐标3.5 直线、光线和线段3.6 平面和半空间3.7 多边形3.8 多面体3.9 凸包计算3.10 域3.11 Minkowski和与Minkowski差3.12 小结第4章 包围体4.1 BV期望特征4.2 轴对齐包围盒4.3 Spheres球体4.4 方向包围盒4.5 球扫掠体4.6 半空间相交体4.7 其他类型的包围体4.8 小结第5章 基本图元测试5.1 最近点计算5.2 图元测试5.3 直线、光线和有向线段的相交测试5.4 其他类型的测试5.5 动态相交测试5.6 小结第6章 层次包围体技术6.1 层次结构设计问题6.2 层次结构的构建策略6.3 层次结构的遍历6.4 包围体层次结构示例6.5 合并包围体6.6 高效的树型表达方式及遍历6.7 通过缓存机制改善查询6.8 小结第7章 空间划分第8章 BSP树层次结构第9章 凸体算法第10章 基于GPU的碰撞检测第11章 数值健壮性第12章 几何健壮性第13章 优化操作参考文献

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值