Module java.desktop
Package java.awt.geom

Class AffineTransform

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

public class AffineTransform extends Object implements Cloneable, Serializable
AffineTransform类表示一个二维仿射变换,它执行从二维坐标到其他二维坐标的线性映射,保持线的“直线性”和“平行性”。可以使用平移、缩放、翻转、旋转和剪切的序列构造仿射变换。

这样的坐标变换可以用一个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度的倍数准确表示为以弧度测量的双精度值。因此,理论上不可能使用这些值准确描述象限旋转(90、180、270或360度)。双精度浮点值可以非常接近非零倍数的PI/2,但永远不会接近正好为0.0、1.0或-1.0的正弦或余弦。相应地,Math.sin()Math.cos()的实现永远不会返回0.0,除了Math.sin(0.0)之外的任何情况。然而,这些实现确实对每个90度的倍数周围的一些范围返回确切的1.0和-1.0,因为正确答案非常接近1.0或-1.0,双精度有效数字不能像对接近0.0的数字那样准确地表示差异。

这些问题的最终结果是,如果在这些基于弧度的旋转操作期间使用Math.sin()Math.cos()方法直接生成矩阵修改的值,则即使对于简单情况如rotate(Math.PI/2.0),由于由于正弦和余弦获得的非0.0值引起的矩阵的微小变化,生成的变换也永远不会严格可分类为象限旋转。如果这些变换不被分类为象限旋转,则基于变换类型尝试优化进一步操作的后续代码将被限制为其最一般的实现。

由于象限旋转相当常见,因此该类应该快速处理这些情况,既在将旋转应用于变换时,也在将结果变换应用于坐标时。为了促进这种最佳处理,以弧度测量旋转角度的方法尝试检测意图作为象限旋转的角度,并将其视为这样处理。因此,这些方法将一个角度theta视为象限旋转,如果Math.sin(theta)Math.cos(theta)返回确切的1.0或-1.0。作为一个经验法则,对于大约0.0000000211弧度(或0.00000121度)范围内的小倍数Math.PI/2.0,这个属性成立。

