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

转载:https://blog.csdn.net/ardo_pass/article/details/78552592?locationNum=2&fps=1

如题:

IsPtInPoly.java

package com.ardo.util.circle;

import java.util.ArrayList;
import java.util.List;

/** 
 * java判断某个点是否在所画范围内(多边形【isPtInPoly】/圆形【distencePC】) 
 * @param point 检测点 
 * @param pts   多边形的顶点 
 * @return      点在多边形内返回true,否则返回false 
 * @author 		ardo
 */ 
public class IsPtInPoly {
	
	/** 
	 * 判断点是否在多边形内 
	 * @param point 检测点 
	 * @param pts   多边形的顶点 
	 * @return      点在多边形内返回true,否则返回false 
	 */  
	public static boolean isPtInPoly(Point2D point, List<Point2D> pts){  
	      
	    int N = pts.size();  
	    boolean boundOrVertex = true; //如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true  
	    int intersectCount = 0;//cross points count of x   
	    double precision = 2e-10; //浮点类型计算时候与0比较时候的容差  
	    Point2D p1, p2;//neighbour bound vertices  
	    Point2D 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 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;  
	    }  
	      
	} 
	
	/**
	 * 判断是否在圆形内
	 * @param p
	 * @param c
	 * @return
	 */
	public static String distencePC(Point2D p,Circle c){//判断点与圆心之间的距离和圆半径的关系
        String s ;
        double d2 = Math.hypot( (p.getX() - c.getCC().getX() ), (p.getY() - c.getCC().getY()) );
        System.out.println("d2=="+d2);
        double r = c.getR();
        if(d2 > r){
              s = "圆外";
        }else if(d2 < r){
             s = "圆内";
        }else{
              s = "圆上";
        }
        return s;
	}

	
	
	
	public static void main(String[] args) {  
	      
	    Point2D point = new Point2D(116.404072, 39.916605);  
	      
	    // 测试一个点是否在多边形内  
	    List<Point2D> pts = new ArrayList<Point2D>();  
	    pts.add(new Point2D(116.395, 39.910));  
	    pts.add(new Point2D(116.394, 39.914));  
	    pts.add(new Point2D(116.403, 39.920));  
	    pts.add(new Point2D(116.402, 39.914));  
	    pts.add(new Point2D(116.410, 39.913));  
	      
	    if(isPtInPoly(point, pts)){  
	        System.out.println("点在多边形内");  
	    }else{  
	        System.out.println("点在多边形外");  
	    }  
	    
	    // 测试一个点是否在圆形内  
	    Point2D centerPoint = new Point2D(116.404172, 39.916605);  
	    Circle c = new Circle();
        c.setCC(centerPoint);
        c.setR(0.0056);
        String s = distencePC(point,c);
        System.out.println("点是否在圆内:"+s);
	} 
	
}

Circle.java

/**
 * 圆形类
 * @author ardo
 *
 */
public class Circle {
	 private double r;
     private Point2D cc;
     
     public void setR(double a){
           r = a;
     }
     public void setCC(Point2D centerOfCir){
           cc = centerOfCir;
     }
     public double getR(){
           return r;
     }
     public Point2D getCC(){
           return cc;
     }
}

Point2D.java

public class Point2D {
	
	public double x;
	public double y;
	
	public Point2D(double x, double y) {
		super();
		this.x = x;
		this.y = y;
	}
	
	public double getX() {
		return x;
	}
	public void setX(double x) {
		this.x = x;
	}
	public double getY() {
		return y;
	}
	public void setY(double y) {
		this.y = y;
	}
	
}

猜你喜欢

转载自blog.csdn.net/qq_26676207/article/details/79849652
今日推荐