|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||
ObjectAffineTransform
XAffineTransform
public class XAffineTransform
Utility methods for affine transforms. This class provides two kind of services:
AffineTransform.AffineTransform methods
in order to check for permission before changing the transform state.
If checkPermission() is defined to always throw an exception,
then XAffineTransform is immutable.
| referencing/geotk-referencing (download) | View source code for this class |
| Field Summary |
|---|
| Fields inherited from class AffineTransform |
|---|
TYPE_FLIP, TYPE_GENERAL_ROTATION, TYPE_GENERAL_SCALE, TYPE_GENERAL_TRANSFORM, TYPE_IDENTITY, TYPE_MASK_ROTATION, TYPE_MASK_SCALE, TYPE_QUADRANT_ROTATION, TYPE_TRANSLATION, TYPE_UNIFORM_SCALE |
| Constructor Summary | |
|---|---|
protected |
XAffineTransform()
Constructs an identity affine transform. |
|
XAffineTransform(AffineTransform tr)
Constructs a new XAffineTransform that is a
copy of the specified AffineTransform object. |
|
XAffineTransform(double m00,
double m10,
double m01,
double m11,
double m02,
double m12)
Constructs a new XAffineTransform from 6 values representing the 6 specifiable
entries of the 3×3 transformation matrix. |
| Method Summary | |
|---|---|
protected void |
checkPermission()
Checks if the caller is allowed to change this XAffineTransform state. |
void |
concatenate(AffineTransform Tx)
Checks for permission before concatenating this transform. |
static int |
getFlip(AffineTransform tr)
Returns -1 if one axis has been flipped, +1 if no axis has been flipped,
or 0 if unknown. |
static double |
getRotation(AffineTransform tr)
Returns an estimation of the rotation angle in radians. |
static double |
getScale(AffineTransform tr)
Returns a global scale factor for the specified affine transform. |
static AffineTransform |
getScaleInstance(double sx,
double sy,
double anchorx,
double anchory)
Returns an affine transform representing a zoom carried out around a anchor point (x, y). |
static double |
getScaleX0(AffineTransform tr)
Returns the magnitude of scale factor x by cancelling the effect of eventual flip and rotation. |
static double |
getScaleY0(AffineTransform tr)
Returns the magnitude of scale factor y by cancelling the effect of eventual flip and rotation. |
static int |
getSwapXY(AffineTransform tr)
Returns an estimation about whatever the specified transform swaps x and y axis. |
static Point2D |
inverseDeltaTransform(AffineTransform transform,
Point2D source,
Point2D dest)
Calculates the inverse affine transform of a point without without applying the translation components. |
static Rectangle2D |
inverseTransform(AffineTransform transform,
Rectangle2D bounds,
Rectangle2D dest)
Returns a rectangle which entirely contains the inverse transform of bounds. |
void |
invert()
Checks for permission before inverting this transform. |
static boolean |
isIdentity(AffineTransform tr,
double tolerance)
Returns true if the specified affine transform is an identity transform up to the
specified tolerance. |
boolean |
isIdentity(double tolerance)
Checks whether or not this XAffineTransform is the identity by
using the provided tolerance. |
void |
preConcatenate(AffineTransform Tx)
Checks for permission before concatenating this transform. |
void |
quadrantRotate(int numquadrants)
Checks for permission before rotating this transform. |
void |
quadrantRotate(int numquadrants,
double anchorx,
double anchory)
Checks for permission before rotating this transform. |
void |
rotate(double theta)
Checks for permission before rotating this transform. |
void |
rotate(double vecx,
double vecy)
Checks for permission before rotating this transform. |
void |
rotate(double theta,
double anchorx,
double anchory)
Checks for permission before rotating this transform. |
void |
rotate(double vecx,
double vecy,
double anchorx,
double anchory)
Checks for permission before rotating this transform. |
static void |
roundIfAlmostInteger(AffineTransform tr,
double tolerance)
If scale and shear coefficients are close to integers, replaces their current values by their rounded values. |
void |
scale(double sx,
double sy)
Checks for permission before scaling this transform. |
void |
setToIdentity()
Checks for permission before setting this transform. |
void |
setToQuadrantRotation(int numquadrants)
Checks for permission before setting this transform. |
void |
setToQuadrantRotation(int numquadrants,
double anchorx,
double anchory)
Checks for permission before setting this transform. |
void |
setToRotation(double theta)
Checks for permission before setting this transform. |
void |
setToRotation(double vecx,
double vecy)
Checks for permission before setting this transform. |
void |
setToRotation(double theta,
double anchorx,
double anchory)
Checks for permission before setting this transform. |
void |
setToRotation(double vecx,
double vecy,
double anchorx,
double anchory)
Checks for permission before setting this transform. |
void |
setToScale(double sx,
double sy)
Checks for permission before setting this transform. |
void |
setToShear(double shx,
double shy)
Checks for permission before setting this transform. |
void |
setToTranslation(double tx,
double ty)
Checks for permission before setting this transform. |
void |
setTransform(AffineTransform Tx)
Checks for permission before setting this transform. |
void |
setTransform(double m00,
double m10,
double m01,
double m11,
double m02,
double m12)
Checks for permission before setting this transform. |
void |
shear(double shx,
double shy)
Checks for permission before shearing this transform. |
static Rectangle2D |
transform(AffineTransform transform,
Rectangle2D bounds,
Rectangle2D dest)
Returns a rectangle which entirely contains the direct transform of bounds. |
static Shape |
transform(AffineTransform transform,
Shape shape,
boolean overwrite)
Transforms the given shape. |
void |
translate(double tx,
double ty)
Checks for permission before translating this transform. |
| Methods inherited from class Object |
|---|
finalize, getClass, notify, notifyAll, wait, wait, wait |
| Constructor Detail |
|---|
protected XAffineTransform()
checkPermission() method.
Note:
This constructor is protected rather than public in order to avoid accidental
instantation of identity transforms that are not of some subclass, which is
likely to be useless since XAffineTransform is immutable.
public XAffineTransform(AffineTransform tr)
XAffineTransform that is a
copy of the specified AffineTransform object.
tr - The affine transform to copy.
public XAffineTransform(double m00,
double m10,
double m01,
double m11,
double m02,
double m12)
XAffineTransform from 6 values representing the 6 specifiable
entries of the 3×3 transformation matrix. Those values are given unchanged to the
super class constructor.
m00 - the X coordinate scaling.m10 - the Y coordinate shearing.m01 - the X coordinate shearing.m11 - the Y coordinate scaling.m02 - the X coordinate translation.m12 - the Y coordinate translation.| Method Detail |
|---|
protected void checkPermission()
throws UnsupportedOperationException
XAffineTransform state.
If this method is defined to thrown an exception in all case, then this
XAffineTransform is immutable.
The default implementation throws the exception in all case, thus making this instance immutable.
UnsupportedOperationException - if this affine transform is immutable.
public void translate(double tx,
double ty)
translate in class AffineTransformpublic void rotate(double theta)
rotate in class AffineTransform
public void rotate(double theta,
double anchorx,
double anchory)
rotate in class AffineTransform
public void rotate(double vecx,
double vecy)
rotate in class AffineTransform
public void rotate(double vecx,
double vecy,
double anchorx,
double anchory)
rotate in class AffineTransformpublic void quadrantRotate(int numquadrants)
quadrantRotate in class AffineTransform
public void quadrantRotate(int numquadrants,
double anchorx,
double anchory)
quadrantRotate in class AffineTransform
public void scale(double sx,
double sy)
scale in class AffineTransform
public void shear(double shx,
double shy)
shear in class AffineTransformpublic void setToIdentity()
setToIdentity in class AffineTransform
public void setToTranslation(double tx,
double ty)
setToTranslation in class AffineTransformpublic void setToRotation(double theta)
setToRotation in class AffineTransform
public void setToRotation(double theta,
double anchorx,
double anchory)
setToRotation in class AffineTransform
public void setToRotation(double vecx,
double vecy)
setToRotation in class AffineTransform
public void setToRotation(double vecx,
double vecy,
double anchorx,
double anchory)
setToRotation in class AffineTransformpublic void setToQuadrantRotation(int numquadrants)
setToQuadrantRotation in class AffineTransform
public void setToQuadrantRotation(int numquadrants,
double anchorx,
double anchory)
setToQuadrantRotation in class AffineTransform
public void setToScale(double sx,
double sy)
setToScale in class AffineTransform
public void setToShear(double shx,
double shy)
setToShear in class AffineTransformpublic void setTransform(AffineTransform Tx)
setTransform in class AffineTransform
public void setTransform(double m00,
double m10,
double m01,
double m11,
double m02,
double m12)
setTransform in class AffineTransformpublic void concatenate(AffineTransform Tx)
concatenate in class AffineTransformpublic void preConcatenate(AffineTransform Tx)
preConcatenate in class AffineTransform
public void invert()
throws NoninvertibleTransformException
invert in class AffineTransformNoninvertibleTransformExceptionpublic boolean isIdentity(double tolerance)
XAffineTransform is the identity by
using the provided tolerance.
tolerance - The tolerance to use for this check.
true if the transform is identity, false otherwise.
public static boolean isIdentity(AffineTransform tr,
double tolerance)
true if the specified affine transform is an identity transform up to the
specified tolerance. This method is equivalent to computing the difference between this
matrix and an identity matrix (as created by new AffineTransform()) and returning true if and only if all differences are
smaller than or equal to tolerance.
This method is used for working around rounding error in affine transforms resulting from a computation, as in the example below:
┌ ┐ │ 1.0000000000000000001 0.0 0.0 │ │ 0.0 0.999999999999999999999 0.0 │ │ 0.0 0.0 1.0 │ └ ┘
tr - The affine transform to be checked for identity.tolerance - The tolerance value to use when checking for identity.
true if this transformation is close enough to the
identity, false otherwise.
public static Shape transform(AffineTransform transform,
Shape shape,
boolean overwrite)
createTransformedShape except that:
RectangularShape and the given transform do not involve
rotation, then the returned shape may be some instance of the same class.overwrite is true.
transform - Affine transform to use.shape - The shape to transform.overwrite - If true, this method is allowed to overwrite shape with the
transform result. If false, then shape is never modified.
AffineTransform.createTransformedShape(java.awt.Shape)
public static Rectangle2D transform(AffineTransform transform,
Rectangle2D bounds,
Rectangle2D dest)
bounds. This operation is equivalent to:
Note that if the source rectangle is an image bounds and the affine transform is a grid to CRS transform (i.e. if it converts pixel coordinates to "real world" coordinates), then that transform must map the upper-left corner of pixels (as in Java2D usage), not the center of pixels (OGC usage), if the intend is to get the image envelope.createTransformedShape(bounds).getBounds2D()
transform - Affine transform to use.bounds - Rectangle to transform. This rectangle will not be modified except
if dest is the same reference.dest - Rectangle in which to place the result.
If null, a new rectangle will be created.
bounds rectangle.CRS.transform(MathTransform2D, Rectangle2D, Rectangle2D)
public static Rectangle2D inverseTransform(AffineTransform transform,
Rectangle2D bounds,
Rectangle2D dest)
throws NoninvertibleTransformException
bounds. This operation is equivalent to:
createInverse().createTransformedShape(bounds).getBounds2D()
transform - Affine transform to use.bounds - Rectangle to transform. This rectangle will not be modified.dest - Rectangle in which to place the result. If null, a new
rectangle will be created.
bounds rectangle.
NoninvertibleTransformException - if the affine transform can't be inverted.
public static Point2D inverseDeltaTransform(AffineTransform transform,
Point2D source,
Point2D dest)
throws NoninvertibleTransformException
transform - Affine transform to use.source - Point to transform. This rectangle will not be modified.dest - Point in which to place the result. If null, a
new point will be created.
source point.
NoninvertibleTransformException - if the affine transform can't be inverted.public static int getSwapXY(AffineTransform tr)
+1 if the (x, y) axis order seems to be
preserved, -1 if the transform seems to swap axis to the (y,
x) axis order, or 0 if this method can not make a decision.
tr - The affine transform to inspect.
true if the given transform seems to swap axis order.public static double getRotation(AffineTransform tr)
tr - The affine transform to inspect.
NaN
if the angle can not be estimated.public static int getFlip(AffineTransform tr)
-1 if one axis has been flipped, +1 if no axis has been flipped,
or 0 if unknown. A flipped axis in an axis with direction reversed (typically the
y axis). This method assumes that the specified affine transform is built
from arbitrary translations, scales or rotations, but no shear. Note that it is not
possible to determine which of the x or y axis has been flipped.
This method can be used in order to set the sign of a scale according the flipping state. The example below choose to apply the sign on the y scale, but this is an arbitrary (while common) choice:
double scaleX0 = getScaleX0(transform);
double scaleY0 = getScaleY0(transform);
int flip = getFlip(transform);
if (flip != 0) {
scaleY0 *= flip;
// ... continue the process here.
}
This method is similar to the following code, except that this method
distinguish between "unflipped" and "unknown" states.
boolean flipped = (tr.getType() & TYPE_FLIP) != 0;
tr - The affine transform to inspect.
public static double getScaleX0(AffineTransform tr)

tr - The affine transform to inspect.
public static double getScaleY0(AffineTransform tr)

tr - The affine transform to inspect.
public static double getScale(AffineTransform tr)
getScaleX0(tr) and getScaleY0(tr). The way to compute
such a "global" scale is somewhat arbitrary and may change in a future version.
tr - The affine transform to inspect.
public static AffineTransform getScaleInstance(double sx,
double sy,
double anchorx,
double anchory)
sx - Scale along x axis.sy - Scale along y axis.anchorx - x coordinates of the anchor point.anchory - y coordinates of the anchor point.
public static void roundIfAlmostInteger(AffineTransform tr,
double tolerance)
This rounding up is useful for example in order to speedup image displays.
tr - The matrix to round. Rounding will be applied in place.tolerance - The maximal departure from integers in order to allow rounding.
It is typically a small number like 1E-6.XMath.roundIfAlmostInteger(double, int),
MetadataHelper
|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||