C#プログラム画像処理プログラミング

【C#】グローバル変換を使ったアフィン変換

.NETで画像や線などを描画する時はGraphicsオブジェクトに対して描画を行いますが、このGraphicsオブジェクトの座標系をアフィン変換する処理をグローバル変換と言います。

 

グローバル変換された Graphicsオブジェクトに対し描画を行うと、アフィン変換された状態で、画像や線が描画されます。

 

ただ、一般的なアフィン変換では

 

【C#】グローバル変換(アフィン変換)

 

のように表現される場合が多いかと多いと思いますが、マイクロソフトの仕様では、上記の行列を転置(行と列を反転する)した

 

【C#】グローバル変換(アフィン変換)

 

のように表示されます。

また、アフィン変換の座標系は下図のように、左上が原点、Y軸は下方向、回転は時計周りが正の方向となります。

 

【C#】グローバル変換(アフィン変換)

 

そのため、平行移動や拡大縮小、回転の変換行列も一般的な変換行列を転置した表現となります。

 

X軸方向へTx、Y軸方向へTyだけ移動する平行移動の変換行列は、

【C#】グローバル変換(アフィン変換)

 

X軸方向へSx倍、Y軸方向へSy倍だけ拡大する変換行列は、

【C#】グローバル変換(アフィン変換)

 

原点まわりにθ°回転移動する変換行列は

【C#】グローバル変換(アフィン変換)

 

となります。

少し紛らわしいので、一般的なアフィン変換と混同しないように注意して下さい。

このように表現するのは、私の経験的にはマイクロソフトだけ?だと思います。

(参考)

グローバル変換とローカル変換 - Windows Forms .NET Framework
Graphics オブジェクトによって描画されたすべての項目にグローバル変換が適用されるしくみと、特定の項目にローカル変換が適用されるしくみについて説明します。
変換の行列表現 - Windows Forms .NET Framework
線形および複合変換の行列表現について説明します。

 

しかし、.NET Frameworkでは特に変換行列を知らなくても、アフィン変換用のメソッドが用意されているので、それらを使うと間違いが少ないでしょう。

 

平行移動は TranslateTransform
拡大縮小は ScaleTransform
回転移動は RotateTransform

 

(参考)Graphicsメソッド

Graphics クラス (System.Drawing)
GDI+ 描画サーフェイスをカプセル化します。 このクラスは継承できません。

 

逆に、行列を使ってアフィン変換する事も可能なので、スキュー変換のような変換も行う事ができます。

(参考)

Matrix クラス (System.Drawing.Drawing2D)
ジオメトリック変換を表現する 3 × 3 のアフィン行列をカプセル化します。 このクラスは継承できません。

 

また、アフィン変換を行うと、変換後の座標から、変換前の座標を計算したい場合がありますが、System.Drawing.Graphics.TransformPointsというメソッドがあるので、これを使うと簡単に座標が求められます。

 

これらのメソッドを使って、アフィン変換のサンプルプログラムを作成しました。

 

【C#】グローバル変換(アフィン変換)

(ダウンロード)GlobalTransformations.zip(Visual Studio 2008 Exress C#)

 

このサンプルでは見た目上では一般的に用いられる行列の表現に合わせています。
また、エラー処理などは行っていないので、ご了承下さい。

アフィン変換の勉強の手助けになれば...

 

C#へ戻る

コメント

タイトルとURLをコピーしました