图形学算法——点与多边形的关系(交点数判断法)

原创 2012年03月26日 22:34:35

  基本思想:从指定点出发,向无穷远处发出一条射线,计算这条射线和多变的交点个数,若交点数为偶数(包括0),则说明在该点在多边形外;否在该点在多边形内。

  此处,为了方便我们叙述,我们假设射线是水平向右发射的。为了计算射线与多边形所有边的交点,我们需要遍历多边形所有的边,判断是否存在交点。这样的计算量非常大,以下给出几种可以减少计算量的方法。

一、构建安全矩形


  如图所示,构建出红色的矩形,则所有在红色矩形外的所有点都可以直接判断为不在多边形内部。具体方法是:遍历多边形所有的顶点,统计出最大最小的x、y值,这样就构建出了安全矩形四个顶点的坐标值。

二、线段的安全区域


  如图所示,对于线段AB,L1上方,L2下方,线段AC的右侧(我们假设我们的射线是水平向右的)都是安全区域,就是做当点处于这些区域的时候,是绝不会和线段AB产生交点的,因此可以先判断是否在安全区域,如果不在,再继续计算是否有交点,如果在安全区域,则立即可以得出没有交点的结论。

三、计算交点

  当需要判断的点既不在安全矩形又不在线段的安全区域之内时,我们不得不计算射线与直线的交点是否存在。但是,计算时会有一些特殊情况,如图所示(此处的图是向做发出射线,其实是一样的):


  对于P1、P2、P3该如何判断呢?一个简单的办法是,若相邻两边在射线同侧,则交点计数加2,否则加1。按照这个办法,我们就能计算出,P1和多边形有1个交点,P2有1个交点,P3有2个交点。这个方法很好解决了射线经过多边形顶点的问题,但是这样的方法用算法不太好实现,如何才能判断两条线段在射线的同一侧?解决方法是,区分线段的上顶点和下顶点。也就是说,我们可以这么定义:只有射线经过线段的上顶点时,才算是有交点;当射线经过线段的下顶点时,则看做射线和线段没有交点。这在程序中是很好判断的,方便我们计算。

作者博客:点击打开链接

Qt的窗口背景及窗口风格统一与焕肤

《一》http://blog.csdn.net/qq5823996/article/details/6851788 Qt的窗口背景图片有3种方式设置 1、QPalette p;       ...

【计算几何】点在多边形内部

问题描述:已知点P(x,y)和多边形Poly,判断点P(x,y)是否在多边形内部。 基本方法:射线法 以点P为端点,向左方作射线L,由于多边形是有界的,所以射线L的左端一定在多边形外部,考...
  • z104207
  • z104207
  • 2015年04月11日 17:41
  • 1008

【算法】计算机图形学的一些经典小题:判断点在多边形内,随机生成三角形内的点,判断两个矩形是否相交等

前几天面试的时候被问到了,如何随机在三角形内生成点,我按照我的想法回答了一遍,但觉得回答的不够好。最后面试官说了一个最优的方法。觉得不错,顺带总结一下最近看到的一些关于计算机图形学方面的经典小题,知乎...

计算机图形学中点分割算法法 (线段与矩形关系的判断 向量)

线段与矩形的关系我理解的是三种:1、线段完全在矩形内 2、线段完全在矩形外 3、线段有一部分在矩形内 点与矩形的关系比线段与矩形的关系更容易判断,所以以下都是通过端点的情况去判断线段与矩形的关系...

计算机图形学(三)扫描线多边形填充算法讲解与源代码

如果喜欢转载请标明出处: 并非菜鸟菜鸟的博客 源代码下载:点击打开链接 在这里先说下算法的实现过程 本人觉得这个算法实现起来还是有点难度的!很多人都不愿意去看太多描述性的文字,所以对这个算法的过程是...

图形学_多边形扫描转换_边界标志算法

边界标志算法 1. 对多边形的每一条边进行扫描转换,即对多边形边界所经过的象素作一个边界标志。 2.填充     对每条与多边形相交的扫描线,按从左到右的顺序,逐个访问该扫描线上的象素。 ...

计算机图形学(四)多边形的种子填充算法讲解与源代码

种子填充算法相比较扫描线填充算要容易的多了。理解起来也很简单。 源码下载:点我下载哦 简单的说一下算法的原理: 种子填充算法都是进行区域填充的,而且一般都是指定给某个区域填充某种颜色。然后给出区域的范...

计算机图形学 - 多边形裁剪算法

Sutherland Hodgman裁剪算法

计算机图形学:多边形的扫描转换算法(有详细代码)

前言: 书本上用的是链表的方法,由于感觉链表太乱了,担心代码不清晰,就用了结构体的方法。 我的方法和书上的不太一样,只能说是自己根据书本修改的代码,可能有些错误,希望老师能够提出。 我在算法中初始了一...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图形学算法——点与多边形的关系(交点数判断法)
举报原因:
原因补充:

(最多只允许输入30个字)