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

2025-05-29 0 102

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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 java判断某个点是否在所画多边形/圆形内 https://www.kuaiidc.com/112021.html

相关文章

发表评论
暂无评论