热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

这篇文章主要介绍java怎么判断某个点是否在所画多边形圆形内,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!java判

这篇文章主要介绍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 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 pts = new ArrayList();  
    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怎么判断某个点是否在所画多边形/圆形内”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程笔记行业资讯频道!


推荐阅读
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
author-avatar
单身王子550130
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有