zoukankan      html  css  js  c++  java
  • 判断点及线段是否在多边形内

    昨天小学了一点计算几何学的内容,想把它记下来,以便以后翻阅。

    1.判断点是否在多边形中

    先说一下思路:

    判断点(P)是否在多边形中,可以先以点p向左引一条射线(L),我们知道,从射线L左端的无穷远处开始一直到点P的过程中,当遇到多边形的第一个交点时L进入了多边形,当遇到第二个交点时,L穿出了多边形。。。。。。。。。可知,规律如下,当在遇到P点之前L与多边形的交点为偶数个时,说明p点不在多边形内,当在遇到p点之前L与多边形得交点为奇数个时,说明P点在多边形内。

    但是,这个规律并不具有普遍性,还有几种特殊情况不满足此规律,需要额外考虑:

    (1)当点P在多边形的某条边上时,可以直接判断其在多边形中。

    (2)对于多边形的水平边不作考虑。

    (3)对于多边形的顶点与L相交,则需要判断该顶点是否为顶点所在的边的那个纵坐标较大的顶点,如果是较大的那个顶点与L相交则计数,否则忽略。

    伪代码如下:

    ........fun()
    {
         int count=0;
         //以P为端点从右向左引一条射线L 
         for(多边形的每一条边S)//遍历多边形的每一条边 
         {
              if(P在边S上)
              {
                   return ture; 
              } 
              if(S不是水平的)
              {
                    if(S的一个端点在L上)
                    {
                          if(该端点是S的较大端点)
                          {
                                count++; 
                          }                    
                    }               
                    else if(S与L相交)
                    {
                          count++;
                    } 
              } 
         } 
         if(count%2==0)
         {
               return false;
         }
         else
         {
               return true;
         }
    }

    2.判断线段是否在多边形内

    思路:(1)首先,要判断一条线段是否在多边形内,先要判断线段的两个端点是否在多边形内。如果两个端点不全在多边形内,那么,线段肯定是不在多边形内的。

            (2)其次,如果线段和多边形的某条边内交(两线段内交是指两线段相交且交点不在两线段的端点),则线段肯定不在多边形内。

            (3)如果多边形的某个顶点和线段相交,则必须判断两相交交点之间的线段是否包含于多边形内。

    伪代码:

    if(线段PQ的端点不都在多边形内)
    {
         return false;                              
    } 
    点集pointSet初始化为空;
    for(多边形的每一条边S)
    {
         if(线段的某个端点在S上)
         {
               将该端点加入pointSet;                       
         }                      
         else if(S的某个端点在线段PQ上)
         {
               将该端点加入pointSet;     
         } 
         else if(线段PQ与S相交)
         {
              return false;//此时可以判断是内交了     
         } 
    } 
    将pointSet中的点按照X-Y坐标排序;
    for(pointSet中每两个相邻点pointSet[i],pointSet[i+1])
    {
         if(pointSet[i],pointSet[i+1]的中点不在多边形中)
         {
              return false;                                               
         }                                                    
    } 
    return true;
    
  • 相关阅读:
    【LeetCode】Validate Binary Search Tree
    【LeetCode】Search in Rotated Sorted Array II(转)
    【LeetCode】Search in Rotated Sorted Array
    【LeetCode】Set Matrix Zeroes
    【LeetCode】Sqrt(x) (转载)
    【LeetCode】Integer to Roman
    贪心算法
    【LeetCode】Best Time to Buy and Sell Stock III
    【LeetCode】Best Time to Buy and Sell Stock II
    CentOS 6 上安装 pip、setuptools
  • 原文地址:https://www.cnblogs.com/zhangshu/p/2130694.html
Copyright © 2011-2022 走看看