package org.geogebra.common.kernel.discrete.delaunay; /** * Created by IntelliJ IDEA. User: Aviad Segev Date: 22/11/2009 Time: 20:29:56 * BoundingBox represents a horizontal bounding rectangle defined by its lower * left and upper right point. This is usually used as a rough approximation of * the bounded geometry */ public class BoundingBox { /** * the minimum x-coordinate */ private double minx; /** * the maximum x-coordinate */ private double maxx; /** * the minimum y-coordinate */ private double miny; /** * the maximum y-coordinate */ private double maxy; /** * Creates an empty bounding box */ public BoundingBox() { setToNull(); } /** * Copy constructor * * @param other * the copied bounding box */ public BoundingBox(BoundingBox other) { if (other.isNull()) { setToNull(); } else { init(other.minx, other.maxx, other.miny, other.maxy); } } /** * Creates a bounding box given the extent * * @param minx * minimum x coordinate * @param maxx * maximum x coordinate * @param miny * minimum y coordinate * @param maxy * maximum y coordinate */ public BoundingBox(double minx, double maxx, double miny, double maxy) { init(minx, maxx, miny, maxy); } /** * Create a bounding box between lowerLeft and upperRight * * @param lowerLeft * lower left point of the box * @param upperRight * upper left point of the box */ public BoundingBox(Point_dt lowerLeft, Point_dt upperRight) { init(lowerLeft.x, upperRight.x, lowerLeft.y, upperRight.y); } /** * Initialize a BoundingBox for a region defined by maximum and minimum * values. * * @param x1 * the first x-value * @param x2 * the second x-value * @param y1 * the first y-value * @param y2 * the second y-value */ private void init(double x1, double x2, double y1, double y2) { if (x1 < x2) { minx = x1; maxx = x2; } else { minx = x2; maxx = x1; } if (y1 < y2) { miny = y1; maxy = y2; } else { miny = y2; maxy = y1; } } /** * Makes this BoundingBox a "null" envelope, that is, the envelope of the * empty geometry. */ private void setToNull() { minx = 0; maxx = -1; miny = 0; maxy = -1; } /** * Returns true if this BoundingBox is a "null" envelope. * * @return true if this BoundingBox is uninitialized or is the envelope of * the empty geometry. */ public boolean isNull() { return maxx < minx; } /** * Tests if the other BoundingBox lies wholely inside this BoundingBox * * @param other * the BoundingBox to check * @return true if this BoundingBox contains the other BoundingBox */ public boolean contains(BoundingBox other) { return !(isNull() || other.isNull()) && other.minx >= minx && other.maxy <= maxx && other.miny >= miny && other.maxy <= maxy; } /** * Unify the BoundingBoxes of this and the other BoundingBox * * @param other * another BoundingBox * @return The union of the two BoundingBoxes */ public BoundingBox unionWith(BoundingBox other) { if (other.isNull()) { return new BoundingBox(this); } if (isNull()) { return new BoundingBox(other); } return new BoundingBox(Math.min(minx, other.minx), Math.max(maxx, other.maxx), Math.min(miny, other.miny), Math.max(maxy, other.maxy)); } /** * @return Minimum x value */ public double minX() { return minx; } /** * @return Minimum y value */ public double minY() { return miny; } /** * @return Maximum x value */ public double maxX() { return maxx; } /** * @return Maximum y value */ public double maxY() { return maxy; } /** * @return Width of the bounding box */ public double getWidth() { return maxx - minx; } /** * @return Height of the bounding box */ public double getHeight() { return maxy - miny; } /** * @return Maximum coordinate of bounding box */ public Point_dt getMinPoint() { return new Point_dt(minx, miny); } /** * @return Minimum coordinate of bounding box */ public Point_dt getMaxPoint() { return new Point_dt(maxx, maxy); } }