/** Builds a XRectangle2D from rectangle */ public static XRectangle2D create(Rectangle rectangle) { return new XRectangle2D(rectangle.minLat, rectangle.maxLat, rectangle.minLon, rectangle.maxLon); }
/** Checks if the rectangle contains the provided point **/ public boolean queryContainsPoint(int x, int y) { if (this.crossesDateline() == true) { return bboxContainsPoint(x, y, MIN_LON_ENCODED, this.maxX, this.minY, this.maxY) || bboxContainsPoint(x, y, this.minX, MAX_LON_ENCODED, this.minY, this.maxY); } return bboxContainsPoint(x, y, this.minX, this.maxX, this.minY, this.maxY); }
/** Checks if the rectangle contains the provided triangle **/ public boolean containsTriangle(int ax, int ay, int bx, int by, int cx, int cy) { if (this.crossesDateline() == true) { return bboxContainsTriangle(ax, ay, bx, by, cx, cy, MIN_LON_ENCODED, this.maxX, this.minY, this.maxY) || bboxContainsTriangle(ax, ay, bx, by, cx, cy, this.minX, MAX_LON_ENCODED, this.minY, this.maxY); } return bboxContainsTriangle(ax, ay, bx, by, cx, cy, minX, maxX, minY, maxY); }
/** compare this to a provided rangle bounding box **/ public PointValues.Relation relateRangeBBox(int minXOffset, int minYOffset, byte[] minTriangle, int maxXOffset, int maxYOffset, byte[] maxTriangle) { PointValues.Relation eastRelation = compareBBoxToRangeBBox(this.bbox, minXOffset, minYOffset, minTriangle, maxXOffset, maxYOffset, maxTriangle); if (this.crossesDateline() && eastRelation == PointValues.Relation.CELL_OUTSIDE_QUERY) { return compareBBoxToRangeBBox(this.west, minXOffset, minYOffset, minTriangle, maxXOffset, maxYOffset, maxTriangle); } return eastRelation; }
/** returns true if the edge (defined by (ax, ay) (bx, by)) intersects the query */ private boolean edgeIntersectsQuery(int ax, int ay, int bx, int by) { if (this.crossesDateline() == true) { return edgeIntersectsBox(ax, ay, bx, by, MIN_LON_ENCODED, this.maxX, this.minY, this.maxY) || edgeIntersectsBox(ax, ay, bx, by, this.minX, MAX_LON_ENCODED, this.minY, this.maxY); } return edgeIntersectsBox(ax, ay, bx, by, this.minX, this.maxX, this.minY, this.maxY); }
if (queryContainsPoint(aX, aY) || queryContainsPoint(bX, bY) || queryContainsPoint(cX, cY)) { return true; if (this.crossesDateline() == true) { if (boxesAreDisjoint(tMinX, tMaxX, tMinY, tMaxY, MIN_LON_ENCODED, this.maxX, this.minY, this.maxY) && boxesAreDisjoint(tMinX, tMaxX, tMinY, tMaxY, this.minX, MAX_LON_ENCODED, this.minY, this.maxY)) { return false; if (queryIntersects(aX, aY, bX, bY, cX, cY)) { return true;
/** returns true if the query matches the encoded triangle */ @Override protected boolean queryMatches(byte[] t, int[] scratchTriangle) { // decode indexed triangle XLatLonShape.decodeTriangle(t, scratchTriangle); int aY = scratchTriangle[0]; int aX = scratchTriangle[1]; int bY = scratchTriangle[2]; int bX = scratchTriangle[3]; int cY = scratchTriangle[4]; int cX = scratchTriangle[5]; if (queryRelation == XLatLonShape.QueryRelation.WITHIN) { return rectangle2D.containsTriangle(aX, aY, bX, bY, cX, cY); } return rectangle2D.intersectsTriangle(aX, aY, bX, bY, cX, cY); }
if (bboxContainsPoint(ax, ay, minX, maxX, minY, maxY) || bboxContainsPoint(bx, by, minX, maxX, minY, maxY)) { return true; if (boxesAreDisjoint(Math.min(ax, bx), Math.max(ax, bx), Math.min(ay, by), Math.max(ay, by), minX, maxX, minY, maxY)) { return false;
/** returns true if the query intersects the provided triangle (in encoded space) */ private boolean queryIntersects(int ax, int ay, int bx, int by, int cx, int cy) { // check each edge of the triangle against the query if (edgeIntersectsQuery(ax, ay, bx, by) || edgeIntersectsQuery(bx, by, cx, cy) || edgeIntersectsQuery(cx, cy, ax, ay)) { return true; } return false; }
/** static utility method to check if a bounding box contains a triangle */ private static boolean bboxContainsTriangle(int ax, int ay, int bx, int by, int cx, int cy, int minX, int maxX, int minY, int maxY) { return bboxContainsPoint(ax, ay, minX, maxX, minY, maxY) && bboxContainsPoint(bx, by, minX, maxX, minY, maxY) && bboxContainsPoint(cx, cy, minX, maxX, minY, maxY); }
XLatLonShapeBoundingBoxQuery(String field, XLatLonShape.QueryRelation queryRelation, double minLat, double maxLat, double minLon, double maxLon) { super(field, queryRelation); Rectangle rectangle = new Rectangle(minLat, maxLat, minLon, maxLon); this.rectangle2D = XRectangle2D.create(rectangle); }