自版本:
1.2
参见:
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final int
    此标志位指示由此对象定义的变换执行关于某个轴的镜像翻转,将通常的右手坐标系更改为左手坐标系,除了其他标志位指示的转换。
    static final int
    此标志位指示由此对象定义的变换执行任意角度的旋转,除了其他标志位指示的转换。
    static final int
    此标志位指示由此对象定义的变换执行一般缩放,除了其他标志位指示的转换。
    static final int
    此常量指示由此对象定义的变换执行输入坐标的任意转换。
    static final int
    此常量指示由此对象定义的变换是一个恒等变换。
    static final int
    此常量是任何旋转标志位的位掩码。
    static final int
    此常量是任何缩放标志位的位掩码。
    static final int
    此标志位指示由此对象定义的变换执行某个90度的倍数的象限旋转,除了其他标志位指示的转换。
    static final int
    此标志位指示由此对象定义的变换执行平移,除了其他标志位指示的转换。
    static final int
    此标志位指示由此对象定义的变换执行均匀缩放,除了其他标志位指示的转换。
  • Constructor Summary

    Constructors
    Constructor
    Description
    构造一个表示恒等变换的新AffineTransform
    AffineTransform(double[] flatmatrix)
    从表示3x3变换矩阵的4个非平移条目或6个可指定条目的双精度值数组构造一个新的AffineTransform
    AffineTransform(double m00, double m10, double m01, double m11, double m02, double m12)
    从表示3x3变换矩阵的6个可指定条目的双精度值构造一个新的AffineTransform
    AffineTransform(float[] flatmatrix)
    从表示3x3变换矩阵的4个非平移条目或6个可指定条目的浮点值数组构造一个新的AffineTransform
    AffineTransform(float m00, float m10, float m01, float m11, float m02, float m12)
    从表示3x3变换矩阵的6个可指定条目的浮点值构造一个新的AffineTransform
    构造一个与指定的AffineTransform对象相同的新AffineTransform
  • Method Summary

    Modifier and Type
    Method
    Description
    clone()
    返回此AffineTransform对象的副本。
    void
    AffineTransform Tx连接到此AffineTransform Cx,以最常用的方式提供一个新的用户空间,该用户空间通过Tx映射到前一个用户空间。
    返回表示逆变换的AffineTransform对象。
    返回由指定Shape的几何形状经过此变换转换后定义的新Shape对象。
    void
    deltaTransform(double[] srcPts, int srcOff, double[] dstPts, int dstOff, int numPts)
    通过此变换转换一个相对距离向量的数组。
    deltaTransform(Point2D ptSrc, Point2D ptDst)
    转换由ptSrc指定的相对距离向量,并将结果存储在ptDst中。
    boolean
    equals(Object obj)
    如果此AffineTransform表示与指定参数相同的仿射坐标变换,则返回true
    double
    返回变换的矩阵表示的行列式。
    void
    getMatrix(double[] flatmatrix)
    检索3x3仿射变换矩阵中的6个可指定值,并将它们放入双精度值数组中。
    getQuadrantRotateInstance(int numquadrants)
    返回一个旋转坐标指定数量象限的变换。
    getQuadrantRotateInstance(int numquadrants, double anchorx, double anchory)
    返回一个围绕指定锚点旋转指定数量象限的变换。
    getRotateInstance(double theta)
    返回表示旋转变换的变换。
    getRotateInstance(double vecx, double vecy)
    返回根据旋转向量旋转坐标的变换。
    getRotateInstance(double theta, double anchorx, double anchory)
    返回围绕锚点旋转坐标的变换。
    getRotateInstance(double vecx, double vecy, double anchorx, double anchory)
    返回根据旋转向量围绕锚点旋转坐标的变换。
    getScaleInstance(double sx, double sy)
    返回表示缩放变换的变换。
    double
    返回3x3仿射变换矩阵的m00元素。
    double
    返回3x3仿射变换矩阵的m11元素。
    getShearInstance(double shx, double shy)
    返回表示剪切变换的变换。
    double
    返回3x3仿射变换矩阵的X坐标剪切元素(m01)。
    double
    返回3x3仿射变换矩阵的Y坐标剪切元素(m10)。
    getTranslateInstance(double tx, double ty)
    返回表示平移变换的变换。
    double
    返回3x3仿射变换矩阵的平移元素(m02)的X坐标。
    double
    返回3x3仿射变换矩阵的平移元素(m12)的Y坐标。
    int
    检索描述此变换的转换属性的标志位。
    int
    返回此变换的哈希码。
    void
    inverseTransform(double[] srcPts, int srcOff, double[] dstPts, int dstOff, int numPts)
    通过此变换反转双精度坐标的数组。
    inverseTransform(Point2D ptSrc, Point2D ptDst)
    反转指定的ptSrc,并将结果存储在ptDst中。
    void
    invert()
    将此变换设置为其逆变换。
    boolean
    如果此AffineTransform是一个恒等变换,则返回true
    void
    AffineTransform Tx连接到此AffineTransform Cx,以一种不太常用的方式,使得Tx相对于绝对像素空间而不是相对于现有用户空间修改坐标变换。
    void
    quadrantRotate(int numquadrants)
    将此变换与一个旋转指定数量象限的变换连接。
    void
    quadrantRotate(int numquadrants, double anchorx, double anchory)
    将此变换与一个围绕指定锚点旋转指定数量象限的变换连接。
    void
    rotate(double theta)
    将此变换与一个旋转变换连接。
    void
    rotate(double vecx, double vecy)
    将此变换与根据旋转向量旋转坐标的变换连接起来。
    void
    rotate(double theta, double anchorx, double anchory)
    将此变换与围绕锚点旋转坐标的变换连接起来。
    void
    rotate(double vecx, double vecy, double anchorx, double anchory)
    将此变换与根据旋转向量围绕锚点旋转坐标的变换连接起来。
    void
    scale(double sx, double sy)
    将此变换与缩放变换连接起来。
    void
    将此变换重置为身份变换。
    void
    setToQuadrantRotation(int numquadrants)
    将此变换设置为旋转变换,按指定的象限数旋转坐标。
    void
    setToQuadrantRotation(int numquadrants, double anchorx, double anchory)
    将此变换设置为平移旋转变换,围绕指定的锚点按指定的象限数旋转坐标。
    void
    setToRotation(double theta)
    将此变换设置为旋转变换。
    void
    setToRotation(double vecx, double vecy)
    将此变换设置为根据旋转向量旋转坐标的旋转变换。
    void
    setToRotation(double theta, double anchorx, double anchory)
    将此变换设置为平移旋转变换。
    void
    setToRotation(double vecx, double vecy, double anchorx, double anchory)
    将此变换设置为根据旋转向量围绕锚点旋转坐标的旋转变换。
    void
    setToScale(double sx, double sy)
    将此变换设置为缩放变换。
    void
    setToShear(double shx, double shy)
    将此变换设置为错切变换。
    void
    setToTranslation(double tx, double ty)
    将此变换设置为平移变换。
    void
    setTransform(double m00, double m10, double m01, double m11, double m02, double m12)
    将此变换设置为由6个双精度值指定的矩阵。
    void
    将此变换设置为指定AffineTransform对象中变换的副本。
    void
    shear(double shx, double shy)
    将此变换与错切变换连接起来。
    返回表示此Object值的String
    void
    transform(double[] srcPts, int srcOff, double[] dstPts, int dstOff, int numPts)
    通过此变换转换双精度坐标数组。
    void
    transform(double[] srcPts, int srcOff, float[] dstPts, int dstOff, int numPts)
    通过此变换转换双精度坐标数组,并将结果存储到浮点数数组中。
    void
    transform(float[] srcPts, int srcOff, double[] dstPts, int dstOff, int numPts)
    通过此变换转换浮点坐标数组,并将结果存储到双精度数组中。
    void
    transform(float[] srcPts, int srcOff, float[] dstPts, int dstOff, int numPts)
    通过此变换转换浮点坐标数组。
    void
    transform(Point2D[] ptSrc, int srcOff, Point2D[] ptDst, int dstOff, int numPts)
    通过此变换转换点对象数组。
    transform(Point2D ptSrc, Point2D ptDst)
    转换指定的ptSrc,并将结果存储在ptDst中。
    void
    translate(double tx, double ty)
    将此变换与平移变换连接起来。

    Methods declared in class java.lang.Object

    finalize, getClass, notify, notifyAll, wait, wait, wait
  • Field Details

  • Constructor Details

    • AffineTransform

      public AffineTransform()
      构造一个代表恒等变换的新AffineTransform
      自从:
      1.2
    • AffineTransform

      public AffineTransform(AffineTransform Tx)
      构造一个新的AffineTransform,它是指定的AffineTransform对象的副本。
      参数:
      Tx - 要复制的AffineTransform对象
      自从:
      1.2
    • AffineTransform

      @ConstructorProperties({"scaleX","shearY","shearX","scaleY","translateX","translateY"}) public AffineTransform(float m00, float m10, float m01, float m11, float m02, float m12)
      从表示3x3变换矩阵的6个浮点值构造一个新的AffineTransform
      参数:
      m00 - 3x3矩阵的X坐标缩放元素
      m10 - 3x3矩阵的Y坐标错切元素
      m01 - 3x3矩阵的X坐标错切元素
      m11 - 3x3矩阵的Y坐标缩放元素
      m02 - 3x3矩阵的X坐标平移元素
      m12 - 3x3矩阵的Y坐标平移元素
      自从:
      1.2
    • AffineTransform

      public AffineTransform(float[] flatmatrix)
      从表示4个非平移条目或3x3变换矩阵的6个可指定条目的浮点值数组构造一个新的AffineTransform。这些值从数组中检索为{ m00 m10 m01 m11 [m02 m12]}。
      参数:
      flatmatrix - 包含要设置在新AffineTransform对象中的值的浮点数组。假定数组的长度至少为4。如果数组的长度小于6,则只取前4个值。如果数组的长度大于6,则取前6个值。
      自从:
      1.2
    • AffineTransform

      public AffineTransform(double m00, double m10, double m01, double m11, double m02, double m12)
      从表示3x3变换矩阵的6个双精度值构造一个新的AffineTransform
      参数:
      m00 - 3x3矩阵的X坐标缩放元素
      m10 - 3x3矩阵的Y坐标错切元素
      m01 - 3x3矩阵的X坐标错切元素
      m11 - 3x3矩阵的Y坐标缩放元素
      m02 - 3x3矩阵的X坐标平移元素
      m12 - 3x3矩阵的Y坐标平移元素
      自从:
      1.2
    • AffineTransform

      public AffineTransform(double[] flatmatrix)
      从表示4个非平移条目或3x3变换矩阵的6个可指定条目的双精度值数组构造一个新的AffineTransform。这些值从数组中检索为{ m00 m10 m01 m11 [m02 m12]}。
      参数:
      flatmatrix - 包含要设置在新AffineTransform对象中的值的双精度数组。假定数组的长度至少为4。如果数组的长度小于6,则只取前4个值。如果数组的长度大于6,则取前6个值。
      自从:
      1.2
  • Method Details

    • getTranslateInstance

      public static AffineTransform getTranslateInstance(double tx, double ty)
      返回表示平移变换的变换。表示返回变换的矩阵为:
                [   1    0    tx  ]
                [   0    1    ty  ]
                [   0    0    1   ]
       
      参数:
      tx - 在X轴方向上坐标被平移的距离
      ty - 在Y轴方向上坐标被平移的距离
      返回:
      一个代表平移变换的AffineTransform对象,使用指定的向量创建。
      自从:
      1.2
    • getRotateInstance

      public static AffineTransform getRotateInstance(double theta)
      返回表示旋转变换的变换。表示返回变换的矩阵为:
                [   cos(theta)    -sin(theta)    0   ]
                [   sin(theta)     cos(theta)    0   ]
                [       0              0         1   ]
       
      通过正角度theta旋转将X轴正方向上的点旋转到Y轴正方向。还请参阅上面关于处理90度旋转的讨论。
      参数:
      theta - 以弧度测量的旋转角度
      返回:
      一个代表旋转变换的AffineTransform对象,使用指定的旋转角度创建。
      自从:
      1.2
    • getRotateInstance

      public static AffineTransform getRotateInstance(double theta, double anchorx, double anchory)
      返回一个围绕锚点旋转坐标的变换。此操作等效于将坐标平移,使锚点位于原点(S1),然后围绕新原点旋转坐标(S2),最后平移以恢复中间原点到原始锚点坐标(S3)。

      此操作等效于以下调用序列:

           AffineTransform Tx = new AffineTransform();
           Tx.translate(anchorx, anchory);    // S3: 最终平移
           Tx.rotate(theta);                  // S2: 围绕锚点旋转
           Tx.translate(-anchorx, -anchory);  // S1: 将锚点平移到原点
       
      表示返回变换的矩阵为:
                [   cos(theta)    -sin(theta)    x-x*cos+y*sin  ]
                [   sin(theta)     cos(theta)    y-x*sin-y*cos  ]
                [       0              0               1        ]
       
      通过正角度theta旋转将X轴正方向上的点旋转到Y轴正方向。还请参阅上面关于处理90度旋转的讨论。
      参数:
      theta - 以弧度测量的旋转角度
      anchorx - 旋转锚点的X坐标
      anchory - 旋转锚点的Y坐标
      返回:
      一个根据指定点和指定旋转角度旋转坐标的AffineTransform对象。
      自从:
      1.2
    • getRotateInstance

      public static AffineTransform getRotateInstance(double vecx, double vecy)
      返回根据旋转向量旋转坐标的变换。所有坐标都围绕原点旋转相同的量。旋转的量使得沿着原来的X轴正方向的坐标将随后与从原点指向指定向量坐标的向量对齐。如果vecxvecy都为0.0,则返回一个恒等变换。此操作等效于调用:
           AffineTransform.getRotateInstance(Math.atan2(vecy, vecx));
       
      参数:
      vecx - 旋转向量的X坐标
      vecy - 旋转向量的Y坐标
      返回:
      一个根据指定旋转向量旋转坐标的AffineTransform对象。
      自从:
      1.6
    • getRotateInstance

      public static AffineTransform getRotateInstance(double vecx, double vecy, double anchorx, double anchory)
      返回根据旋转向量围绕锚点旋转坐标的变换。所有坐标都围绕指定的锚点坐标旋转相同的量。旋转的量使得沿着原来的X轴正方向的坐标将随后与从原点指向指定向量坐标的向量对齐。如果vecxvecy都为0.0,则返回一个恒等变换。此操作等效于调用:
           AffineTransform.getRotateInstance(Math.atan2(vecy, vecx),
                                             anchorx, anchory);
       
      参数:
      vecx - 旋转向量的X坐标
      vecy - 旋转向量的Y坐标
      anchorx - 旋转锚点的X坐标
      anchory - 旋转锚点的Y坐标
      返回:
      一个根据指定点和指定旋转向量围绕指定点旋转坐标的AffineTransform对象。
      自从:
      1.6
    • getQuadrantRotateInstance

      public static AffineTransform getQuadrantRotateInstance(int numquadrants)
      返回一个通过指定的象限数旋转坐标的变换。此操作等效于调用:
           AffineTransform.getRotateInstance(numquadrants * Math.PI / 2.0);
       
      通过正象限数旋转将正X轴上的点旋转到正Y轴上。
      参数:
      numquadrants - 要旋转的90度弧的数量
      返回:
      一个AffineTransform对象,它将坐标旋转指定的象限数。
      自版本:
      1.6
    • getQuadrantRotateInstance

      public static AffineTransform getQuadrantRotateInstance(int numquadrants, double anchorx, double anchory)
      返回一个通过指定的象限数围绕指定锚点旋转坐标的变换。此操作等效于调用:
           AffineTransform.getRotateInstance(numquadrants * Math.PI / 2.0,
                                             anchorx, anchory);
       
      通过正象限数旋转将正X轴上的点旋转到正Y轴上。
      参数:
      numquadrants - 要旋转的90度弧的数量
      anchorx - 旋转锚点的X坐标
      anchory - 旋转锚点的Y坐标
      返回:
      一个AffineTransform对象,它将坐标围绕指定锚点旋转指定的象限数。
      自版本:
      1.6
    • getScaleInstance

      public static AffineTransform getScaleInstance(double sx, double sy)
      返回表示缩放变换的变换。表示返回变换的矩阵为:
                [   sx   0    0   ]
                [   0    sy   0   ]
                [   0    0    1   ]
       
      参数:
      sx - 沿X轴方向缩放坐标的因子
      sy - 沿Y轴方向缩放坐标的因子
      返回:
      一个AffineTransform对象,它按指定因子缩放坐标。
      自版本:
      1.2
    • getShearInstance

      public static AffineTransform getShearInstance(double shx, double shy)
      返回表示剪切变换的变换。表示返回变换的矩阵为:
                [   1   shx   0   ]
                [  shy   1    0   ]
                [   0    0    1   ]
       
      参数:
      shx - 沿Y坐标的因子移动坐标的X轴正方向的乘数
      shy - 沿X坐标的因子移动坐标的Y轴正方向的乘数
      返回:
      一个AffineTransform对象,它按指定乘数剪切坐标。
      自版本:
      1.2
    • getType

      public int getType()
      检索描述此变换的转换属性的标志位。返回值可以是常量TYPE_IDENTITY或TYPE_GENERAL_TRANSFORM之一,或适当标志位的组合。标志位的有效组合是一个异或操作,可以将TYPE_TRANSLATION标志位与TYPE_UNIFORM_SCALE或TYPE_GENERAL_SCALE标志位以及TYPE_QUADRANT_ROTATION或TYPE_GENERAL_ROTATION标志位之一组合起来。
      返回:
      适用于此变换的任何指示标志的OR组合
      自版本:
      1.2
      另请参阅:
    • getDeterminant

      public double getDeterminant()
      返回变换矩阵的行列式。行列式对于确定变换是否可逆以及获取表示变换的X和Y缩放的单个值都很有用。

      如果行列式非零,则此变换是可逆的,依赖于逆变换的各种方法不需要抛出NoninvertibleTransformException异常。如果行列式为零,则此变换无法被反转,因为变换将所有输入坐标映射到一条线或一个点上。如果行列式接近零,则逆变换操作可能没有足够的精度产生有意义的结果。

      如果此变换表示均匀缩放,如getType方法所示,则行列式还表示所有点从原点扩展或向原点收缩的均匀缩放因子的平方。如果此变换表示非均匀缩放或更一般的变换,则行列式不太可能表示对于确定逆变换是否可能有用的值。

      数学上,行列式使用以下公式计算:

                |  m00  m01  m02  |
                |  m10  m11  m12  |  =  m00 * m11 - m01 * m10
                |   0    0    1   |
       
      返回:
      用于变换坐标的矩阵的行列式。
      自版本:
      1.2
      另请参阅:
    • getMatrix

      public void getMatrix(double[] flatmatrix)
      检索3x3仿射变换矩阵中的6个可指定值,并将它们放入双精度值数组中。这些值以{ m00 m10 m01 m11 m02 m12 }的形式存储在数组中。也可以指定4个双精度值的数组,此时只检索表示数组的非变换部分的前四个元素,并将这些值存储到数组中,如{ m00 m10 m01 m11 }
      参数:
      flatmatrix - 用于存储返回值的双精度数组。
      自版本:
      1.2
      另请参阅:
    • getScaleX

      public double getScaleX()
      返回:
      3x3仿射变换矩阵的m00元素的双精度值。
      自版本:
      1.2
      另请参阅:
    • getScaleY

      public double getScaleY()
      返回3x3仿射变换矩阵的m11元素。此矩阵因子确定输入Y坐标将如何影响输出Y坐标,并且是变换的缩放的一个元素。要测量此变换拉伸或收缩Y坐标的完整量,请使用以下代码:
           Point2D p = new Point2D.Double(0, 1);
           p = tx.deltaTransform(p, p);
           double scaleY = p.distance(0, 0);
       
      返回:
      3x3仿射变换矩阵的m11元素的双精度值。
      自版本:
      1.2
      另请参阅:
    • getShearX

      public double getShearX()
      返回3x3仿射变换矩阵的X坐标剪切元素(m01)。
      返回:
      3x3仿射变换矩阵的X坐标剪切元素的双精度值。
      自版本:
      1.2
      另请参阅:
    • getShearY

      public double getShearY()
      返回3x3仿射变换矩阵的Y坐标剪切元素(m10)。
      返回:
      3x3仿射变换矩阵的Y坐标剪切元素的双精度值。
      自版本:
      1.2
      另请参阅:
    • getTranslateX

      public double getTranslateX()
      返回3x3仿射变换矩阵的平移元素的X坐标(m02)。
      返回:
      3x3仿射变换矩阵的平移元素的X坐标的双精度值。
      自版本:
      1.2
      另请参阅:
    • getTranslateY

      public double getTranslateY()
      返回3x3仿射变换矩阵的平移元素的Y坐标(m12)。
      返回:
      3x3仿射变换矩阵的平移元素的Y坐标的双精度值。
      自版本:
      1.2
      另请参阅:
    • translate

      public void translate(double tx, double ty)
      将此变换与平移变换连接起来。这等效于调用concatenate(T),其中T是由以下矩阵表示的AffineTransform
                [   1    0    tx  ]
                [   0    1    ty  ]
                [   0    0    1   ]
       
      参数:
      tx - 在X轴方向上平移坐标的距离
      ty - 在Y轴方向上平移坐标的距禂
      自版本:
      1.2
    • rotate

      public void rotate(double theta)
      将此变换与旋转变换连接起来。这相当于调用concatenate(R),其中R是由以下矩阵表示的AffineTransform
                [   cos(theta)    -sin(theta)    0   ]
                [   sin(theta)     cos(theta)    0   ]
                [       0              0         1   ]
       
      通过正角度theta旋转,将正X轴上的点旋转到正Y轴上。还请参阅上面关于处理90度旋转的讨论。
      参数:
      theta - 以弧度表示的旋转角度
      自版本:
      1.2
    • rotate

      public void rotate(double theta, double anchorx, double anchory)
      将此变换与围绕锚点旋转坐标的变换连接起来。此操作相当于将坐标平移到锚点位于原点(S1),然后围绕新原点旋转它们(S2),最后平移以使中间原点恢复到原始锚点的坐标(S3)。

      此操作相当于以下调用序列:

           translate(anchorx, anchory);      // S3: 最终平移
           rotate(theta);                    // S2: 围绕锚点旋转
           translate(-anchorx, -anchory);    // S1: 平移到原点
       
      通过正角度theta旋转,将正X轴上的点旋转到正Y轴上。还请参阅上面关于处理90度旋转的讨论。
      参数:
      theta - 以弧度表示的旋转角度
      anchorx - 旋转锚点的X坐标
      anchory - 旋转锚点的Y坐标
      自版本:
      1.2
    • rotate

      public void rotate(double vecx, double vecy)
      将此变换与根据旋转向量旋转坐标的变换连接起来。所有坐标都围绕原点旋转相同的角度。旋转的角度使得沿着以前的正X轴的坐标最终与指向指定向量坐标的矢量对齐。如果vecxvecy都为0.0,则不会向此变换添加额外的旋转。此操作相当于调用:
                rotate(Math.atan2(vecy, vecx));
       
      参数:
      vecx - 旋转向量的X坐标
      vecy - 旋转向量的Y坐标
      自版本:
      1.6
    • rotate

      public void rotate(double vecx, double vecy, double anchorx, double anchory)
      将此变换与根据旋转向量围绕锚点旋转坐标的变换连接起来。所有坐标都围绕指定的锚点坐标旋转相同的角度。旋转的角度使得沿着以前的正X轴的坐标最终与指向指定向量坐标的矢量对齐。如果vecxvecy都为0.0,则不会以任何方式修改变换。此方法相当于调用:
           rotate(Math.atan2(vecy, vecx), anchorx, anchory);
       
      参数:
      vecx - 旋转向量的X坐标
      vecy - 旋转向量的Y坐标
      anchorx - 旋转锚点的X坐标
      anchory - 旋转锚点的Y坐标
      自版本:
      1.6
    • quadrantRotate

      public void quadrantRotate(int numquadrants)
      将此变换与按指定的象限数旋转坐标的变换连接起来。这相当于调用:
           rotate(numquadrants * Math.PI / 2.0);
       
      通过正象限数旋转,将正X轴上的点旋转到正Y轴上。
      参数:
      numquadrants - 要旋转的90度弧数
      自版本:
      1.6
    • quadrantRotate

      public void quadrantRotate(int numquadrants, double anchorx, double anchory)
      将此变换与按指定的象限数围绕指定的锚点旋转坐标的变换连接起来。此方法相当于调用:
           rotate(numquadrants * Math.PI / 2.0, anchorx, anchory);
       
      通过正象限数旋转,将正X轴上的点旋转到正Y轴上。
      参数:
      numquadrants - 要旋转的90度弧数
      anchorx - 旋转锚点的X坐标
      anchory - 旋转锚点的Y坐标
      自版本:
      1.6
    • scale

      public void scale(double sx, double sy)
      将此变换与缩放变换连接起来。这相当于调用concatenate(S),其中S是由以下矩阵表示的AffineTransform
                [   sx   0    0   ]
                [   0    sy   0   ]
                [   0    0    1   ]
       
      参数:
      sx - 沿X轴方向缩放坐标的因子
      sy - 沿Y轴方向缩放坐标的因子
      自版本:
      1.2
    • shear

      public void shear(double shx, double shy)
      将此变换与错切变换连接起来。这相当于调用concatenate(SH),其中SH是由以下矩阵表示的AffineTransform
                [   1   shx   0   ]
                [  shy   1    0   ]
                [   0    0    1   ]
       
      参数:
      shx - 作为其Y坐标因子而在正X轴方向上移动坐标的乘数
      shy - 作为其X坐标因子而在正Y轴方向上移动坐标的乘数
      自版本:
      1.2
    • setToIdentity

      public void setToIdentity()
      将此变换重置为单位变换。
      自版本:
      1.2
    • setToTranslation

      public void setToTranslation(double tx, double ty)
      将此变换设置为平移变换。表示此变换的矩阵为:
                [   1    0    tx  ]
                [   0    1    ty  ]
                [   0    0    1   ]
       
      参数:
      tx - 在X轴方向上平移坐标的距离
      ty - 在Y轴方向上平移坐标的距禖
      自版本:
      1.2
    • setToRotation

      public void setToRotation(double theta)
      将此变换设置为旋转变换。表示此变换的矩阵为:
                [   cos(theta)    -sin(theta)    0   ]
                [   sin(theta)     cos(theta)    0   ]
                [       0              0         1   ]
       
      通过正角度theta旋转,将正X轴上的点旋转到正Y轴上。还请参阅上面关于处理90度旋转的讨论。
      参数:
      theta - 以弧度表示的旋转角度
      自版本:
      1.2
    • setToRotation

      public void setToRotation(double theta, double anchorx, double anchory)
      将此变换设置为平移旋转变换。此操作相当于将坐标平移到锚点位于原点(S1),然后围绕新原点旋转它们(S2),最后平移以使中间原点恢复到原始锚点的坐标(S3)。

      此操作相当于以下调用序列:

           setToTranslation(anchorx, anchory); // S3: 最终平移
           rotate(theta);                      // S2: 围绕锚点旋转
           translate(-anchorx, -anchory);      // S1: 平移到原点
       
      表示此变换的矩阵为:
                [   cos(theta)    -sin(theta)    x-x*cos+y*sin  ]
                [   sin(theta)     cos(theta)    y-x*sin-y*cos  ]
                [       0              0               1        ]
       
      通过正角度theta旋转,将正X轴上的点旋转到正Y轴上。还请参阅上面关于处理90度旋转的讨论。
      参数:
      theta - 以弧度表示的旋转角度
      anchorx - 旋转锚点的X坐标
      anchory - 旋转锚点的Y坐标
      自版本:
      1.2
    • setToRotation

      public void setToRotation(double vecx, double vecy)
      将此变换设置为根据旋转向量旋转坐标的旋转变换。所有坐标都围绕原点旋转相同的角度。旋转的角度使得沿着以前的正X轴的坐标最终与指向指定向量坐标的矢量对齐。如果vecxvecy都为0.0,则将变换设置为单位变换。此操作相当于调用:
           setToRotation(Math.atan2(vecy, vecx));
       
      参数:
      vecx - 旋转向量的X坐标
      vecy - 旋转向量的Y坐标
      自版本:
      1.6
    • setToRotation

      public void setToRotation(double vecx, double vecy, double anchorx, double anchory)
      将此变换设置为根据旋转向量围绕锚点旋转坐标的旋转变换。所有坐标都围绕指定的锚点坐标旋转相同的角度。旋转的角度使得沿着以前的正X轴的坐标最终与指向指定向量坐标的矢量对齐。如果vecxvecy都为0.0,则将变换设置为单位变换。此操作相当于调用:
           setToTranslation(Math.atan2(vecy, vecx), anchorx, anchory);
       
      参数:
      vecx - 旋转向量的X坐标
      vecy - 旋转向量的Y坐标
      anchorx - 旋转锚点的X坐标
      anchory - 旋转锚点的Y坐标
      自版本:
      1.6
    • setToQuadrantRotation

      public void setToQuadrantRotation(int numquadrants)
      将此变换设置为根据指定的象限数旋转坐标的旋转变换。这相当于调用:
           setToRotation(numquadrants * Math.PI / 2.0);
       
      通过正象限数旋转,将正X轴上的点旋转到正Y轴上。
      参数:
      numquadrants - 要旋转的90度弧数
      自版本:
      1.6
    • setToQuadrantRotation

      public void setToQuadrantRotation(int numquadrants, double anchorx, double anchory)
      将此变换设置为一个平移旋转变换,围绕指定的锚点将坐标旋转指定的象限数。此操作等同于调用:
           setToRotation(numquadrants * Math.PI / 2.0, anchorx, anchory);
       
      按正象限数旋转会将正X轴上的点旋转到正Y轴上。
      参数:
      numquadrants - 要旋转的90度弧数
      anchorx - 旋转锚点的X坐标
      anchory - 旋转锚点的Y坐标
      自版本:
      1.6
    • setToScale

      public void setToScale(double sx, double sy)
      将此变换设置为缩放变换。表示此变换的矩阵变为:
                [   sx   0    0   ]
                [   0    sy   0   ]
                [   0    0    1   ]
       
      参数:
      sx - 沿X轴方向缩放坐标的因子
      sy - 沿Y轴方向缩放坐标的因子
      自版本:
      1.2
    • setToShear

      public void setToShear(double shx, double shy)
      将此变换设置为错切变换。表示此变换的矩阵变为:
                [   1   shx   0   ]
                [  shy   1    0   ]
                [   0    0    1   ]
       
      参数:
      shx - 沿Y坐标的因子将坐标向正X轴方向移动
      shy - 沿X坐标的因子将坐标向正Y轴方向移动
      自版本:
      1.2
    • setTransform

      public void setTransform(AffineTransform Tx)
      将此变换设置为指定的AffineTransform对象中的变换的副本。
      参数:
      Tx - 要复制变换的AffineTransform对象
      自版本:
      1.2
    • setTransform

      public void setTransform(double m00, double m10, double m01, double m11, double m02, double m12)
      将此变换设置为由6个双精度值指定的矩阵。
      参数:
      m00 - 3x3矩阵的X坐标缩放元素
      m10 - 3x3矩阵的Y坐标错切元素
      m01 - 3x3矩阵的X坐标错切元素
      m11 - 3x3矩阵的Y坐标缩放元素
      m02 - 3x3矩阵的X坐标平移元素
      m12 - 3x3矩阵的Y坐标平移元素
      自版本:
      1.2
    • concatenate

      public void concatenate(AffineTransform Tx)
      AffineTransform Tx连接到此AffineTransform Cx,以提供最常用的方式,将一个新的用户空间映射到以前的用户空间。更新Cx以执行组合变换。通过更新的变换Cx'转换点p等同于首先通过Tx转换p,然后通过原始变换Cx转换结果,如下所示:Cx'(p) = Cx(Tx(p)) 在矩阵表示中,如果此变换Cx由矩阵[this]表示,Tx由矩阵[Tx]表示,则此方法执行以下操作:
                [this] = [this] x [Tx]
       
      参数:
      Tx - 要连接到此AffineTransform对象的AffineTransform对象。
      自版本:
      1.2
      参见:
    • preConcatenate

      public void preConcatenate(AffineTransform Tx)
      以较少常用的方式将AffineTransform Tx连接到此AffineTransform Cx,使得Tx相对于绝对像素空间而不是相对于现有用户空间修改坐标变换。更新Cx以执行组合变换。通过更新的变换Cx'转换点p等同于首先通过原始变换Cx转换p,然后通过Tx转换结果,如下所示:Cx'(p) = Tx(Cx(p)) 在矩阵表示中,如果此变换Cx由矩阵[this]表示,Tx由矩阵[Tx]表示,则此方法执行以下操作:
                [this] = [Tx] x [this]
       
      参数:
      Tx - 要连接到此AffineTransform对象的AffineTransform对象。
      自版本:
      1.2
      参见:
    • createInverse

      public AffineTransform createInverse() throws NoninvertibleTransformException
      返回表示逆转换的AffineTransform对象。此变换Tx的逆变换Tx'将由Tx转换的坐标映射回其原始坐标。换句话说,Tx'(Tx(p)) = p = Tx(Tx'(p))。

      如果此变换将所有坐标映射到一个点或一条线,则它将没有逆变换,因为不在目标点或线上的坐标将没有逆映射。如果要确定此变换是否没有逆变换,可以使用getDeterminant方法,如果此变换没有逆变换,则在调用createInverse方法时将抛出异常。

      返回:
      表示逆转换的新AffineTransform对象。
      抛出:
      NoninvertibleTransformException - 如果矩阵无法求逆。
      自版本:
      1.2
      参见:
    • invert

      public void invert() throws NoninvertibleTransformException
      将此变换设置为其自身的逆变换。此变换Tx的逆变换Tx'将由Tx转换的坐标映射回其原始坐标。换句话说,Tx'(Tx(p)) = p = Tx(Tx'(p))。

      如果此变换将所有坐标映射到一个点或一条线,则它将没有逆变换,因为不在目标点或线上的坐标将没有逆映射。如果要确定此变换是否没有逆变换,可以使用getDeterminant方法,如果此变换没有逆变换,则在调用invert方法时将抛出异常。

      抛出:
      NoninvertibleTransformException - 如果矩阵无法求逆。
      自版本:
      1.6
      参见:
    • transform

      public Point2D transform(Point2D ptSrc, Point2D ptDst)
      转换指定的ptSrc并将结果存储在ptDst中。如果ptDstnull,则会分配一个新的Point2D对象,然后将转换的结果存储在此对象中。无论哪种情况,包含转换点的ptDst都会被返回以方便使用。如果ptSrcptDst是同一个对象,则输入点将被正确地覆盖为转换后的点。
      参数:
      ptSrc - 要转换的指定Point2D
      ptDst - 存储转换ptSrc结果的指定Point2D
      返回:
      转换ptSrc并将结果存储在ptDst中后的ptDst
      自版本:
      1.2
    • transform

      public void transform(Point2D[] ptSrc, int srcOff, Point2D[] ptDst, int dstOff, int numPts)
      通过此变换转换点对象数组。如果ptDst数组的任何元素为null,则会分配一个新的Point2D对象并存储到该元素中,然后存储转换的结果。

      请注意,此方法不会采取任何预防措施来避免由于将结果存储到将来在源数组中进一步计算的Point2D对象而引起的问题。此方法确保如果指定的Point2D对象既是单个点转换操作的源和目标,则在计算完成之前不会存储结果,以避免将结果存储在操作数之上。但是,如果一个操作的目标Point2D对象是源数组中另一个操作的源Point2D对象,则在转换之前将覆盖该点的原始坐标。

      参数:
      ptSrc - 包含源点对象的数组
      srcOff - 源数组中要转换的第一个点对象的偏移量
      ptDst - 存储转换点对象的数组
      dstOff - 存储在目标数组中的第一个转换点对象的位置的偏移量
      numPts - 要转换的点对象的数量
      自版本:
      1.2
    • transform

      public void transform(float[] srcPts, int srcOff, float[] dstPts, int dstOff, int numPts)
      通过此变换转换浮点坐标数组。两个坐标数组部分可以完全相同,也可以是同一数组的重叠部分,而不会影响结果的有效性。此方法确保在转换之前不会由于先前操作覆盖源坐标而导致问题。坐标按顺序存储在数组中,从指定偏移量开始,顺序为[x0, y0, x1, y1, ..., xn, yn]
      参数:
      srcPts - 包含源点坐标的数组。每个点存储为一对x,y坐标。
      srcOff - 源数组中要转换的第一个点的偏移量
      dstPts - 存储转换后的点坐标的数组。每个点存储为一对x,y坐标。
      dstOff - 存储在目标数组中的第一个转换点的位置的偏移量
      numPts - 要转换的点数
      自版本:
      1.2
    • transform

      public void transform(double[] srcPts, int srcOff, double[] dstPts, int dstOff, int numPts)
      通过此变换将双精度坐标数组进行转换。两个坐标数组部分可以完全相同,也可以是同一数组的重叠部分,而不会影响结果的有效性。此方法确保在转换之前不会被先前操作覆盖源坐标。坐标以指定偏移量开始存储在数组中,顺序为[x0, y0, x1, y1, ..., xn, yn]
      参数:
      srcPts - 包含源点坐标的数组。每个点都存储为一对x,y坐标。
      srcOff - 源数组中要转换的第一个点的偏移量
      dstPts - 存储转换后的点坐标的数组。每个点都存储为一对x,y坐标。
      dstOff - 存储在目标数组中的第一个转换点的位置的偏移量
      numPts - 要转换的点对象的数量
      自版本:
      1.2
    • transform

      public void transform(float[] srcPts, int srcOff, double[] dstPts, int dstOff, int numPts)
      通过此变换将浮点坐标数组进行转换,并将结果存储在双精度数组中。坐标以指定偏移量开始存储在数组中,顺序为[x0, y0, x1, y1, ..., xn, yn]
      参数:
      srcPts - 包含源点坐标的数组。每个点都存储为一对x,y坐标。
      srcOff - 源数组中要转换的第一个点的偏移量
      dstPts - 存储转换后的点坐标的数组。每个点都存储为一对x,y坐标。
      dstOff - 存储在目标数组中的第一个转换点的位置的偏移量
      numPts - 要转换的点的数量
      自版本:
      1.2
    • transform

      public void transform(double[] srcPts, int srcOff, float[] dstPts, int dstOff, int numPts)
      通过此变换将双精度坐标数组进行转换,并将结果存储在浮点数组中。坐标以指定偏移量开始存储在数组中,顺序为[x0, y0, x1, y1, ..., xn, yn]
      参数:
      srcPts - 包含源点坐标的数组。每个点都存储为一对x,y坐标。
      srcOff - 源数组中要转换的第一个点的偏移量
      dstPts - 存储转换后的点坐标的数组。每个点都存储为一对x,y坐标。
      dstOff - 存储在目标数组中的第一个转换点的位置的偏移量
      numPts - 要转换的点对象的数量
      自版本:
      1.2
    • inverseTransform

      public Point2D inverseTransform(Point2D ptSrc, Point2D ptDst) throws NoninvertibleTransformException
      反向转换指定的ptSrc,并将结果存储在ptDst中。如果ptDstnull,则会分配一个新的Point2D对象,然后将转换的结果存储在此对象中。在任何情况下,包含转换点的ptDst都会被返回以方便使用。如果ptSrcptDst是同一个对象,则输入点将被正确地覆盖为转换后的点。
      参数:
      ptSrc - 要进行反向转换的点
      ptDst - 转换后的结果点
      返回:
      包含反向转换结果的ptDst
      抛出:
      NoninvertibleTransformException - 如果矩阵无法被反转。
      自版本:
      1.2
    • inverseTransform

      public void inverseTransform(double[] srcPts, int srcOff, double[] dstPts, int dstOff, int numPts) throws NoninvertibleTransformException
      通过此变换将双精度坐标数组进行反向转换。两个坐标数组部分可以完全相同,也可以是同一数组的重叠部分,而不会影响结果的有效性。此方法确保在转换之前不会被先前操作覆盖源坐标。坐标以指定偏移量开始存储在数组中,顺序为[x0, y0, x1, y1, ..., xn, yn]
      参数:
      srcPts - 包含源点坐标的数组。每个点都存储为一对x,y坐标。
      srcOff - 源数组中要转换的第一个点的偏移量
      dstPts - 存储转换后的点坐标的数组。每个点都存储为一对x,y坐标。
      dstOff - 存储在目标数组中的第一个转换点的位置的偏移量
      numPts - 要转换的点对象的数量
      抛出:
      NoninvertibleTransformException - 如果矩阵无法被反转。
      自版本:
      1.2
    • deltaTransform

      public Point2D deltaTransform(Point2D ptSrc, Point2D ptDst)
      转换由ptSrc指定的相对距离向量,并将结果存储在ptDst中。相对距离向量是在不应用仿射变换矩阵的平移分量的情况下进行转换的,使用以下方程式:
        [  x' ]   [  m00  m01 (m02) ] [  x  ]   [ m00x + m01y ]
        [  y' ] = [  m10  m11 (m12) ] [  y  ] = [ m10x + m11y ]
        [ (1) ]   [  (0)  (0) ( 1 ) ] [ (1) ]   [     (1)     ]
       
      如果ptDstnull,则会分配一个新的Point2D对象,然后将转换的结果存储在此对象中。在任何情况下,包含转换点的ptDst都会被返回以方便使用。如果ptSrcptDst是同一个对象,则输入点将被正确地覆盖为转换后的点。
      参数:
      ptSrc - 要进行增量转换的距离向量
      ptDst - 转换后的结果距离向量
      返回:
      包含转换结果的ptDst
      自版本:
      1.2
    • deltaTransform

      public void deltaTransform(double[] srcPts, int srcOff, double[] dstPts, int dstOff, int numPts)
      通过此变换将相对距离向量数组进行转换。相对距离向量是在不应用仿射变换矩阵的平移分量的情况下进行转换的,使用以下方程式:
        [  x' ]   [  m00  m01 (m02) ] [  x  ]   [ m00x + m01y ]
        [  y' ] = [  m10  m11 (m12) ] [  y  ] = [ m10x + m11y ]
        [ (1) ]   [  (0)  (0) ( 1 ) ] [ (1) ]   [     (1)     ]
       
      两个坐标数组部分可以完全相同,也可以是同一数组的重叠部分,而不会影响结果的有效性。此方法确保在转换之前不会被先前操作覆盖源坐标。坐标以指定偏移量开始存储在数组中,顺序为[x0, y0, x1, y1, ..., xn, yn]
      参数:
      srcPts - 包含源距离向量的数组。每个向量都存储为一对相对x,y坐标。
      srcOff - 源数组中要转换的第一个向量的偏移量
      dstPts - 存储转换后的距离向量的数组。每个向量都存储为一对相对x,y坐标。
      dstOff - 存储在目标数组中的第一个转换向量的位置的偏移量
      numPts - 要转换的向量坐标对的数量
      自版本:
      1.2
    • createTransformedShape

      public Shape createTransformedShape(Shape pSrc)
      返回由指定Shape的几何形状经过此变换转换后定义的新Shape对象。
      参数:
      pSrc - 要通过此变换转换的指定Shape对象。
      返回:
      一个新的Shape对象,定义了转换后Shape的几何形状,如果pSrc为null,则返回null。
      自版本:
      1.2
    • toString

      public String toString()
      返回表示此Object值的String
      覆盖:
      toString 在类 Object
      返回:
      代表此Object值的String
      自版本:
      1.2
    • isIdentity

      public boolean isIdentity()
      如果此AffineTransform是一个恒等变换,则返回true
      返回:
      如果此AffineTransform是一个恒等变换,则返回true;否则返回false
      自版本:
      1.2
    • clone

      public Object clone()
      返回此AffineTransform对象的副本。
      覆盖:
      clone 在类 Object
      返回:
      一个是此AffineTransform对象副本的Object
      自版本:
      1.2
      参见:
    • hashCode

      public int hashCode()
      返回此变换的哈希码。
      覆盖:
      hashCode 在类 Object
      返回:
      此变换的哈希码。
      自版本:
      1.2
      参见:
    • equals

      public boolean equals(Object obj)
      如果此AffineTransform表示与指定参数相同的仿射坐标变换,则返回true
      覆盖:
      equals 在类 Object
      参数:
      obj - 用于与此AffineTransform对象进行相等性测试的Object
      返回:
      如果obj等于此AffineTransform对象,则返回true; 否则返回false
      自从:
      1.2
      参见: