图形学算法——点与多边形的关系(交点数判断法)
来源:互联网 发布:淘宝 装修 编辑:程序博客网 时间:2024/04/30 23:28
基本思想:从指定点出发,向无穷远处发出一条射线,计算这条射线和多变的交点个数,若交点数为偶数(包括0),则说明在该点在多边形外;否在该点在多边形内。
此处,为了方便我们叙述,我们假设射线是水平向右发射的。为了计算射线与多边形所有边的交点,我们需要遍历多边形所有的边,判断是否存在交点。这样的计算量非常大,以下给出几种可以减少计算量的方法。
一、构建安全矩形
如图所示,构建出红色的矩形,则所有在红色矩形外的所有点都可以直接判断为不在多边形内部。具体方法是:遍历多边形所有的顶点,统计出最大最小的x、y值,这样就构建出了安全矩形四个顶点的坐标值。
二、线段的安全区域
如图所示,对于线段AB,L1上方,L2下方,线段AC的右侧(我们假设我们的射线是水平向右的)都是安全区域,就是做当点处于这些区域的时候,是绝不会和线段AB产生交点的,因此可以先判断是否在安全区域,如果不在,再继续计算是否有交点,如果在安全区域,则立即可以得出没有交点的结论。
三、计算交点
当需要判断的点既不在安全矩形又不在线段的安全区域之内时,我们不得不计算射线与直线的交点是否存在。但是,计算时会有一些特殊情况,如图所示(此处的图是向做发出射线,其实是一样的):
对于P1、P2、P3该如何判断呢?一个简单的办法是,若相邻两边在射线同侧,则交点计数加2,否则加1。按照这个办法,我们就能计算出,P1和多边形有1个交点,P2有1个交点,P3有2个交点。这个方法很好解决了射线经过多边形顶点的问题,但是这样的方法用算法不太好实现,如何才能判断两条线段在射线的同一侧?解决方法是,区分线段的上顶点和下顶点。也就是说,我们可以这么定义:只有射线经过线段的上顶点时,才算是有交点;当射线经过线段的下顶点时,则看做射线和线段没有交点。这在程序中是很好判断的,方便我们计算。
作者博客:点击打开链接
- 图形学算法——点与多边形的关系(交点数判断法)
- 判断点与多边形位置关系算法
- 判断点与多边形位置关系的算法
- 几种判断点与多边形关系的算法介绍
- 判断点与多边形的位置关系
- 判断点与多边形的位置关系
- 判断点与多边形的关系(2):面积法
- 判断点与多边形的关系(4):射线法
- 地图上点与多边形的关系判断
- SGU 124 射线法 判断点与多边形位置关系
- 多边形与多边形 位置关系的判断
- 判断点与多边形的关系(1):向量积法
- 判断点与多边形的关系(3):角度和法
- vtk实战(五十)—计算线段与多边形的交点
- 刚学编程,写了个判断独立点与多边形位置关系的算法(C#)
- 点在多边形内算法——判断一个点是否在一个复杂多边形的内部
- 点在多边形内算法——判断一个点是否在一个复杂多边形的内部
- 点在多边形内算法——判断一个点是否在一个复杂多边形的内部
- 快速排序算法实现(C++)
- POJ 1051 P,MTHBGWB
- 自定义struts标签分页
- SQL Server 2012可编程性新特性_3_THROW
- Linux Call Trace原理分析
- 图形学算法——点与多边形的关系(交点数判断法)
- C语言与汇编语言混合编程应遵守的规则
- Kinect开发应用知识大全
- 1703. Obstacle Course(最短路径bfs)
- PKU 1659 Frogs' Neighborhood
- oracle sql 优化
- java编程思想阅读笔记(十)I/O系统(上)
- 【Android Training - UserInfo】记住登入用户的信息[Lesson 0 - 章节概览]
- 你应该掌握的——树和二叉树