public final class Polygon2D extends EdgeTree
Loosely based on the algorithm described in http://www-ma2.upc.es/geoc/Schirra-pointPolygon.pdf.
EdgeTree.Edge
Modifier and Type | Field and Description |
---|---|
private java.util.concurrent.atomic.AtomicBoolean |
containsBoundary |
private Polygon2D |
holes
tree of holes, or null
|
Modifier | Constructor and Description |
---|---|
private |
Polygon2D(Polygon polygon,
Polygon2D holes) |
Modifier and Type | Method and Description |
---|---|
private boolean |
componentContains(double latitude,
double longitude)
Returns true if the point is contained within this polygon component.
|
protected PointValues.Relation |
componentRelate(double minLat,
double maxLat,
double minLon,
double maxLon)
Returns relation to the provided rectangle for this component
|
protected PointValues.Relation |
componentRelateTriangle(double ax,
double ay,
double bx,
double by,
double cx,
double cy)
Returns relation to the provided triangle for this component
|
boolean |
contains(double latitude,
double longitude)
Returns true if the point is contained within this polygon.
|
private static boolean |
contains(EdgeTree.Edge edge,
double lat,
double lon,
java.util.concurrent.atomic.AtomicBoolean isOnEdge)
Returns true if the point crosses this edge subtree an odd number of times
|
static Polygon2D |
create(Polygon... polygons)
Builds a Polygon2D from multipolygon
|
private int |
numberOfCorners(double minLat,
double maxLat,
double minLon,
double maxLon) |
private int |
numberOfTriangleCorners(double ax,
double ay,
double bx,
double by,
double cx,
double cy) |
private PointValues.Relation |
relateIndexedLineSegment(double a2x,
double a2y,
double b2x,
double b2y)
relates an indexed line segment (a "flat triangle") with the polygon
|
private PointValues.Relation |
relateIndexedTriangle(double ax,
double ay,
double bx,
double by,
double cx,
double cy)
relates an indexed triangle with the polygon
|
createTree, internalComponentRelate, pointInTriangle, relate, relateTriangle
private final Polygon2D holes
private final java.util.concurrent.atomic.AtomicBoolean containsBoundary
public boolean contains(double latitude, double longitude)
See https://www.ecse.rpi.edu/~wrf/Research/Short_Notes/pnpoly.html for more information.
private boolean componentContains(double latitude, double longitude)
protected PointValues.Relation componentRelate(double minLat, double maxLat, double minLon, double maxLon)
EdgeTree
componentRelate
in class EdgeTree
protected PointValues.Relation componentRelateTriangle(double ax, double ay, double bx, double by, double cx, double cy)
EdgeTree
componentRelateTriangle
in class EdgeTree
private PointValues.Relation relateIndexedLineSegment(double a2x, double a2y, double b2x, double b2y)
private PointValues.Relation relateIndexedTriangle(double ax, double ay, double bx, double by, double cx, double cy)
private int numberOfTriangleCorners(double ax, double ay, double bx, double by, double cx, double cy)
private int numberOfCorners(double minLat, double maxLat, double minLon, double maxLon)
private static boolean contains(EdgeTree.Edge edge, double lat, double lon, java.util.concurrent.atomic.AtomicBoolean isOnEdge)
See https://www.ecse.rpi.edu/~wrf/Research/Short_Notes/pnpoly.html for more information.