FileDocCategorySizeDatePackage
RoundRectangle2D.javaAPI DocJava SE 5 API20627Fri Aug 26 14:56:52 BST 2005java.awt.geom

RoundRectangle2D

public abstract class RoundRectangle2D extends RectangularShape
The RoundRectangle2D class defines a rectangle with rounded corners defined by a location (x, y), a dimension (w x h), and the width and height of an arc with which to round the corners.

This class is the abstract superclass for all objects that store a 2D rounded rectangle. The actual storage representation of the coordinates is left to the subclass.

version
1.18, 12/19/03
author
Jim Graham

Fields Summary
Constructors Summary
protected RoundRectangle2D()
This is an abstract class that cannot be instantiated directly. Type-specific implementation subclasses are available for instantiation and provide a number of formats for storing the information necessary to satisfy the various accessor methods below.

see
java.awt.geom.RoundRectangle2D.Float
see
java.awt.geom.RoundRectangle2D.Double

    
Methods Summary
private intclassify(double coord, double left, double right, double arcsize)

	if (coord < left) {
	    return 0;
	} else if (coord < left + arcsize) {
	    return 1;
	} else if (coord < right - arcsize) {
	    return 2;
	} else if (coord < right) {
	    return 3;
	} else {
	    return 4;
	}
    
public booleancontains(double x, double y, double w, double h)
Tests if the interior of this RoundRectangle2D entirely contains the specified set of rectangular coordinates.

param
x, y the coordinates of the specified set of rectangular coordinates
param
w the width of the specified set of rectangular coordinates
param
h the height of the specified set of rectangular coordinates
return
true if the interior of this RoundRectangle2D entirely contains the specified set of rectangular coordinates; false otherwise.

	if (isEmpty() || w <= 0 || h <= 0) {
	    return false;
	}
	return (contains(x, y) &&
		contains(x + w, y) &&
		contains(x, y + h) &&
		contains(x + w, y + h));
    
public booleancontains(double x, double y)
Tests if the specified coordinates are inside the boundary of this RoundRectangle2D.

param
x, y the coordinates to test
return
true if the specified coordinates are inside the boundary of this RoundRectangle2D; false otherwise.

	if (isEmpty()) {
	    return false;
	}
	double rrx0 = getX();
	double rry0 = getY();
	double rrx1 = rrx0 + getWidth();
	double rry1 = rry0 + getHeight();
	// Check for trivial rejection - point is outside bounding rectangle
	if (x < rrx0 || y < rry0 || x >= rrx1 || y >= rry1) {
	    return false;
	}
	double aw = Math.min(getWidth(), Math.abs(getArcWidth())) / 2.0;
	double ah = Math.min(getHeight(), Math.abs(getArcHeight())) / 2.0;
	// Check which corner point is in and do circular containment
	// test - otherwise simple acceptance
	if (x >= (rrx0 += aw) && x < (rrx0 = rrx1 - aw)) {
	    return true;
	}
	if (y >= (rry0 += ah) && y < (rry0 = rry1 - ah)) {
	    return true;
	}
	x = (x - rrx0) / aw;
	y = (y - rry0) / ah;
	return (x * x + y * y <= 1.0);
    
public abstract doublegetArcHeight()
Gets the height of the arc that rounds off the corners.

return
the height of the arc that rounds off the corners of this RoundRectangle2D.

public abstract doublegetArcWidth()
Gets the width of the arc that rounds off the corners.

return
the width of the arc that rounds off the corners of this RoundRectangle2D.

public java.awt.geom.PathIteratorgetPathIterator(java.awt.geom.AffineTransform at)
Returns an iteration object that defines the boundary of this RoundRectangle2D. The iterator for this class is multi-threaded safe, which means that this RoundRectangle2D class guarantees that modifications to the geometry of this RoundRectangle2D object do not affect any iterations of that geometry that are already in process.

param
at an optional AffineTransform to be applied to the coordinates as they are returned in the iteration, or null if untransformed coordinates are desired
return
the PathIterator object that returns the geometry of the outline of this RoundRectangle2D, one segment at a time.

	return new RoundRectIterator(this, at);
    
public booleanintersects(double x, double y, double w, double h)
Tests if the interior of this RoundRectangle2D intersects the interior of a specified set of rectangular coordinates.

param
x, y the coordinates of the upper left corner of the specified set of rectangular coordinates
param
w the width of the specified set of rectangular coordinates
param
h the height of the specified set of rectangular coordinates
return
true if the interior of this RoundRectangle2D intersects the interior of the specified set of rectangular coordinates.

	if (isEmpty() || w <= 0 || h <= 0) {
	    return false;
	}
	double rrx0 = getX();
	double rry0 = getY();
	double rrx1 = rrx0 + getWidth();
	double rry1 = rry0 + getHeight();
	// Check for trivial rejection - bounding rectangles do not intersect
	if (x + w <= rrx0 || x >= rrx1 || y + h <= rry0 || y >= rry1) {
	    return false;
	}
	double aw = Math.min(getWidth(), Math.abs(getArcWidth())) / 2.0;
	double ah = Math.min(getHeight(), Math.abs(getArcHeight())) / 2.0;
	int x0class = classify(x, rrx0, rrx1, aw);
	int x1class = classify(x + w, rrx0, rrx1, aw);
	int y0class = classify(y, rry0, rry1, ah);
	int y1class = classify(y + h, rry0, rry1, ah);
	// Trivially accept if any point is inside inner rectangle
	if (x0class == 2 || x1class == 2 || y0class == 2 || y1class == 2) {
	    return true;
	}
	// Trivially accept if either edge spans inner rectangle
	if ((x0class < 2 && x1class > 2) || (y0class < 2 && y1class > 2)) {
	    return true;
	}
	// Since neither edge spans the center, then one of the corners
	// must be in one of the rounded edges.  We detect this case if
	// a [xy]0class is 3 or a [xy]1class is 1.  One of those two cases
	// must be true for each direction.
	// We now find a "nearest point" to test for being inside a rounded
	// corner.
	x = (x1class == 1) ? (x = x + w - (rrx0 + aw)) : (x = x - (rrx1 - aw));
	y = (y1class == 1) ? (y = y + h - (rry0 + ah)) : (y = y - (rry1 - ah));
	x = x / aw;
	y = y / ah;
	return (x * x + y * y <= 1.0);
    
public voidsetFrame(double x, double y, double w, double h)
Sets the location and size of the outer bounds of this RoundRectangle2D to the specified rectangular values.

param
x, y the coordinates to which to set the location of this RoundRectangle2D
param
w the width to which to set this RoundRectangle2D
param
h the height to which to set this RoundRectangle2D

	setRoundRect(x, y, w, h, getArcWidth(), getArcHeight());
    
public abstract voidsetRoundRect(double x, double y, double w, double h, double arcWidth, double arcHeight)
Sets the location, size, and corner radii of this RoundRectangle2D to the specified double values.

param
x, y the coordinates to which to set the location of this RoundRectangle2D
param
w the width to which to set this RoundRectangle2D
param
h the height to which to set this RoundRectangle2D
param
arcWidth the width to which to set the arc of this RoundRectangle2D
param
arcHeight the height to which to set the arc of this RoundRectangle2D

public voidsetRoundRect(java.awt.geom.RoundRectangle2D rr)
Sets this RoundRectangle2D to be the same as the specified RoundRectangle2D.

param
rr the specified RoundRectangle2D

	setRoundRect(rr.getX(), rr.getY(), rr.getWidth(), rr.getHeight(),
		     rr.getArcWidth(), rr.getArcHeight());