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

来源:互联网 发布:淘宝 装修 编辑:程序博客网 时间:2024/04/30 23:28

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

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

一、构建安全矩形


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

二、线段的安全区域


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

三、计算交点

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


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

作者博客:点击打开链接

原创粉丝点击