2D空间中求一点是否在多边形内
2016-11-27 10:14
375 查看
参考自这篇博文:http://www.cnblogs.com/dabiaoge/p/4491540.html
一开始没仔细看做法,浪费了不少时间。下面是最终实现的效果:
大致流程:
1.随便选取多边形上任意一条边,以比较点和边的中心点做一条射线(这里用的伪射线)。
2.用这条射线与其他所有边判断是否相交。
3.将所有与线段相交的数量相加,如果是奇数就在多边形内。
特殊情况:
1.刚好在点上或者在线上。实际运用时会有点误差,但不影响。
2.必须是闭合线段,且不能存在包含的情况。但如果是一个数组生成的线段,不会有这种情况
代码(Unity3D):
另外参考的文章中没有说差乘判断两个线段是否相交的具体做法,这里说明一下
大致流程:
现在有线段AB和线段CB
用线段AB的方向和C,D两点分别做差乘比较。如果C,D在同侧则return跳出
用线段CD的方向和A,B两点分别做差乘比较。如果A,B在同侧则return跳出
最终返回相交
脚本就是上面的IsIntersection函数,最终实现效果(只适用于2D空间,如果是XY轴向要取差乘的z分量做比较):
一开始没仔细看做法,浪费了不少时间。下面是最终实现的效果:
大致流程:
1.随便选取多边形上任意一条边,以比较点和边的中心点做一条射线(这里用的伪射线)。
2.用这条射线与其他所有边判断是否相交。
3.将所有与线段相交的数量相加,如果是奇数就在多边形内。
特殊情况:
1.刚好在点上或者在线上。实际运用时会有点误差,但不影响。
2.必须是闭合线段,且不能存在包含的情况。但如果是一个数组生成的线段,不会有这种情况
代码(Unity3D):
using UnityEngine; using System.Collections; public class Test1 : MonoBehaviour { const float RAYCAST_LEN = 100000f; public Transform[] points; public Transform compare; bool IsContract(Transform compare) { var comparePoint = (points[1].position + points[0].position) * 0.5f; var originPoint = compare.transform.position; comparePoint += (comparePoint - originPoint).normalized * RAYCAST_LEN; Debug.DrawLine(originPoint, comparePoint); int count = 0; for (int i = 0; i < points.Length; i++) { var a = points[i % points.Length]; var b = points[(i + 1) % points.Length]; var r = IsIntersection(a.position, b.position, originPoint, comparePoint); if (r) count++; } return count % 2 == 1; } void OnDrawGizmos() { if (compare == null) return; var oldColor = Gizmos.color; if (IsContract(compare)) Gizmos.color = Color.red; for (int i = 0; i < points.Length; i++) { var a = points[i % points.Length]; var b = points[(i + 1) % points.Length]; Gizmos.DrawLine(a.position, b.position); } Gizmos.color = oldColor; } bool IsIntersection(Vector3 a, Vector3 b, Vector3 c, Vector3 d) { var crossA = Mathf.Sign(Vector3.Cross(d - c, a - c).y); var crossB = Mathf.Sign(Vector3.Cross(d - c, b - c).y); if (Mathf.Approximately(crossA, crossB)) return false; var crossC = Mathf.Sign(Vector3.Cross(b - a, c - a).y); var crossD = Mathf.Sign(Vector3.Cross(b - a, d - a).y); if (Mathf.Approximately(crossC, crossD)) return false; return true; } }
另外参考的文章中没有说差乘判断两个线段是否相交的具体做法,这里说明一下
大致流程:
现在有线段AB和线段CB
用线段AB的方向和C,D两点分别做差乘比较。如果C,D在同侧则return跳出
用线段CD的方向和A,B两点分别做差乘比较。如果A,B在同侧则return跳出
最终返回相交
脚本就是上面的IsIntersection函数,最终实现效果(只适用于2D空间,如果是XY轴向要取差乘的z分量做比较):
相关文章推荐
- 2D空间中判断一点是否在三角形内
- 判断点是否在多边形内(2D空间)
- 用数学方法解决工程问题系列(三) 判断任意给定一点是否在多边形内
- 304. Range Sum Query 2D - Immutable自己的已ac,但答案更好,开了一个稍大一点的空间,就不用判断临界条件了,好。
- 结合谷歌地图多边形(polygon)与Sql Server 2008的空间数据类型计算某个点是否在多边形内的注意事项
- 如何判定一点是否在不规则多边形内
- 判定一点是否在多边形内
- 判断点是否在多边形内
- 在google map下,判断点是否在多边形内的函数
- 如何查看Oracle数据库表空间大小(空闲、已使用),是否要增加表空间的数据文件
- Quartz2D 编程指南(一)概览、图形上下文、路径、颜色与颜色空间
- 判断一个点是否在多边形内
- 判断点是否在多边形内
- HDU-1756 Cupid's Arrow 判断点是否在多边形内部
- 判断一个点是否在多边形区域内
- 空间查询(ISpatialFilter):统计多边形要素内的要素
- 检测空间是否支持curl
- 如何判断一个点是否在一个多边形内部(转)
- 为什么每格式化一次,磁盘空间就减少一点哪?
- 计算几何 判断多边形顶点是否是顺时针