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

原创 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个交点。这个方法很好解决了射线经过多边形顶点的问题,但是这样的方法用算法不太好实现,如何才能判断两条线段在射线的同一侧?解决方法是,区分线段的上顶点和下顶点。也就是说,我们可以这么定义:只有射线经过线段的上顶点时,才算是有交点;当射线经过线段的下顶点时,则看做射线和线段没有交点。这在程序中是很好判断的,方便我们计算。

作者博客:点击打开链接

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

vtk实战(五十)—计算线段与多边形的交点

主要用到IntersectWithLine()方法,如果交叉点发生,该方法返回非0值,并且计算交叉点坐标。#include #include #include int main() { v...

VTK 求多边形和直线的交点

我只想说IntersectWithLine() 这个函数好强大 参考 /**********************************************************...

CodeBlocks下如何配置OpenCV

主要参见如下两篇文章:英文:http://opencv.willowgarage.com/wiki/CodeBlocks中文:http://www.opencv.org.cn/index.php/Co...
  • dupei
  • dupei
  • 2011-05-18 00:05
  • 11500

图形学算法--Bresenham算法的改进(综合各个方向)

上次我们说明了Bresenham直线算法的原理和实现过程,但是上次我们只是给出了一个方向上的直线画法,这次我们就来说明一下如何画出所有方向上的直线。 其实想要画出全方向上的直线是很简单的,只要分别单独...

图形学算法--Bresenham画直线

上次写了一下DDA直线算法的过程和实现,但DDA算法也有一些缺点:   主要它涉及到了实数的除法运算,效率不太高。   今天,我介绍另外一种画直线的算法:Bresenham算法(中点画线)   ...

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

前几天面试的时候被问到了,如何随机在三角形内生成点,我按照我的想法回答了一遍,但觉得回答的不够好。最后面试官说了一个最优的方法。觉得不错,顺带总结一下最近看到的一些关于计算机图形学方面的经典小题,知乎...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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