温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-05-23 17:01:45 来源:亿速云 阅读:513 作者:小新 栏目:编程语言

这篇文章主要介绍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;    }      }

java基本数据类型有哪些

Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点类型,用来表示小数的数据类型。3、字符类型,字符类型的关键字是“char”。4、布尔类型,是表示逻辑值的基本数据类型。

以上是“java怎么判断某个点是否在所画多边形/圆形内”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI