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;
    
  • 相关阅读:
    因为这几个TypeScript代码的坏习惯,同事被罚了500块
    如何设计好分布式数据库,这个策略很重要
    线程、多线程和线程池,看完这些你就能全部搞懂了
    章方:征服耶鲁教授的算法大神程序媛
    从零开始学python | 使用Python映射,过滤和缩减函数:所有您需要知道的
    c# 优化代码的一些规则——用委托表示回调[五]
    mysql 重新整理——索引优化explain字段介绍一 [九]
    mysql 重新整理——索引优化explain简单介绍 [八]
    mysql 重新整理——索引简介[七]
    mysql 重新整理——七种连接join连接[六]
  • 原文地址:https://www.cnblogs.com/zhangshu/p/2130694.html
Copyright © 2011-2022 走看看