关闭

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

标签: 算法图形
1074人阅读 评论(0) 收藏 举报
分类:

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

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

一、构建安全矩形


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

二、线段的安全区域


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

三、计算交点

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


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

作者博客:点击打开链接

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:13892次
    • 积分:278
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档