java.awt.geom
类 AffineTransform

java.lang.Object
  继承者 java.awt.geom.AffineTransform
所有已实现的接口:
Serializable, Cloneable

public class AffineTransform
   
   
   
     
     
extends Object
implements Cloneable, Serializable

AffineTransform 类表示 2D 仿射变换,它执行从 2D 坐标到其他 2D 坐标的线性映射,保留了线的“直线性”和“平行性”。可以使用一系列平移 (translation)、缩放 (scale)、翻转 (flip)、旋转 (rotation) 和错切 (shear) 来构造仿射变换。

这样的坐标变换可以使用一个 3 行乘 3 列的矩阵来表示,最后一行默认为 [ 0 0 1 ]。此矩阵将源坐标 (x,y) 变换为目标坐标 (x',y'),这一过程将坐标视为列向量,并用矩阵乘以坐标向量,步骤如下:

        [ x']   [  m00  m01  m02  ] [ x ]   [ m00x + m01y + m02 ]
        [ y'] = [  m10  m11  m12  ] [ y ] = [ m10x + m11y + m12 ]
        [ 1 ]   [   0    0    1   ] [ 1 ]   [         1         ]
 

处理 90 度旋转

AffineTransform 类的 rotate 方法的一些变量中,双精度参数指定了以弧度表示的旋转角度。这些方法为近似 90 度(包括倍数诸如 180、270 和 360 度)的旋转提供特殊的处理,以便更有效地处理象限旋转这类常见情形。这种特殊处理可以导致旋转角度非常接近于 90 度的倍数,从而可以将其视为正好是 90 度的倍数。对于 90 度的小倍数,被视为象限旋转的角度范围大约是 0.00000121 度宽。这一节解释为什么需要特别小心以及如何实现它。

因为 90 度用弧度表示是 PI/2,而 PI 是无限不循环小数(因此是无理数),所以它不能像用弧度表示的精确双精度值那样准确地表示 90 度的倍数。因此,理论上不可以使用 PI 来描述象限旋转(90、180、270 或 360 度)。双精度浮点值可以非常接近 PI/2 的非零倍数,但是不够接近到正弦或余弦能精确到 0.0、1.0 或 -1.0。只有在 Math.sin(0.0) 的情况下,Math.sin()Math.cos() 实现才相应地返回 0.0。但是,对于接近每个 90 度倍数的某些范围内的数,相样的实现却返回 1.0 和 -1.0,因为正确答案是如此接近 1.0 或 -1.0,以至于双精度的有效位数无法像表示接近 0.0 的数那样精确地表示差值。

这些问题归结为:如果在执行这些基于弧度的旋转操作期间,使用 Math.sin()Math.cos() 方法直接生成用于矩阵修改的值,那么严格来说,得到的变换不能归类为象限旋转(即使对于 rotate(Math.PI/2.0) 这样的简单情况也是如此),因为执行正弦和余弦操作而得到的非 0.0 值将造成矩阵的细微变化。如果这些变换不能归类为象限旋转,那么试图根据变换类型优化下一步操作的后续代码会被移交到它最通用的实现中。

因为象限旋转相当常见,所以在对变换应用旋转和对坐标应用所得变换时,此类应该快速合理地处理这些情况。为了达到最佳处理,以弧度为单位测量旋转角度的方法试图检测象限旋转的角度并以这种方式处理它们。因此,如果 Math.sin(theta)Math.cos(theta) 正好返回 1.0 或 -1.0,那么这些方法会将角度 theta 视为象限旋转。实际经验证明,此特性可用于 Math.PI/2.0 的小倍数大约 0.0000000211 弧度(0.00000121 度)的范围。

从以下版本开始:
1.2
另请参见:
序列化表格

字段摘要
static intTYPE_FLIP
          此标志位指示此对象定义的变换除了执行其他标志位指示的转换外,还执行关于某个坐标轴的镜像翻转操作,此操作将通常的右旋坐标系更改为左旋坐标系。
static intTYPE_GENERAL_ROTATION
          此标志位指示此对象定义的变换除了执行其他标志位指示的转换外,还执行任意角度的旋转操作。
static intTYPE_GENERAL_SCALE
          此标志位指示此对象定义的变换除了执行其他标志位指示的转换外,还执行常规缩放操作。
static intTYPE_GENERAL_TRANSFORM
          此常量指示此对象定义的变换执行输入坐标的任意转换操作。
static intTYPE_IDENTITY
          此常量指示此对象定义的变换是恒等变换。
static intTYPE_MASK_ROTATION
          此常量是所有旋转标志位的位掩码。
static intTYPE_MASK_SCALE
          此常量是所有缩放标志位的位掩码。
static intTYPE_QUADRANT_ROTATION
          此标志位指示此对象定义的变换除了执行其他标志位指示的转换外,还通过乘以 90 度的某个倍数执行象限旋转操作。
static intTYPE_TRANSLATION
          此标志位指示此对象定义的变换除了执行其他标志位指示的转换外,还执行平移操作。
static intTYPE_UNIFORM_SCALE
          此标志位指示此对象定义的变换除了执行其他标志位指示的转换外,还执行统一缩放操作。
 
构造方法摘要
AffineTransform()
          构造一个表示恒等变换的新 AffineTransform
AffineTransform(AffineTransform Tx)
          构造一个新 AffineTransform,让它作为指定 AffineTransform 对象的副本。
AffineTransform(double[] flatmatrix)
          根据双精度值数组构造一个新 AffineTransform,该数组要么表示 3x3 变换矩阵的 4 个非平移条目,要么表示它的 6 个可指定条目。
AffineTransform(double m00, double m10, double m01, double m11, double m02, double m12)
          根据表示 3x3 变换矩阵 6 个可指定条目的 6 个双精度值构造一个新 AffineTransform
AffineTransform(float[] flatmatrix)
          根据一个浮点值数组构造一个新 AffineTransform,该数组要么表示 3x3 变换矩阵的 4 个非平移条目,要么表示 3x3 变换矩阵的 6 个可指定条目。
AffineTransform(float m00, float m10, float m01, float m11, float m02, float m12)
          根据表示 3x3 变换矩阵 6 个可指定条目的 6 个浮点值构造一个新 AffineTransform
 
方法摘要
 Objectclone()
          返回此 AffineTransform 对象的副本。
 voidconcatenate(AffineTransform Tx)
          以最常用的方式将 AffineTransformTx 连接到此 AffineTransform Cx,以提供由 Tx 映射到以前用户空间的新用户空间。
 AffineTransformcreateInverse()
          返回表示逆向变换的 AffineTransform 对象。
 ShapecreateTransformedShape(Shape pSrc)
          返回新的 Shape 对象,它在通过此变换之后,由指定 Shape 的几何形状定义。
 voiddeltaTransform(double[] srcPts, int srcOff, double[] dstPts, int dstOff, int numPts)
          通过此变换来变换相对距离向量数组。
 Point2DdeltaTransform(Point2D ptSrc, Point2D ptDst)
          变换由 ptSrc 指定的相对距离向量,并将结果存储在 ptDst 中。
 booleanequals(Object obj)
          如果此 AffineTransform 表示与指定参数相同的仿射坐标变换,则返回 true
 doublegetDeterminant()
          返回变换的矩阵表示形式的决定因子。
 voidgetMatrix(double[] flatmatrix)
          在 3x3 仿射变换矩阵中检索 6 个可指定值,并将其置于双精度值的数组中。
static AffineTransformgetQuadrantRotateInstance(int numquadrants)
          返回按指定象限数旋转坐标的变换。
static AffineTransformgetQuadrantRotateInstance(int numquadrants, double anchorx, double anchory)
          返回按指定象限数绕指定锚点旋转坐标的变换。
static AffineTransformgetRotateInstance(double theta)
          返回表示旋转变换的变换。
static AffineTransformgetRotateInstance(double vecx, double vecy)
          返回根据旋转向量旋转坐标的变换。
static AffineTransformgetRotateInstance(double theta, double anchorx, double anchory)
          返回绕锚点旋转坐标的变换。
static AffineTransformgetRotateInstance(double vecx, double vecy, double anchorx, double anchory)
          返回根据旋转向量绕锚点坐标旋转坐标的变换。
static AffineTransformgetScaleInstance(double sx, double sy)
          返回表示缩放变换的变换。
 doublegetScaleX()
          返回 3x3 仿射变换矩阵缩放元素 (m00) 的 X 坐标。
 doublegetScaleY()
          返回 3x3 仿射变换矩阵缩放元素 (m11) 的 Y 坐标。
static AffineTransformgetShearInstance(double shx, double shy)
          返回表示错切变换的变换。
 doublegetShearX()
          返回 3x3 仿射变换矩阵错切元素 (m01) 的 X 坐标。
 doublegetShearY()
          返回 3x3 仿射变换矩阵错切元素 (m10) 的 Y 坐标。
static AffineTransformgetTranslateInstance(double tx, double ty)
          返回表示平移变换的变换。
 doublegetTranslateX()
          返回 3x3 仿射变换矩阵平移元素 (m02) 的 X 坐标。
 doublegetTranslateY()
          返回 3x3 仿射变换矩阵平移元素 (m12) 的 Y 坐标。
 intgetType()
          检索描述此变换的变换属性的标志位。
 inthashCode()
          返回此变换的哈希码。
 voidinverseTransform(double[] srcPts, int srcOff, double[] dstPts, int dstOff, int numPts)
          通过此变换来逆向变换双精度坐标数组。
 Point2DinverseTransform(Point2D ptSrc, Point2D ptDst)
          逆向变换指定的 ptSrc 并将结果存储在 ptDst 中。
 voidinvert()
          将此变换设置为它自身的逆变换。
 booleanisIdentity()
          如果此 AffineTransform 是恒等变换,则返回 true
 voidpreConcatenate(AffineTransform Tx)
          以不常用的方式将 AffineTransformTx 连接到此 AffineTransform Cx,从而 Tx 相对于绝对像素空间(而非相对于现有用户空间)修改坐标变换。
 voidquadrantRotate(int numquadrants)
          连接此变换与按照指定象限数旋转坐标的变换。
 voidquadrantRotate(int numquadrants, double anchorx, double anchory)
          连接此变换与按指定象限数绕指定锚点旋转坐标的变换。
 voidrotate(double theta)
          连接此变换与旋转变换。
 voidrotate(double vecx, double vecy)
          连接此变换与根据旋转向量旋转坐标的变换。
 voidrotate(double theta, double anchorx, double anchory)
          连接此变换与绕锚点旋转坐标的变换。
 voidrotate(double vecx, double vecy, double anchorx, double anchory)
          连接此变换与根据旋转向量绕锚点旋转坐标的变换。
 voidscale(double sx, double sy)
          连接此变换与缩放变换。
 voidsetToIdentity()
          将此变换重置为恒等变换。
 voidsetToQuadrantRotation(int numquadrants)
          将此变换设置为按指定象限数旋转坐标的旋转变换。
 voidsetToQuadrantRotation(int numquadrants, double anchorx, double anchory)
          将此变换设置为按指定象限数绕指定锚点旋转坐标的平移旋转变换。
 voidsetToRotation(double theta)
          将此变换设置为旋转变换。
 voidsetToRotation(double vecx, double vecy)
          将此变换设置为根据旋转向量旋转坐标的旋转变换。
 voidsetToRotation(double theta, double anchorx, double anchory)
          将此变换设置为平移的旋转变换。
 voidsetToRotation(double vecx, double vecy, double anchorx, double anchory)
          将此变换设置为根据旋转向量绕锚点旋转坐标的旋转变换。
 voidsetToScale(double sx, double sy)
          将此变换设置为缩放变换。
 voidsetToShear(double shx, double shy)
          将此变换设置为错切变换。
 voidsetToTranslation(double tx, double ty)
          将此变换设置为平移变换。
 voidsetTransform(AffineTransform Tx)
          将此变换设置为指定 AffineTransform 对象中变换的副本。
 voidsetTransform(double m00, double m10, double m01, double m11, double m02, double m12)
          将此变换设置为 6 个双精度值指定的矩阵。
 voidshear(double shx, double shy)
          连接此变换与错切变换。
 StringtoString()
          返回表示此 Object 值的 String
 voidtransform(double[] srcPts, int srcOff, double[] dstPts, int dstOff, int numPts)
          通过此变换来变换双精度坐标数组。
 voidtransform(double[] srcPts, int srcOff, float[] dstPts, int dstOff, int numPts)
          通过此变换来变换双精度坐标数组,并将结果存储在 float 数组中。
 voidtransform(float[] srcPts, int srcOff, double[] dstPts, int dstOff, int numPts)
          通过此变换来变换浮点坐标数组,并将结果存储在 double 数组中。
 voidtransform(float[] srcPts, int srcOff, float[] dstPts, int dstOff, int numPts)
          通过此变换来变换浮点坐标数组。
 voidtransform(Point2D[] ptSrc, int srcOff, Point2D[] ptDst, int dstOff, int numPts)
          通过此变换来变换点对象数组。
 Point2Dtransform(Point2D ptSrc, Point2D ptDst)
          变换指定的 ptSrc 并将结果存储在 ptDst 中。
 voidtranslate(double tx, double ty)
          连接此变换与平移变换。
 
从类 java.lang.Object 继承的方法
finalize, getClass, notify, notifyAll, wait, wait, wait
 

字段详细信息

TYPE_IDENTITY

public static final int TYPE_IDENTITY
此常量指示此对象定义的变换是恒等变换。恒等变换是一种输出坐标始终与输入坐标相同的变换。如果此变换不是恒等变换,则类型要么是常量 GENERAL_TRANSFORM,要么是此变换执行的不同坐标转换的适当标志位的组合。

从以下版本开始:
1.2
另请参见:
TYPE_TRANSLATION, TYPE_UNIFORM_SCALE, TYPE_GENERAL_SCALE, TYPE_FLIP, TYPE_QUADRANT_ROTATION, TYPE_GENERAL_ROTATION, TYPE_GENERAL_TRANSFORM, getType(), 常量字段值

TYPE_TRANSLATION

public static final int TYPE_TRANSLATION
此标志位指示此对象定义的变换除了执行其他标志位指示的转换外,还执行平移操作。平移按照常量 x 和 y 移动坐标,不改变向量的长度和角度。

从以下版本开始:
1.2
另请参见:
TYPE_IDENTITY, TYPE_UNIFORM_SCALE, TYPE_GENERAL_SCALE, TYPE_FLIP, TYPE_QUADRANT_ROTATION, TYPE_GENERAL_ROTATION, TYPE_GENERAL_TRANSFORM, getType(), 常量字段值

TYPE_UNIFORM_SCALE

public static final int TYPE_UNIFORM_SCALE
此标志位指示此对象定义的变换除了执行其他标志位指示的转换外,还执行统一缩放操作。统一缩放在 x 和 y 方向上使用相同的量乘以向量的长度,不改变向量之间的角度。此标志位与 TYPE_GENERAL_SCALE 标志互斥。

从以下版本开始:
1.2
另请参见:
TYPE_IDENTITY, TYPE_TRANSLATION, TYPE_GENERAL_SCALE, TYPE_FLIP, TYPE_QUADRANT_ROTATION, TYPE_GENERAL_ROTATION, TYPE_GENERAL_TRANSFORM, getType(), 常量字段值

TYPE_GENERAL_SCALE

public static final int TYPE_GENERAL_SCALE
此标志位指示此对象定义的变换除了执行其他标志位指示的转换外,还执行常规缩放操作。常规缩放在 x 和 y 方向上使用不同的量乘以向量的长度,不改变垂直向量之间的角度。此标志位与 TYPE_UNIFORM_SCALE 标志互斥。

从以下版本开始:
1.2
另请参见:
TYPE_IDENTITY, TYPE_TRANSLATION, TYPE_UNIFORM_SCALE, TYPE_FLIP, TYPE_QUADRANT_ROTATION, TYPE_GENERAL_ROTATION, TYPE_GENERAL_TRANSFORM, getType(), 常量字段值

TYPE_MASK_SCALE

public static final int TYPE_MASK_SCALE
此常量是所有缩放标志位的位掩码。

从以下版本开始:
1.2
另请参见:
TYPE_UNIFORM_SCALE, TYPE_GENERAL_SCALE, 常量字段值

TYPE_FLIP

public static final int TYPE_FLIP
此标志位指示此对象定义的变换除了执行其他标志位指示的转换外,还执行关于某个坐标轴的镜像翻转操作,此操作将通常的右旋坐标系更改为左旋坐标系。右旋坐标系按逆时针方向旋转 X 正半轴能覆盖 Y 正半轴,类似于凝视右手拇指末端时其余手指弯曲的方向。左旋坐标系按顺时针方向旋转 X 正半轴能覆盖 Y 正半轴,类似于左手手指弯曲的方向。不存在确定初始反转或镜像变换角度的数学方式,因为给定适当的调整旋转后,翻转的所有角度都相同。

从以下版本开始:
1.2
另请参见:
TYPE_IDENTITY, TYPE_TRANSLATION, TYPE_UNIFORM_SCALE, TYPE_GENERAL_SCALE, TYPE_QUADRANT_ROTATION, TYPE_GENERAL_ROTATION, TYPE_GENERAL_TRANSFORM, getType(), 常量字段值