summaryrefslogtreecommitdiffstats
path: root/awt/java/awt/geom/RectangularShape.java
diff options
context:
space:
mode:
Diffstat (limited to 'awt/java/awt/geom/RectangularShape.java')
-rw-r--r--awt/java/awt/geom/RectangularShape.java276
1 files changed, 276 insertions, 0 deletions
diff --git a/awt/java/awt/geom/RectangularShape.java b/awt/java/awt/geom/RectangularShape.java
new file mode 100644
index 0000000..0a77dfd
--- /dev/null
+++ b/awt/java/awt/geom/RectangularShape.java
@@ -0,0 +1,276 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ * @author Denis M. Kishenko
+ * @version $Revision$
+ */
+package java.awt.geom;
+
+import java.awt.Rectangle;
+import java.awt.Shape;
+
+/**
+ * The Class RectangularShape represents a Shape whose data is
+ * (at least partially) described by a rectangular frame. This includes
+ * shapes which are obviously rectangular (such as Rectangle2D) as well as
+ * shapes like Arc2D which are largely determined by the rectangle they
+ * fit inside.
+ */
+public abstract class RectangularShape implements Shape, Cloneable {
+
+ /**
+ * Instantiates a new rectangular shape.
+ */
+ protected RectangularShape() {
+ }
+
+ /**
+ * Gets the x coordinate of the upper left corner of the rectangle.
+ *
+ * @return the x coordinate of the upper left corner of the rectangle.
+ */
+ public abstract double getX();
+
+ /**
+ * Gets the y coordinate of the upper left corner of the rectangle.
+ *
+ * @return the y coordinate of the upper left corner of the rectangle.
+ */
+ public abstract double getY();
+
+ /**
+ * Gets the width of the rectangle.
+ *
+ * @return the width of the rectangle.
+ */
+ public abstract double getWidth();
+
+ /**
+ * Gets the height of the rectangle.
+ *
+ * @return the height of the rectangle.
+ */
+ public abstract double getHeight();
+
+ /**
+ * Checks if this is an empty rectangle: one with zero as its width or height.
+ *
+ * @return true, if the width or height is empty.
+ */
+ public abstract boolean isEmpty();
+
+ /**
+ * Sets the data for the bounding rectangle in terms of double values.
+ *
+ * @param x the x coordinate of the upper left corner of the rectangle.
+ * @param y the y coordinate of the upper left corner of the rectangle.
+ * @param w the width of the rectangle.
+ * @param h the height of the rectangle.
+ */
+ public abstract void setFrame(double x, double y, double w, double h);
+
+ /**
+ * Gets the minimum x value of the bounding rectangle (the x
+ * coordinate of the upper left corner of the rectangle).
+ *
+ * @return the minimum x value of the bounding rectangle.
+ */
+ public double getMinX() {
+ return getX();
+ }
+
+ /**
+ * Gets the minimum y value of the bounding rectangle (the y
+ * coordinate of the upper left corner of the rectangle).
+ *
+ * @return the minimum y value of the bounding rectangle.
+ */
+ public double getMinY() {
+ return getY();
+ }
+
+ /**
+ * Gets the maximum x value of the bounding rectangle (the x
+ * coordinate of the upper left corner of the rectangle plus the
+ * rectangle's width).
+ *
+ * @return the maximum x value of the bounding rectangle.
+ */
+ public double getMaxX() {
+ return getX() + getWidth();
+ }
+
+ /**
+ * Gets the maximum y value of the bounding rectangle (the y
+ * coordinate of the upper left corner of the rectangle plus the
+ * rectangle's height).
+ *
+ * @return the maximum y value of the bounding rectangle.
+ */
+ public double getMaxY() {
+ return getY() + getHeight();
+ }
+
+ /**
+ * Gets the x coordinate of the center of the rectangle.
+ *
+ * @return the x coordinate of the center of the rectangle.
+ */
+ public double getCenterX() {
+ return getX() + getWidth() / 2.0;
+ }
+
+ /**
+ * Gets the y coordinate of the center of the rectangle.
+ *
+ * @return the y coordinate of the center of the rectangle.
+ */
+ public double getCenterY() {
+ return getY() + getHeight() / 2.0;
+ }
+
+ /**
+ * Places the rectangle's size and location data in a new Rectangle2D
+ * object and returns it.
+ *
+ * @return the bounding rectangle as a new Rectangle2D object.
+ */
+ public Rectangle2D getFrame() {
+ return new Rectangle2D.Double(getX(), getY(), getWidth(), getHeight());
+ }
+
+ /**
+ * Sets the bounding rectangle in terms of a Point2D which gives its
+ * upper left corner and a Dimension2D object giving its width and height.
+ *
+ * @param loc the new upper left corner coordinate.
+ * @param size the new size dimensions.
+ */
+ public void setFrame(Point2D loc, Dimension2D size) {
+ setFrame(loc.getX(), loc.getY(), size.getWidth(), size.getHeight());
+ }
+
+ /**
+ * Sets the bounding rectangle to match the data contained in the
+ * specified Rectangle2D.
+ *
+ * @param r the rectangle that gives the new frame data.
+ */
+ public void setFrame(Rectangle2D r) {
+ setFrame(r.getX(), r.getY(), r.getWidth(), r.getHeight());
+ }
+
+ /**
+ * Sets the framing rectangle given two opposite corners. Any two corners
+ * may be used in any order as long as they are diagonally opposite one another.
+ *
+ * @param x1 the x coordinate of one of the corner points.
+ * @param y1 the y coordinate of one of the corner points.
+ * @param x2 the x coordinate of the other corner point.
+ * @param y2 the y coordinate of the other corner point.
+ */
+ public void setFrameFromDiagonal(double x1, double y1, double x2, double y2) {
+ double rx, ry, rw, rh;
+ if (x1 < x2) {
+ rx = x1;
+ rw = x2 - x1;
+ } else {
+ rx = x2;
+ rw = x1 - x2;
+ }
+ if (y1 < y2) {
+ ry = y1;
+ rh = y2 - y1;
+ } else {
+ ry = y2;
+ rh = y1 - y2;
+ }
+ setFrame(rx, ry, rw, rh);
+ }
+
+ /**
+ * Sets the framing rectangle given two opposite corners. Any two corners
+ * may be used in any order as long as they are diagonally opposite one another.
+ *
+ * @param p1 one of the corner points.
+ * @param p2 the other corner point.
+ */
+ public void setFrameFromDiagonal(Point2D p1, Point2D p2) {
+ setFrameFromDiagonal(p1.getX(), p1.getY(), p2.getX(), p2.getY());
+ }
+
+ /**
+ * Sets the framing rectangle given the center point and one corner. Any
+ * corner may be used.
+ *
+ * @param centerX the x coordinate of the center point.
+ * @param centerY the y coordinate of the center point.
+ * @param cornerX the x coordinate of one of the corner points.
+ * @param cornerY the y coordinate of one of the corner points.
+ */
+ public void setFrameFromCenter(double centerX, double centerY, double cornerX, double cornerY) {
+ double width = Math.abs(cornerX - centerX);
+ double height = Math.abs(cornerY - centerY);
+ setFrame(centerX - width, centerY - height, width * 2.0, height * 2.0);
+ }
+
+ /**
+ * Sets the framing rectangle given the center point and one corner. Any
+ * corner may be used.
+ *
+ * @param center the center point.
+ * @param corner a corner point.
+ */
+ public void setFrameFromCenter(Point2D center, Point2D corner) {
+ setFrameFromCenter(center.getX(), center.getY(), corner.getX(), corner.getY());
+ }
+
+ public boolean contains(Point2D point) {
+ return contains(point.getX(), point.getY());
+ }
+
+ public boolean intersects(Rectangle2D rect) {
+ return intersects(rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight());
+ }
+
+ public boolean contains(Rectangle2D rect) {
+ return contains(rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight());
+ }
+
+ public Rectangle getBounds() {
+ int x1 = (int)Math.floor(getMinX());
+ int y1 = (int)Math.floor(getMinY());
+ int x2 = (int)Math.ceil(getMaxX());
+ int y2 = (int)Math.ceil(getMaxY());
+ return new Rectangle(x1, y1, x2 - x1, y2 - y1);
+ }
+
+ public PathIterator getPathIterator(AffineTransform t, double flatness) {
+ return new FlatteningPathIterator(getPathIterator(t), flatness);
+ }
+
+ @Override
+ public Object clone() {
+ try {
+ return super.clone();
+ } catch (CloneNotSupportedException e) {
+ throw new InternalError();
+ }
+ }
+
+}
+