

PREV CLASS NEXT CLASS  FRAMES NO FRAMES  
SUMMARY: NESTED  FIELD  CONSTR  METHOD  DETAIL: FIELD  CONSTR  METHOD 
java.lang.Object edu.neu.ccs.gui.AlgebraicArea
Class AlgebraicArea
provides static methods
to compute the signed area of a Java Shape
and
of a JPT PathList
object.
The area computation is based on calculus. Since any Shape or PathList is built by a combination of 5 commands (move, line, quad, cubic, and close), the calculus may be done in advance and the area reduced to algebraic formulas in the x,y coordinates of the path data. The resulting formulas for lines, quads, and cubics are instantiated in static helper methods.
Limitations of computing signed area via calculus.
If a path is a simple path (one segment) and has no self intersections, then the area will be numerically valid.
If the path has multiple segments or self intersections, then portions of the area may be added in multiple times or may cancel out if the orientations of different portions of the path are opposite. For example, a perfectly symmetrical figure8 will have zero area. A path that goes over the same geometric point sequence multiple times will add up the area multiple times. Therefore, the tools in this class must be used with care.
The Sign of the Area
The interpretation of the sign of the area depends on the point of view adopted.
Mathematics View: In mathematics, the xaxis increases to the right, the yaxis increases upwards, and the origin is usually in the lower left. In this view, a simple path has positive area if it is oriented clockwise and negative area if it is oriented counterclockwise.
Computer Graphics View: In computer graphics, the origin is always at the upper left of the entity in question (screen or window), the xaxis increases to the right, and the yaxis increases downwards. In effect, this is a mirror reflection of the Mathematics View, with the mirror being a horizontal axis. The effect of mirror reflection is to interchange clockwise and counterclockwise. Thus, in the computer graphics view, a simple path has positive area if it is oriented counterclockwise and negative area if it is oriented clockwise.
Classic Java shapes such as rectangles and ellipses are created as shapes in a clockwise fashion relative to the computer graphics view. Thus, the area functions in this class will return a negative signed area for the classic shapes.
To sidestep the issue of sign, we provide the absolute area
functions absArea
which return the absolute value
of the signed area.
Notes on Numerical Accuracy
Java stores path data in the GeneralPath
class
in float
format. This is an unfortunate artifact
of the time period when Java was designed. To obtain the path
data for an arbitrary Shape
, one must go through
the GeneralPath
class, and hence the precision of
the data is inherently float
.
The JPT class PathList
provides an accessible
data structure for a path as a list of PathNode
objects plus a winding rule. To allow one to go back and
forth between a Shape
and a PathList
without changes of precision, we made the decision in JPT to
store data in a PathNode
object in
float
format. This was a reluctant decision.
In any case, the available path data for area computation is
in float
format so no greater precision is possible.
Nevertheless, to reduce roundoff error, the internal calculations
of area are done in double precision. That is why the helper
methods return type double
.
Notes on Circles and Ellipses
Circles and ellipses are approximated in Java by 4 cubic Bezier segments. This approximation does NOT preserve area. Hence, if the area of a circle of radius 1 is computed by the methods of this class, the result will be close to but not equal to the correct value, pi. Therefore, if you require a more accurate area for circles and ellipses, use the traditional mathematical formulas.
The advantage of the tools in this class is that they give accurate signed area to floating point precision based on the actual path representation of a shape as lines, quads, and cubics.
Constructor Summary  
private 
AlgebraicArea()
Prevent instantiation. 
Method Summary  
static float 
absArea(PathList path)
Returns the absolute value of area(path) . 
static float 
absArea(Shape shape)
Returns the absolute value of area(shape) . 
static float 
area(PathList path)
Returns the signed area enclosed by the given path following calculus conventions for its computation. 
static float 
area(Shape shape)
Returns the signed area enclosed by the given shape following calculus conventions for its computation. 
static double 
area1(double x0,
double y0,
double x1,
double y1)
Returns the signed area of the trapezoid bounded by the line from (x0,y0) to (x1,y1), the xaxis, and vertical lines dropped from the endpoints of the line to the xaxis. 
static double 
area2(double x0,
double y0,
double x1,
double y1,
double x2,
double y2)
Returns the signed area of the generalized trapezoid bounded by the quadratic Bezier curve with control points (x0,y0), (x1,y1), (x2,y2), the xaxis, and vertical lines dropped from the endpoints of the curve to the xaxis. 
static double 
area3(double x0,
double y0,
double x1,
double y1,
double x2,
double y2,
double x3,
double y3)
Returns the signed area of the generalized trapezoid bounded by the cubic Bezier curve with control points (x0,y0), (x1,y1), (x2,y2), (x3,y3), the xaxis, and vertical lines dropped from the endpoints of the curve to the xaxis. 
Methods inherited from class java.lang.Object 
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait 
Constructor Detail 
private AlgebraicArea()
Method Detail 
public static double area1(double x0, double y0, double x1, double y1)
Returns the signed area of the trapezoid bounded by the line from (x0,y0) to (x1,y1), the xaxis, and vertical lines dropped from the endpoints of the line to the xaxis.
The formula computed is:
(x1  x0) * (y0 + y1) / 2
public static double area2(double x0, double y0, double x1, double y1, double x2, double y2)
Returns the signed area of the generalized trapezoid bounded by the quadratic Bezier curve with control points (x0,y0), (x1,y1), (x2,y2), the xaxis, and vertical lines dropped from the endpoints of the curve to the xaxis.
The formula computed is:
((x1  x0) * (3 * y0 + 2 * y1 + y2) + (x2  x1) * (y0 + 2 * y1 + 3 * y2)) / 6
public static double area3(double x0, double y0, double x1, double y1, double x2, double y2, double x3, double y3)
Returns the signed area of the generalized trapezoid bounded by the cubic Bezier curve with control points (x0,y0), (x1,y1), (x2,y2), (x3,y3), the xaxis, and vertical lines dropped from the endpoints of the curve to the xaxis.
The formula computed is:
((x1  x0) * (10 * y0 + 6 * y1 + 3 * y2 + y3) + (x2  x1) * (4 * y0 + 6 * y1 + 6 * y2 + 4 * y3) + (x3  x2) * (y0 + 3 * y1 + 6 * y2 + 10 * y3)) / 20
public static float area(PathList path)
Returns the signed area enclosed by the given path following calculus conventions for its computation.
Returns zero if the given path is null
or empty.
As of 2.6.0a, parallels the changes to the class
PathList
to attempt the area computation
even if the path list does not start with a move.
Skips all initial nodes that are close nodes. Then
uses the endpoint of the first nonclose node to seed
the initial position for the area computation. After
that, the computation proceeds using the path data as
it would if the path list were valid.
path
 the path whose area is to be computedpublic static float area(Shape shape)
Returns the signed area enclosed by the given shape following calculus conventions for its computation.
Returns zero if the given shape is null
.
shape
 the shape whose area is to be computedpublic static float absArea(PathList path)
Returns the absolute value of area(path)
.
path
 the path whose area is to be computedpublic static float absArea(Shape shape)
Returns the absolute value of area(shape)
.
shape
 the shape whose area is to be computed


PREV CLASS NEXT CLASS  FRAMES NO FRAMES  
SUMMARY: NESTED  FIELD  CONSTR  METHOD  DETAIL: FIELD  CONSTR  METHOD 