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

} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • JavaScript继承的特性与实践应用深入详解

    本文详细讲述了JavaScript继承的特性与实践应用.分享给大家供大家参考,具体如下: 继承是代码重用的模式.JavaScript 可以模拟基于类的模式,还支持其它更具表现力的模式.但保持简单通常是最好的策略. JavaScript 是基于原型的语言,也就是说它可以直接继承其他对象. 1 伪类 JavaScript 的原型不是直接让对象从其他对象继承,而是插入一个多余的间接层:通过构造函数来产生对象. 当一个函数被创建时,Function 构造器产生的函数对象会运行这样类似的代码: this.

  • java和matlab画多边形闭合折线图示例讲解

    1.使用matlab作闭合多边形图 没有找到直接画多边形的函数,只能是将各个点的坐标保存在数组中,将一个点与其相邻的点相连,并将最后一个点与第一个点连接.下面是一个示例的.m文件: 复制代码 代码如下: clear;clc;a=[0 2 4 6 8 10 12 14;0 2 1 4 6 6 5 7];  %要连接的点坐标 x;y[n,m]=size(a);for i=1:m-1;    line([a(1,i),a(1,i+1)],[a(2,i),a(2,i+1)]);  %连接节点line([

  • 使用JAVA判断凸多边形的示例代码

    复制代码 代码如下: 以HDU2108为例,去AC吧.//点逆序输入import java.util.Scanner;//1spublic class HDU2108 {  public static void main(String[] args) {    Scanner sc = new Scanner(System.in);    while(true) {      int x,y;      int n = sc.nextInt();      if(0==n) {        b

  • JavaScript创建防篡改对象的方法分析

    本文实例讲述了JavaScript创建防篡改对象的方法.分享给大家供大家参考,具体如下: 之前的 JavaScript,开发人员可能会意外修改了别人的代码,甚至重写原生对象!现在,在 ECMAScript 5 中可以定义防篡改对象啦O(∩_∩)O~ 不过,一旦把对象定义为防篡改之后,就无法撤销了哦. 1 不可扩展对象 默认情况下,所有的对象都是可扩展的,即可以随意地添加属性和方法.现在,使用 Object.preventExtensions(person) 方法后,对象就不可以扩展咯: <scr

  • Java多边形重心计算

    多边形重心计算 三角形重心 顶点为a,b,c的三角形重心为x = (xa + xb + xc) / 3,y = (ya + yb + yc) / 3 多边形重心 x = (x1w1 + x2w2 + - + xnwn)/W y = (y1w1 + y2w2 + - + ynwn)/W import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Polygon; import org.locationt

  • java连连看游戏菜单设计

    本文实例为大家分享了java连连看游戏菜单的具体实现代码,供大家参考,具体内容如下 先写GUI. 首先初始化框架,菜单,按钮,需要把菜单和按钮都添加在框架中.注意添加的顺序,首先要设置菜单,再设置框架,再设置按钮,如果交换了设置菜单和框架的顺序,会导致菜单显示不出,被框架挡住.对菜单设置了三个选项,第一个选项有五个下拉按键,用循环添加,第二个和第三个选项的下拉按键直接添加. GUI代码如下: package gui; import java.awt.Font; import javax.swin

  • JavaScript ES6中的简写语法总结与使用技巧

    ES6为一些已有的功能提供了非破坏性更新,这类更新中的大部分我们可以理解为语法糖,称之为语法糖,意味着,这类新语法能做的事情其实用ES5也可以做,只是会稍微复杂一些.本章我们将着重讨论这些语法糖,看完之后,可能你会对一些你很熟悉的ES6新语法有不一样的理解. JavaScript ES6对象字面量 对象字面量是指以{}形式直接表示的对象,比如下面这样: var book = { title: 'Modular ES6', author: 'Nicolas', publisher: 'O´Reil

  • JavaScript事件对象深入详解

    本文实例讲述了JavaScript事件对象.分享给大家供大家参考,具体如下: 触发 DOM 上的事件时,会生成一个事件对象 event,它包含着所有与事件有关的信息,诸如导致事件的元素.事件的类型以及其他与特定事件相关的信息.所有的浏览器都支持 event 对象,但支持的方式不同. 1 DOM 中的事件对象 兼容 DOM 的浏览器会将 event 对象传入事件处理程序(DOM0 级与 DOM2 级都支持): var btn = document.getElementById("myBtn&quo

  • JavaScript ES6箭头函数使用指南

    胖箭头函数(Fat arrow functions),又称箭头函数,是一个来自ECMAScript 2015(又称ES6)的全新特性.有传闻说,箭头函数的语法=>,是受到了CoffeeScript 的影响,并且它与CoffeeScript中的=>语法一样,共享this上下文. 箭头函数的产生,主要由两个目的:更简洁的语法和与父作用域共享关键字this.接下来,让我们来看几个详细的例子. 新的函数语法 传统的JavaScript函数语法并没有提供任何的灵活性,每一次你需要定义一个函数时,你都必须

  • JavaScript函数的特性与应用实践深入详解

    本文实例讲述了JavaScript函数的特性与应用实践.分享给大家供大家参考,具体如下: 函数用于指定对象的行为.所谓的编程,就是将一组需求分解为一组函数和数据结构的技能. 1 函数对象 JavaScript 函数就是对象.对象是名值对的集合,它还拥有一个连接到原型对象的链接.对象字面量产生的对象连接到 Object.prototype,而函数对象连接到 Function.prototype(这个对象本身连接到 Object.prototype).每个函数在创建时会附加两个隐藏属性:函数的上下文

随机推荐