/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2001-2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.resources.geometry; import java.awt.geom.Line2D; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.io.ObjectStreamException; import java.io.Serializable; /** * An immutable subclass of a {@link Rectangle2D} with bounds extending toward infinities. * The {@link #getMinX} and {@link #getMinY} methods return always * {@link java.lang.Double#NEGATIVE_INFINITY}, while the {@link #getMaxX} and * {@link #getMaxY} methods return always {@link java.lang.Double#POSITIVE_INFINITY}. * This rectangle can be used as argument in the {@link XRectangle2D} constructor for * initializing a new {@code XRectangle2D} to infinite bounds. * * @source $URL$ * @version $Id$ * @author Martin Desruisseaux (IRD) */ final class InfiniteRectangle2D extends Rectangle2D implements Serializable { /** * Serial number for interoperability with different versions. */ private static final long serialVersionUID = 5281254268988984523L; /** * A singleton instance of {@code InfiniteRectangle2D}. */ public static final Rectangle2D INFINITY = new InfiniteRectangle2D(); /** * Private constructor for the {@link #INFINITY} singleton only. */ private InfiniteRectangle2D() { } /** * Returns the minimum value, which is negative infinity. */ public double getX() { return java.lang.Double.NEGATIVE_INFINITY; } /** * Returns the minimum value, which is negative infinity. */ public double getY() { return java.lang.Double.NEGATIVE_INFINITY; } /** * Returns the minimum value, which is negative infinity. */ @Override public double getMinX() { return java.lang.Double.NEGATIVE_INFINITY; } /** * Returns the minimum value, which is negative infinity. */ @Override public double getMinY() { return java.lang.Double.NEGATIVE_INFINITY; } /** * Returns the maximum value, which is positive infinity. */ @Override public double getMaxX() { return java.lang.Double.POSITIVE_INFINITY; } /** * Returns the maximum value, which is positive infinity. */ @Override public double getMaxY() { return java.lang.Double.POSITIVE_INFINITY; } /** * Returns the width, which is positive infinity. */ public double getWidth() { return java.lang.Double.POSITIVE_INFINITY; } /** * Returns the height, which is positive infinity. */ public double getHeight() { return java.lang.Double.POSITIVE_INFINITY; } /** * Returns the center, which is NaN since we can't compute a center from infinite bounds. */ @Override public double getCenterX() { return java.lang.Double.NaN; } /** * Returns the center, which is NaN since we can't compute a center from infinite bounds. */ @Override public double getCenterY() { return java.lang.Double.NaN; } /** * Do nothing, since we can't extends an infinite rectangle. */ @Override public void add(Rectangle2D rect) { } /** * Do nothing, since we can't extends an infinite rectangle. */ @Override public void add(Point2D point) { } /** * Do nothing, since we can't extends an infinite rectangle. */ @Override public void add(double x, double y) { } /** * Returns 0, since the specified point can't be outside this rectangle. */ public int outcode(double x, double y) { return 0; } /** * Returns 0, since the specified point can't be outside this rectangle. */ @Override public int outcode(Point2D point) { return 0; } /** * Returns {@code true} since this rectangle contains all points. */ @Override public boolean contains(Point2D point) { return true; } /** * Returns {@code true} since this rectangle contains all points. */ @Override public boolean contains(Rectangle2D rect) { return true; } /** * Returns {@code true} since this rectangle contains all points. */ @Override public boolean contains(double x, double y) { return true; } /** * Returns {@code true} since this rectangle contains all points. */ @Override public boolean contains(double x, double y, double w, double h) { return true; } /** * Returns {@code true} since this rectangle contains all points. */ @Override public boolean intersects(Rectangle2D rect) { return true; } /** * Returns {@code true} since this rectangle contains all points. */ @Override public boolean intersects(double x, double y, double w, double h) { return true; } /** * Returns {@code true} since this rectangle contains all points. */ @Override public boolean intersectsLine(double x, double y, double u, double v) { return true; } /** * Returns {@code true} since this rectangle contains all points. */ @Override public boolean intersectsLine(Line2D line) { return true; } /** * Returns {@code false} since an infinite rectangle is far from empty. */ public boolean isEmpty() { return false; } /** * Returns {@code this}. * No need to returns a clone, since this rectangle is immutable. */ @Override public Rectangle2D getFrame() { return this; } /** * Returns {@code this}. * No need to returns a clone, since this rectangle is immutable. */ @Override public Rectangle2D getBounds2D() { return this; } /** * Returns {@code this}, since this rectangle can't be extended. * No need to returns a clone, since this rectangle is immutable. */ public Rectangle2D createUnion(Rectangle2D rect) { return this; } /** * Returns a clone of the specified rectangle. */ public Rectangle2D createIntersection(Rectangle2D rect) { return (Rectangle2D)rect.clone(); } /** * Always throws an exception, since this rectangle is immutable. * * @todo Throws UnmodifiableGeometryException instead? * (defined in renderer module for now) */ public void setRect(double x, double y, double w, double h) { throw new UnsupportedOperationException(); } /** * Returns the singleton instance of {@code InfiniteRectangle2D}. */ private Object readResolve() throws ObjectStreamException { return INFINITY; } }