Class XAffineTransform
- Object
-
- AffineTransform
-
- XAffineTransform
-
- All Implemented Interfaces:
Serializable
,Cloneable
- Direct Known Subclasses:
AffineTransform2D
public class XAffineTransform extends AffineTransform
Utility methods for affine transforms. This class provides two kind of services:-
A set of public static methods working on any
AffineTransform
. -
An abstract base class that override all mutable
AffineTransform
methods in order to check for permission before changing the transform's state. IfcheckPermission()
is defined to always throw an exception, thenXAffineTransform
is immutable.
- Since:
- 2.3
- Author:
- Martin Desruisseaux (IRD), Simone Giannecchini
- See Also:
- Serialized Form
-
-
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
Constructors Constructor Description XAffineTransform(double m00, double m10, double m01, double m11, double m02, double m12)
Constructs a newXAffineTransform
from 6 values representing the 6 specifiable entries of the 3×3 transformation matrix.XAffineTransform(AffineTransform tr)
Constructs a newXAffineTransform
that is a copy of the specifiedAffineTransform
object.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description protected void
checkPermission()
Checks if the caller is allowed to change thisXAffineTransform
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 x, double y)
Returns an affine transform representing a zoom carried out around a central 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 ofbounds
.boolean
isIdentity(double tolerance)
Checks whether or not thisXAffineTransform
is the identity by using the providedtolerance
.static boolean
isIdentity(AffineTransform tr, double tolerance)
Returnstrue
if the specified affine transform is an identity transform up to the specified tolerance.void
preConcatenate(AffineTransform Tx)
Checks for permission before concatenating this transform.void
rotate(double theta)
Checks for permission before rotating this transform.void
rotate(double theta, double x, double y)
Checks for permission before rotating this transform.static void
round(AffineTransform tr, double tolerance)
Checks whether the matrix coefficients are close to whole numbers.void
scale(double sx, double sy)
Checks for permission before scaling this transform.void
setToIdentity()
Checks for permission before setting this transform.void
setToRotation(double theta)
Checks for permission before setting this transform.void
setToRotation(double theta, double x, double y)
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(double m00, double m10, double m01, double m11, double m02, double m12)
Checks for permission before setting this transform.void
setTransform(AffineTransform Tx)
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 ofbounds
.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 AffineTransform
clone, createInverse, createTransformedShape, deltaTransform, deltaTransform, equals, getDeterminant, getMatrix, getQuadrantRotateInstance, getQuadrantRotateInstance, getRotateInstance, getRotateInstance, getRotateInstance, getRotateInstance, getScaleInstance, getScaleX, getScaleY, getShearInstance, getShearX, getShearY, getTranslateInstance, getTranslateX, getTranslateY, getType, hashCode, inverseTransform, inverseTransform, invert, isIdentity, quadrantRotate, quadrantRotate, rotate, rotate, setToQuadrantRotation, setToQuadrantRotation, setToRotation, setToRotation, toString, transform, transform, transform, transform, transform, transform
-
-
-
-
Constructor Detail
-
XAffineTransform
public XAffineTransform(AffineTransform tr)
Constructs a newXAffineTransform
that is a copy of the specifiedAffineTransform
object.
-
XAffineTransform
public XAffineTransform(double m00, double m10, double m01, double m11, double m02, double m12)
Constructs a newXAffineTransform
from 6 values representing the 6 specifiable entries of the 3×3 transformation matrix. Those values are given unchanged to thesuper class constructor
.- Since:
- 2.5
-
-
Method Detail
-
checkPermission
protected void checkPermission() throws UnsupportedOperationException
Checks if the caller is allowed to change thisXAffineTransform
state. If this method is defined to thrown an exception in all case, then thisXAffineTransform
is immutable.The default implementation throws the exception in all case, thus making this instance immutable.
- Throws:
UnsupportedOperationException
- if this affine transform is immutable.
-
translate
public void translate(double tx, double ty)
Checks for permission before translating this transform.- Overrides:
translate
in classAffineTransform
-
rotate
public void rotate(double theta)
Checks for permission before rotating this transform.- Overrides:
rotate
in classAffineTransform
-
rotate
public void rotate(double theta, double x, double y)
Checks for permission before rotating this transform.- Overrides:
rotate
in classAffineTransform
-
scale
public void scale(double sx, double sy)
Checks for permission before scaling this transform.- Overrides:
scale
in classAffineTransform
-
shear
public void shear(double shx, double shy)
Checks for permission before shearing this transform.- Overrides:
shear
in classAffineTransform
-
setToIdentity
public void setToIdentity()
Checks for permission before setting this transform.- Overrides:
setToIdentity
in classAffineTransform
-
setToTranslation
public void setToTranslation(double tx, double ty)
Checks for permission before setting this transform.- Overrides:
setToTranslation
in classAffineTransform
-
setToRotation
public void setToRotation(double theta)
Checks for permission before setting this transform.- Overrides:
setToRotation
in classAffineTransform
-
setToRotation
public void setToRotation(double theta, double x, double y)
Checks for permission before setting this transform.- Overrides:
setToRotation
in classAffineTransform
-
setToScale
public void setToScale(double sx, double sy)
Checks for permission before setting this transform.- Overrides:
setToScale
in classAffineTransform
-
setToShear
public void setToShear(double shx, double shy)
Checks for permission before setting this transform.- Overrides:
setToShear
in classAffineTransform
-
setTransform
public void setTransform(AffineTransform Tx)
Checks for permission before setting this transform.- Overrides:
setTransform
in classAffineTransform
-
setTransform
public void setTransform(double m00, double m10, double m01, double m11, double m02, double m12)
Checks for permission before setting this transform.- Overrides:
setTransform
in classAffineTransform
-
concatenate
public void concatenate(AffineTransform Tx)
Checks for permission before concatenating this transform.- Overrides:
concatenate
in classAffineTransform
-
preConcatenate
public void preConcatenate(AffineTransform Tx)
Checks for permission before concatenating this transform.- Overrides:
preConcatenate
in classAffineTransform
-
isIdentity
public boolean isIdentity(double tolerance)
Checks whether or not thisXAffineTransform
is the identity by using the providedtolerance
.- Parameters:
tolerance
- The tolerance to use for this check.- Returns:
true
if the transform is identity,false
otherwise.- Since:
- 2.3.1
-
isIdentity
public static boolean isIdentity(AffineTransform tr, double tolerance)
Returnstrue
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 bynew AffineTransform()
) and returningtrue
if and only if all differences are smaller than or equal totolerance
.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 ]
- Parameters:
tr
- The affine transform to be checked for identity.tolerance
- The tolerance value to use when checking for identity. returntrue
if this tranformation is close enough to the identity,false
otherwise.- Since:
- 2.3.1
-
transform
public static Shape transform(AffineTransform transform, Shape shape, boolean overwrite)
Transforms the given shape. This method is similar tocreateTransformedShape
except that:- It tries to preserve the shape kind when possible. For example if the given shape is an
instance of
RectangularShape
and the given transform do not involve rotation, then the returned shape may be some instance of the same class. - It tries to recycle the given object if
overwrite
istrue
.
- Parameters:
transform
- Affine transform to use.shape
- The shape to transform.overwrite
- Iftrue
, this method is allowed to overwriteshape
with the transform result. Iffalse
, thenshape
is never modified.- Returns:
- The direct transform of the given shape. May or may not be the same instance than the given shape.
- Since:
- 2.5
- See Also:
AffineTransform.createTransformedShape(java.awt.Shape)
- It tries to preserve the shape kind when possible. For example if the given shape is an
instance of
-
transform
public static Rectangle2D transform(AffineTransform transform, Rectangle2D bounds, Rectangle2D dest)
Returns a rectangle which entirely contains the direct transform ofbounds
. This operation is equivalent to:createTransformedShape(bounds).getBounds2D()
- Parameters:
transform
- Affine transform to use.bounds
- Rectangle to transform. This rectangle will not be modified except ifdest
is the same reference.dest
- Rectangle in which to place the result. If null, a new rectangle will be created.- Returns:
- The direct transform of the
bounds
rectangle. - See Also:
CRS.transform( org.geotools.api.referencing.operation.MathTransform2D, Rectangle2D, Rectangle2D)
-
inverseTransform
public static Rectangle2D inverseTransform(AffineTransform transform, Rectangle2D bounds, Rectangle2D dest) throws NoninvertibleTransformException
Returns a rectangle which entirely contains the inverse transform ofbounds
. This operation is equivalent to:createInverse().createTransformedShape(bounds).getBounds2D()
- Parameters:
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.- Returns:
- The inverse transform of the
bounds
rectangle. - Throws:
NoninvertibleTransformException
- if the affine transform can't be inverted.
-
inverseDeltaTransform
public static Point2D inverseDeltaTransform(AffineTransform transform, Point2D source, Point2D dest) throws NoninvertibleTransformException
Calculates the inverse affine transform of a point without without applying the translation components.- Parameters:
transform
- Affine transform to use.source
- Point to transform. This rectangle will not be modified.dest
- Point in which to place the result. Ifnull
, a new point will be created.- Returns:
- The inverse transform of the
source
point. - Throws:
NoninvertibleTransformException
- if the affine transform can't be inverted.
-
getSwapXY
public static int getSwapXY(AffineTransform tr)
Returns an estimation about whatever the specified transform swaps x and y axis. This method assumes that the specified affine transform is built from arbitrary translations, scales or rotations, but no shear. It returns+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, or0
if this method can not make a decision.
-
getRotation
public static double getRotation(AffineTransform tr)
Returns an estimation of the rotation angle in radians. This method assumes that the specified affine transform is built from arbitrary translations, scales or rotations, but no shear. If a flip has been applied, then this method assumes that the flipped axis is the y one in source CRS space. For a grid to world CRS transform, this is the row number in grid coordinates.- Parameters:
tr
- The affine transform to inspect.- Returns:
- An estimation of the rotation angle in radians, or
NaN
if the angle can not be estimated.
-
getFlip
public static int getFlip(AffineTransform tr)
Returns-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. }
boolean flipped = (tr.getType() & AffineTransform.TYPE_FLIP) != 0;
-
getScaleX0
public static double getScaleX0(AffineTransform tr)
Returns the magnitude of scale factor x by cancelling the effect of eventual flip and rotation. This factor is calculated by .
-
getScaleY0
public static double getScaleY0(AffineTransform tr)
Returns the magnitude of scale factor y by cancelling the effect of eventual flip and rotation. This factor is calculated by .
-
getScale
public static double getScale(AffineTransform tr)
Returns a global scale factor for the specified affine transform. This scale factor will combinesgetScaleX0(java.awt.geom.AffineTransform)
andgetScaleY0(java.awt.geom.AffineTransform)
. The way to compute such a "global" scale is somewhat arbitrary and may change in a future version.
-
getScaleInstance
public static AffineTransform getScaleInstance(double sx, double sy, double x, double y)
Returns an affine transform representing a zoom carried out around a central point (x, y). The transforms will leave the specified (x, y) coordinate unchanged.- Parameters:
sx
- Scale along x axis.sy
- Scale along y axis.x
- x coordinates of the central point.y
- y coordinates of the central point.- Returns:
- Affine transform of a zoom which leaves the (x,y) coordinate unchanged.
-
round
public static void round(AffineTransform tr, double tolerance)
Checks whether the matrix coefficients are close to whole numbers. If this is the case, these coefficients will be rounded up to the nearest whole numbers. This rounding up is useful, for example, for speeding up image displays. Above all, it is efficient when we know that a matrix has a chance of being close to the similarity matrix.- Parameters:
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 like1E-6
.- Since:
- 2.3.1
-
-