激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - java判斷某個點是否在所畫多邊形/圓形內

java判斷某個點是否在所畫多邊形/圓形內

2021-05-06 11:10阿杜_ardo Java教程

這篇文章主要為大家詳細介紹了java判斷某個點是否在所畫多邊形或圓形內的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了java判斷某個點是否在所畫范圍內的具體代碼,供大家參考,具體內容如下

IsPtInPoly.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 * 圓形類
 * @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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美一级欧美 | 国产99页| 性生活视频软件 | 免费激情网站 | 日韩一级视频 | 午夜在线视频一区二区三区 | 成人黄色免费观看 | 青青草成人影视 | 国产精品免费久久久久久 | 国产伊人色 | 特大黑人videos与另类娇小 | 色综合视频网 | 国产欧美精品一区二区三区四区 | av电影免费看 | 人禽l交免费视频 | 亚洲自拍第一 | 深夜免费福利视频 | 毛片福利| 久久精品中文字幕一区 | 久久中文字幕在线观看 | 亚洲第一成人在线视频 | 亚洲影院在线观看 | 亚洲精品自在在线观看 | 精品在线免费播放 | 亚洲精品欧美在线 | 宅男噜噜噜66国产在线观看 | 精品久久一区二区 | 天天舔天天插 | 免费观看三级毛片 | 日韩中文一区 | 特色一级黄色片 | 成人福利视频导航 | 国产无遮挡一区二区三区毛片日本 | 一本色道久久综合亚洲精品图片 | 久草在线观看福利 | 中文日韩在线视频 | 欧美1区2区在线观看 | 久草在线最新 | 在线成人免费av | 久久精品a一级国产免视看成人 | 毛片天天看 |