软件编程
位置:首页>> 软件编程>> java编程>> java判断某个点是否在所画多边形/圆形内

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

作者:阿杜_ardo  发布时间:2022-09-30 23:50:45 

标签:java,多边形,圆形

本文实例为大家分享了java判断某个点是否在所画范围内的具体代码,供大家参考,具体内容如下

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;
 }

}

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

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com