package com.revolsys.geometry.index; import com.revolsys.geometry.model.BoundingBox; import com.revolsys.geometry.util.BoundingBoxUtil; import com.revolsys.util.Property; public class BoundingBoxNode { private double maxX; private double maxY; private double minX; private double minY; public BoundingBoxNode() { this.minX = Double.NaN; this.minY = Double.NaN; this.maxX = Double.NaN; this.maxY = Double.NaN; } public BoundingBoxNode(final double... bounds) { this.minX = bounds[0]; this.minY = bounds[1]; this.maxX = bounds[2]; this.maxY = bounds[3]; } public BoundingBoxNode(final double minX, final double minY, final double maxX, final double maxY) { this.minX = minX; this.minY = minY; this.maxX = maxX; this.maxY = maxY; } public boolean covers(final BoundingBox boundingBox) { return BoundingBoxUtil.covers(this.minX, this.minY, this.maxX, this.maxY, boundingBox.getMinX(), boundingBox.getMinY(), boundingBox.getMaxX(), boundingBox.getMaxY()); } public boolean covers(final double minX, final double minY, final double maxX, final double maxY) { return minX >= this.minX && maxX <= this.maxX && minY >= this.minY && maxY <= this.maxY; } protected void expandBoundingBox(final BoundingBox boundingBox) { final double minX = boundingBox.getMinX(); final double minY = boundingBox.getMinY(); final double maxX = boundingBox.getMaxX(); final double maxY = boundingBox.getMaxY(); expandBoundingBox(minX, minY, maxX, maxY); } protected void expandBoundingBox(final BoundingBoxNode node) { final double minX = node.getMinX(); final double minY = node.getMinY(); final double maxX = node.getMaxX(); final double maxY = node.getMaxY(); expandBoundingBox(minX, minY, maxX, maxY); } protected void expandBoundingBox(final double... bounds) { final double minX = bounds[0]; final double minY = bounds[1]; final double maxX = bounds[2]; final double maxY = bounds[3]; expandBoundingBox(minX, minY, maxX, maxY); } protected void expandBoundingBox(final double minX, final double minY, final double maxX, final double maxY) { if (minX < this.minX || Double.isNaN(this.minX)) { this.minX = minX; } if (minY < this.minY || Double.isNaN(this.minY)) { this.minY = minY; } if (maxX > this.maxX || Double.isNaN(this.maxX)) { this.maxX = maxX; } if (maxY > this.maxY || Double.isNaN(this.maxY)) { this.maxY = maxY; } } public double getArea() { return (this.maxX - this.minX) * (this.maxY - this.minY); } public double getCentreX() { return (this.minX + this.maxX) / 2; } public double getCentreY() { return (this.minY + this.maxY) / 2; } public double getMaxX() { return this.maxX; } public double getMaxY() { return this.maxY; } public double getMinX() { return this.minX; } public double getMinY() { return this.minY; } public boolean intersectsBoundingBox(final BoundingBox boundingBox) { if (Property.isEmpty(boundingBox)) { return false; } else { final double minX = boundingBox.getMinX(); final double minY = boundingBox.getMinY(); final double maxX = boundingBox.getMaxX(); final double maxY = boundingBox.getMaxY(); return intersectsBoundingBox(minX, minY, maxX, maxY); } } public boolean intersectsBoundingBox(final double... bounds) { final double minX = bounds[0]; final double minY = bounds[1]; final double maxX = bounds[2]; final double maxY = bounds[3]; return intersectsBoundingBox(minX, minY, maxX, maxY); } public boolean intersectsBoundingBox(final double x, final double y) { if (Double.isNaN(this.minX) || Double.isNaN(this.minY)) { return false; } else { return !(x > this.maxX || x < this.minX || y > this.maxY || y < this.minY); } } public boolean intersectsBoundingBox(final double minX, final double minY, final double maxX, final double maxY) { if (Double.isNaN(minX) || Double.isNaN(minY)) { return false; } else { return !(minX > this.maxX || maxX < this.minX || minY > this.maxY || maxY < this.minY); } } protected void setBoundingBox(final double minX, final double minY, final double maxX, final double maxY) { this.minX = minX; this.minY = minY; this.maxX = maxX; this.maxY = maxY; } @Override public String toString() { final StringBuilder s = new StringBuilder(); if (Double.isNaN(this.minX)) { s.append("BBOX EMPTY"); } else { s.append("BBOX("); s.append(this.minX); s.append(','); s.append(this.minY); s.append(' '); s.append(this.maxX); s.append(','); s.append(this.maxY); s.append(')'); } return s.toString(); } }