本文实例为大家分享了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;
}
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。
原文链接:https://blog.csdn.net/ardo_pass/article/details/78552592?locationNum=2&fps=1
相关文章
猜你喜欢
- ASP.NET自助建站系统中的用户注册和登录功能定制方法 2025-06-10
- ASP.NET自助建站系统的域名绑定与解析教程 2025-06-10
- 个人服务器网站搭建:如何选择合适的服务器提供商? 2025-06-10
- ASP.NET自助建站系统中如何实现多语言支持? 2025-06-10
- 64M VPS建站:如何选择最适合的网站建设平台? 2025-06-10
TA的动态
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
您的支持,是我们最大的动力!
热门文章
-
2025-05-27 14
-
2025-05-29 98
-
2025-05-25 32
-
2025-05-25 43
-
2025-05-25 84
热门评论