Sea~Sky 2020-01-05 18:59 采纳率: 71.4%
浏览 241
已采纳

通过多点连成折线,显示折线周围20米(可自定义)范围内点位

操作逻辑:通过多点连成折线,显示折线周围20米(可自定义)范围内点位
图片说明求虚线内缓冲区范围

  • 写回答

1条回答 默认 最新

  • threenewbee 2020-01-05 22:05
    关注

    是给定折线构成的封闭范围,求点在范围内还是范围外么?

    /** 
            * 判断点是否在多边形内 
            * @param point 检测点 
            * @param pts   多边形的顶点 
            * @return      点在多边形内返回true,否则返回false 
            */  
            public static boolean IsPtInPoly(Point2D.Double point, List<Point2D.Double> pts){
               int N = pts.size();  
               boolean boundOrVertex = true; //如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true  
               int intersectCount = 0;
               double precision = 2e-10; //浮点类型计算时候与0比较时候的容差  
               Point2D.Double p1, p2;
               Point2D.Double p = point; //当前点  
    
               p1 = pts.get(0);   
               for(int i = 1; i <= N; ++i){      
                   if(p.equals(p1)){  
                       return boundOrVertex;
                   }  
                   p2 = pts.get(i % N);        
                   if(p.x < Math.min(p1.x, p2.x) || p.x > Math.max(p1.x, p2.x)){                
                       p1 = p2;   
                       continue;
                   }  
    
                   if(p.x > Math.min(p1.x, p2.x) && p.x < Math.max(p1.x, p2.x)){
                       if(p.y <= Math.max(p1.y, p2.y)){                 
                           if(p1.x == p2.x && p.y >= Math.min(p1.y, p2.y)){
                               return boundOrVertex;  
                           }  
    
                           if(p1.y == p2.y){                       
                               if(p1.y == p.y){
                                   return boundOrVertex;  
                               }else{
                                   ++intersectCount;  
                               }   
                           }else{
                               double xinters = (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y;                       
                               if(Math.abs(p.y - xinters) < precision){
                                   return boundOrVertex;  
                               }  
    
                               if(p.y < xinters){ 
                                   ++intersectCount;  
                               }   
                           }  
                       }  
                   }else{                 
                       if(p.x == p2.x && p.y <= p2.y){                    
                           Point2D.Double p3 = pts.get((i+1) % N);                      
                           if(p.x >= Math.min(p1.x, p3.x) && p.x <= Math.max(p1.x, p3.x)){
                               ++intersectCount;  
                           }else{  
                               intersectCount += 2;  
                           }  
                       }  
                   }              
                   p1 = p2;  
               }  
    
               if(intersectCount % 2 == 0){
                   return false;  
               } else { 
                   return true;  
               }  
    
            }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable