ImagickDraw::affineに関するメモ

アフィン変換とは、「線形変換」と「平行移動」を組み合わせた3×3の行列を用いて変換を実行すること。
平面上の変換で指定するのは6つの値。

ImageMagickでのアフィン変換についての詳細はhttp://www.imagemagick.org/Usage/distorts/affine/を参照。

PHP+imagickではImagickDraw::affine関数を使用する。
ImagickDraw::affine
(PECL imagick 2.0.0)
ImagickDraw::affine — 現在のアフィン変換行列を設定する

説明
bool ImagickDraw::affine ( array $affine )

警告
この関数は、 現在のところ詳細な情報はありません。引数のリストのみが 記述されています。

現在のアフィン変換行列を、指定したものに設定します。
引用元:PHP(http://www.php.net/manual/ja/imagickdraw.affine.php)

affineパラメータにはsx, rx, ry, sy, tx, tyのキーを持つ連想配列を指定する。
sx=1, rx=0, ry=0, sy=1, tx=0, ty=0 の場合は変化しない。


Scaling(拡大縮小)
sxがx軸方向の拡大縮小率、syがy軸方向の拡大縮小率。
例)
  1.  ︙
  2. $affine = array('sx' => 1.5, 'rx' => 0, 'ry' => 0, 'sy' => 2, 'tx' => 0, 'ty' => 0);
  3. $draw->affine($affine);
  4.  ︙


負数の場合は鏡映。
例)
  1.  ︙
  2. $affine = array('sx' => -1, 'rx' => 0, 'ry' => 0, 'sy' => 1, 'tx' => 0, 'ty' => 0);
  3. $draw->affine($affine);
  4.  ︙



Shearing(剪断)
x軸もしくはy軸に沿って、両側を逆方向ずらす処理。tan(rad)の値を記述する。
rxがx軸に対する角度(その分だけy軸方向にずれる)、ryがy軸に対する角度(その分だけx軸方向にずれる)。
(数学関数一覧:http://jp1.php.net/manual/ja/book.math.php)
例)
  1.  ︙
  2. $affine = array('sx' => 1, 'rx' => 0, 'ry' => tan(deg2rad(60)), 'sy' => 1, 'tx' => 0, 'ty' => 0);
  3. $draw->affine($affine);
  4. $draw->annotation(0, 0, 'SAMPLE');
  5.  ︙



Rotations(回転)
時計回りに角度α(rad)回転させる場合、sx=cos(α)、rx=sin(α)、ry=-sin(α)、sy=cos(α)。
反時計回りに角度α(rad)回転させる場合、sx=cos(α)、rx=-sin(α)、ry=sin(α)、sy=cos(α)。
例)
  1.  ︙
  2. $affine = array('sx' => cos(deg2rad(20)), 'rx' => sin(deg2rad(20)), 'ry' => -sin(deg2rad(20)), 'sy' => cos(deg2rad(20)), 'tx' => 0, 'ty' => 0);
  3. $draw->affine($affine);
  4. $draw->annotation(0, 0, 'SAMPLE');
  5.  ︙


Translations(平行移動)
txがx軸方向の平行移動、tyがy軸方向の平行移動。
例)
  1.  ︙
  2. $affine = array('sx' => 1, 'rx' => 0, 'ry' => 0, 'sy' => 1, 'tx' => 20, 'ty' => 50);
  3. $draw->affine($affine);
  4. $draw->annotation(0, 0, 'SAMPLE');
  5.  ︙