本文实例为大家分享了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;
/**
* @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