java判断某个点是否在所画范围内(多边形)

本文介绍如何使用Java编程判断一个点是否位于一个给定多边形的内部。通过对多边形边界线段进行扫描,结合点在直线上的位置关系,实现高效的判断算法。
摘要由CSDN通过智能技术生成
/**
 * 判断点是否在多边形内
 * @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;//cross points count of x 
    double precision = 2e-10; //浮点类型计算时候与0比较时候的容差
    Point2D.Double p1, p2;//neighbour bound vertices
    Point2D.Double p = point; //当前点
    
    p1 = pts.get(0);//left vertex        
    for(int i = 1; i <= N; ++i){//check all rays            
        if(p.equals(p1)){
            return boundOrVertex;//p is an vertex
        }
        
        p2 = pts.get(i % N);//right vertex            
        if(p.x < Math.min(p1.x, p2.x) || p.x > Math.max(p1.x, p2.x)){//ray is outside of our interests                
            p1 = p2; 
            continue;//next ray left point
        }
        
        if(p.x > Math.min(p1.x, p2.x) && p.x < Math.max(p1.x, p2.x)){//ray is crossing over by the algorithm (common part of)
            if(p.y <= Math.max(p1.y, p2.y)){//x is before of ray                    
                if(p1.x == p2.x && p.y >= Math.min(p1.y, p2.y)){//overlies on a horizontal ray
                    return boundOrVertex;
                }
                
                if(p1.y == p2.y){//ray is vertical                        
                    if(p1.y == p.y){//overlies on a vertical ray
                        return boundOrVertex;
                    }else{//before ray
                        ++intersectCount;
                    } 
                }else{//cross point on the left side                        
                    double xinters = (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y;//cross point of y                        
                    if(Math.abs(p.y - xinters) < precision){//overlies on a ray
                        return boundOrVertex;
                    }
                    
                    if(p.y < xinters){//before ray
                        ++intersectCount;
                    } 
                }
            }
        }else{//special case when ray is crossing through the vertex                
            if(p.x == p2.x && p.y <= p2.y){//p crossing over p2                    
                Point2D.Double p3 = pts.get((i+1) % N); //next vertex                    
                if(p.x >= Math.min(p1.x, p3.x) && p.x <= Math.max(p1.x, p3.x)){//p.x lies between p1.x & p3.x
                    ++intersectCount;
                }else{
                    intersectCount += 2;
                }
            }
        }            
        p1 = p2;//next ray left point
    }
    
    if(intersectCount % 2 == 0){//偶数在多边形外
        return false;
    } else { //奇数在多边形内
        return true;
    }
    
}


测试:

// 测试一个点是否在多边形内
public static void main(String[] args) {
    
    Point2D.Double point = new Point2D.Double(116.404072, 39.916605);
    
    List<Point2D.Double> pts = new ArrayList<Point2D.Double>();
    pts.add(new Point2D.Double(116.395, 39.910));
    pts.add(new Point2D.Double(116.394, 39.914));
    pts.add(new Point2D.Double(116.403, 39.920));
    pts.add(new Point2D.Double(116.402, 39.914));
    pts.add(new Point2D.Double(116.410, 39.913));
    
    if(IsPtInPoly(point, pts)){
        System.out.println("点在多边形内");
    }else{
        System.out.println("点在多边形外");
    }
}

原文链接:http://www.cnblogs.com/aheizi/p/5162992.html#_caption_0


  • 10
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
可以使用 Python 的 Shapely 库来实现判断某个经纬度是否在某个多边形范围内的功能。具体步骤如下: 1. 安装 Shapely 库:使用 pip 命令安装 Shapely 库,命令如下: ``` pip install shapely ``` 2. 导入 Shapely 库:在 Python 代码中导入 Shapely 库,命令如下: ``` from shapely.geometry import Point, Polygon ``` 3. 创建多边形对象:使用 Shapely 库的 Polygon 类创建多边形对象,多边形对象需要传入多个的坐标,格式为 (x, y)。 ``` polygon = Polygon([(x1, y1), (x2, y2), (x3, y3), ...]) ``` 4. 创建对象:使用 Shapely 库的 Point 类创建对象,对象需要传入的坐标,格式为 (x, y)。 ``` point = Point(x, y) ``` 5. 判断是否多边形内:使用 Shapely 库的 contains 方法判断是否多边形内,在多边形内返回 True,不在多边形内返回 False。 ``` if polygon.contains(point): print("多边形内") else: print("不在多边形内") ``` 完整的示例代码如下: ``` from shapely.geometry import Point, Polygon # 创建多边形对象 polygon = Polygon([(116.397, 39.908), (116.410, 39.908), (116.410, 39.920), (116.397, 39.920)]) # 创建对象 point = Point(116.403, 39.914) # 判断是否多边形内 if polygon.contains(point): print("多边形内") else: print("不在多边形内") ``` 注意:在使用 Shapely 库时,经度和纬度的顺序需要注意,通常情况下经度在前,纬度在后,例如 (116.397, 39.908)。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值