appendix> 2D> AffineTransform TOPUPPREVNEXT

 アフィン変換 java.awt.geom.AffineTransform

【主な機能】

ユーザ空間の座標系(Graphics2D)上で、2次元アフィン変換を行うクラスです。
アフィン変換は線形変換と平行移動の合成で、
affine1.gif
で表現されます。 アフィン変換には次のような特徴があります。

Javaでは次のように分類されます。
分類対応する定数概要
恒等変換TYPE_IDENTITY変換しない
平行移動TYPE_TRANSLATION平行移動
回転(任意角)TYPE_GENERAL_ROTATION任意の角だけ回転させる
回転(90度単位)TYPE_QUADRANT_ROTATION90度単位の回転
拡大・縮小(一般) TYPE_GENERAL_SCALE縦と横の倍率を指定
拡大・縮小(縦横等倍) TYPE_UNIFORM_SCALE縦と横を同じ倍率
その他の変換TYPE_GENERAL_TRANSFORM 上記のm00 〜 m12 を指定した一般の変換

【主なコンストラクタ】

コンストラクタ機能
AffineTransform ( ) 恒等変換をおこなう新しいアフィン変換を生成します。
AffineTransform (
double m00 , double m10 ,
double m01 , double m11 ,
double m02 , double m12 )
m00m12 を指定してアフィン変換を生成します。 パラメータの順序に注意してください。
AffineTransform ( double[] flatmatrix ) flatmatrix は次のいずれか。
{ m00, m10, m01, m11 }
{ m00, m10, m01, m11, m02, m12 }
配列の長さが6より小さい場合は最初の4つ、 配列の長さが6より大きい場合は最初の6つが使用されます。

【ファクトリメソッド】

メソッド機能
static AffineTransform
getRotateInstance( double theta )
回転をおこなう変換を返します。theta ラジアンだけ、 原点を中心に時計回りに回転させる変換です。行列表現は以下のようになります。
affine2.gif
static AffineTransform
getRotateInstance( double theta, double x, double y )
回転をおこなう変換を返します。theta ラジアンだけ、 点(x, y)を中心に時計回りに回転させる変換です。 行列表現は以下のようになります。
affine3.gif
static AffineTransform
getScaleInstance ( double sx , double sy )
x方向にsx 倍、 y方向にsy 倍する拡大・縮小変換です。 行列表現は以下のようになります。
affine4.gif
static AffineTransform
getShearInstance ( double sx , double sy )
シャーリング変換。 行列表現は以下のようになります。
affine5.gif
static AffineTransform
getTranslateInstance ( double sx , double sy )
平行移動。 行列表現は以下のようになります。
affine6.gif

【変換を再設定するためのメソッド】

メソッド機能
void setToIdentity ( ) この変換を恒等変換に設定します。
void setToRotation ( double theta )

void setToRotation ( double theta , double x , double y )
この変換を回転変換に設定します。
設定される変換はファクトリメソッド getRotateInstance と同じです。
void setToScale ( double sx , double sy ) この変換を拡大・縮小変換に設定します。
設定される変換は、ファクトリメソッド getScaleInstance と同じです。
void setToShear ( double sx , double sy ) この変換をシャーリング変換に設定します。
設定される変換はファクトリメソッド getShearInstance と同じです。
void setToTranslation ( double sx , sy ) この変換を平行移動変換に設定します。
設定される変換はファクトリメソッド getTranslateInstance と同じです。
void setTransform ( AffineTransform af ) この変換をアフィン変換af と同じ変換(コピー)に再設定します。
void setTransform (
double m00 , double m10 ,
double m01 , double m11 ,
double m02 , double m12 )
この変換を m00m12 で表現されるアフィン変換に再設定します。

【変換を合成するためのメソッド】

合成した順序と逆の順序で、変換が適用されます。
メソッド機能
void concatenate ( AffineTransform at ) この変換に、アフィン変換 at を合成します。 合成された変換は、「 変換 at を行った後に 合成前の変換を行う 」 のと同じ変換になります。
void rotate ( double theta )
void rotate ( double theta , double x , double y)
この変換に回転変換を合成します。つまり、 回転してから、この変換を行うような新しい変換に変更されます。
void scale ( double sx , doube sy ) この変換に拡大・縮小変換を合成します。つまり、拡大・縮小変換をした後、 この変換をするような新しい変換に変更されます。
void shear ( double sx , doube sy ) この変換にシャーリング変換を合成します。つまり、シャーリング変換をした後、 この変換をするような新しい変換に変更されます。
translate ( double sx , double sy ) この変換に平行移動を合成します。つまり、平行移動してからこの変換を行うような 新しい変換に変更されます。

【その他の主なメソッド】

メソッド機能
AffineTransform createInverse ( ) この変換の逆変換を行うアフィン変換を返します。
逆変換ができない場合、NoninvertibleTransformException 例外がスローされます。 たとえば、
Shape createTransformedShape ( Shape s ) 図形 s にこの変換をほどこして得られる図形を返します。
getDeterminant ( ) 変換の行列表現の行列式の値を返します。行列式の値は
affine7.gif
で計算されます。 この値がゼロの時に逆変換を求めようとすると、NoninvertibleTransformException 例外がスローされます。
void getMatrix( double[] flatmatrix ) このアフィン変換の行列表現
{ m00 m10 m01 m11 m02 m12 }
flatmatrix に設定します。 配列の長さが4であれば先頭の4つの要素を設定します。
int getType ( ) この変換の分類をあらわすフラグビットを返します。返されるビットは
  • TYPE_IDENTITY
  • TYPE_GENERAL_TRANSFORM
  • 以下の組み合わせ
    TYPE_UNIFORM_SCALE
    または
    TYPE_GENARAL_SCALE
    TYPE_QUADRANT_ROTATION
    または
    TYPE_GENERAL_ROTATION
    TYPE_TRANSLATION
    または無

【例1】

座標系を縦横2倍にする。(Graphics2D#setTransform(...))

プログラム AffineDemo1.java

実行結果

AffineDemo1-1.gif

【例2】

図形を30度回転する。(Shape#getPathIterator(...))

プログラム AffineDemo2.java

実行結果

AffineDemo2-1.gif

【例3】

左右を反転した図形の描画。

図形の右端をx軸まで水平移動し、x軸の左右を反転させた後、元の位置に戻す。
(アフィン変換の合成の例)

プログラム AffineDemo3.java

実行結果

AffineDemo3-1.gif

更新日:2004-03-22