1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.htmlunit.util.geometry;
16
17 import java.util.ArrayList;
18
19
20
21
22
23
24 public class Polygon2D implements Shape2D {
25 private final ArrayList<Point2D> points_;
26 private final Rectangle2D boundingBox_;
27
28
29
30
31
32
33
34
35 public Polygon2D(final double startX, final double startY) {
36 points_ = new ArrayList<>();
37 points_.add(new Point2D(startX, startY));
38 boundingBox_ = new Rectangle2D(startX, startY, startX, startY);
39 }
40
41
42
43
44
45
46
47
48 public Polygon2D lineTo(final double x, final double y) {
49 points_.add(new Point2D(x, y));
50 boundingBox_.extend(x, y);
51
52 return this;
53 }
54
55
56
57
58 @Override
59 public boolean contains(final double x, final double y) {
60 if (!boundingBox_.contains(x, y)) {
61 return false;
62 }
63
64 final double outsideX = boundingBox_.getLeft() - EPSILON;
65 final double outsideY = boundingBox_.getBottom();
66
67 final Line2D testLine = new Line2D(outsideX, outsideY, x, y);
68 int intersectionCount = 0;
69
70 int i = 0;
71 while (i < points_.size() - 1) {
72 final Point2D start = points_.get(i);
73 final Point2D end = points_.get(++i);
74 final Line2D border = new Line2D(start, end);
75
76 if (border.contains(x, y)) {
77 return true;
78 }
79
80 final Point2D intersectionPoint = border.intersect(testLine);
81 if (intersectionPoint != null
82 && border.contains(intersectionPoint.getX(), intersectionPoint.getY())
83 && testLine.contains(intersectionPoint.getX(), intersectionPoint.getY())) {
84 intersectionCount++;
85 }
86 }
87
88 final Point2D start = points_.get(0);
89 final Point2D end = points_.get(i);
90 final Line2D border = new Line2D(start, end);
91
92 if (border.contains(x, y)) {
93 return true;
94 }
95
96 final Point2D intersectionPoint = border.intersect(testLine);
97 if (intersectionPoint != null
98 && border.contains(intersectionPoint.getX(), intersectionPoint.getY())
99 && testLine.contains(intersectionPoint.getX(), intersectionPoint.getY())) {
100 intersectionCount++;
101 }
102
103 return intersectionCount % 2 != 0;
104 }
105
106
107
108
109 @Override
110 public boolean isEmpty() {
111 return points_.size() < 2;
112 }
113
114 @Override
115 public String toString() {
116 return "Polygon2D []";
117 }
118 }