Computer-graphics-2d-transformation

提供:Dev Guides
移動先:案内検索

2D変換

変換とは、ルールを適用することにより、いくつかのグラフィックスを別のものに変更することを意味します。 変換、拡大または縮小、回転、せん断など、さまざまな種類の変換を行うことができます。 変換が2D平面で行われる場合、2D変換と呼ばれます。

変換は、コンピューターグラフィックスで重要な役割を果たし、画面上のグラフィックスの位置を変更し、サイズや向きを変更します。

同種座標

変換とそれに続く回転やスケーリングなどの一連の変換を実行するには、順次プロセスに従う必要があります-

  • 座標を変換し、
  • 変換された座標を回転してから、
  • 回転した座標をスケーリングして、複合変換を完了します。

このプロセスを短縮するには、2×2変換行列の代わりに3×3変換行列を使用する必要があります。 2×2行列を3×3行列に変換するには、追加のダミー座標Wを追加する必要があります。

この方法で、2つの数字の代わりに3つの数字でポイントを表すことができます。これは*同次座標*システムと呼ばれます。 このシステムでは、すべての変換方程式を行列乗算で表現できます。 デカルトポイントP(X、Y)は、P ’(X〜h〜、Y〜h〜、h)により同次座標に変換できます。

翻訳

翻訳は、オブジェクトを画面上の別の位置に移動します。 変換座標(t〜x〜、t〜y〜)を元の座標(X、Y)に追加して、新しい座標(X ’、Y’)を取得することにより、2Dで点を変換できます。

翻訳

上記の図から、あなたはそれを書くことができます-

  • X ’= X+ t〜x〜*
  • Y ’= Y+ t〜y〜*

ペア(t〜x〜、t〜y〜)は、変換ベクトルまたはシフトベクトルと呼ばれます。 上記の方程式は、列ベクトルを使用して表すこともできます。

$ P = \ frac \ {[X]} \ {[Y]} $ p '= $ \ frac \ {[X']} \ {[Y ']} $ T = $ \ frac \ {[t _ \ { x}]} \ {[t _ \ {y}]} $

私たちはそれを次のように書くことができます-

*P ’= P+ T*

回転

回転では、オブジェクトをその原点から特定の角度θ(シータ)で回転させます。 次の図から、点P(X、Y)は、原点から距離rの水平X座標から角度φにあることがわかります。

角度θで回転させたいとしましょう。 新しい場所に回転すると、新しいポイントP '(X'、Y ')が得られます。

回転

標準の三角法を使用して、点P(X、Y)の元の座標は次のように表すことができます-

$ X = r \、cos \、\ phi …​…​ (1)$

$ Y = r \、sin \、\ phi …​…​ (2)$

同様に、ポイントP '(X'、Y ')を次のように表すことができます-

$ \ {x} '= r \:cos \:\ left(\ phi \:+ \:\ theta \ right)= r \:cos \:\ phi \:cos \:\ theta \:-\: r \:sin \:\ phi \:sin \:\ theta …​…​. (3)$

$ \ {y} '= r \:sin \:\ left(\ phi \:+ \:\ theta \ right)= r \:cos \:\ phi \:sin \:\ theta \:+ \:r \:sin \:\ phi \:cos \:\ theta …​…​. (4)$

式(1)と(2)をそれぞれ(3)と(4)に代入すると、次のようになります。

$ \ {x} '= x \:cos \:\ theta − \:y \:sin \:\ theta $

$ \ {y} '= x \:sin \:\ theta+ \:y \:cos \:\ theta $

上記の方程式を行列形式で表すと、

[X 'Y'] = [X Y] \ begin \ {bmatrix} cos \ theta&sin \ theta \\ -sin \ theta&cos \ theta \ end \ {bmatrix} OR

P ’= P R

Rは回転行列です

R = \ begin \ {bmatrix} cos \ theta&sin \ theta \\ -sin \ theta&cos \ theta \ end \ {bmatrix}

回転角度は正と負のどちらでもかまいません。

正の回転角度の場合、上記の回転行列を使用できます。 ただし、負の角度の回転の場合、マトリックスは次のように変化します-

R = \ begin \ {bmatrix} cos(− \ theta)&sin(− \ theta)\\ -sin(− \ theta)&cos(− \ theta)\ end \ {bmatrix}

= \ begin \ {bmatrix} cos \ theta&-sin \ theta \\ sin \ theta&cos \ theta \ end \ {bmatrix} \ left(\ because cos(− \ theta)= cos \ theta \;および\; sin(− \ theta)= −sin \ theta \ right)

スケーリング

オブジェクトのサイズを変更するには、スケーリング変換が使用されます。 スケーリングプロセスでは、オブジェクトのサイズを拡大または縮小します。 スケーリングは、目的の結果を得るために、オブジェクトの元の座標にスケーリング係数を掛けることで実現できます。

元の座標が(X、Y)、スケーリング係数が(S〜X〜、S〜Y〜)、生成された座標が(X ’、Y’)であると仮定します。 これは以下に示すように数学的に表すことができます-

  • X '= X。 S〜X〜およびY '= Y S〜Y〜*

スケーリング係数S〜X〜、S〜Y〜は、それぞれXおよびY方向にオブジェクトをスケーリングします。 上記の方程式は、以下のように行列形式で表すこともできます-

\ binom \ {X '} \ {Y'} = \ binom \ {X} \ {Y} \ begin \ {bmatrix} S _ \ {x}&0 \\ 0&S _ \ {y} \ end \ {bmatrix}

OR

  • P ’= P S*

ここで、Sはスケーリング行列です。 次の図に、スケーリングプロセスを示します。

スケーリング前 スケーリング後

スケーリング係数Sに1未満の値を指定すると、オブジェクトのサイズを小さくできます。 1より大きい値を指定すると、オブジェクトのサイズを増やすことができます。

反射

反射は、元のオブジェクトの鏡像です。 つまり、180°の回転操作であると言えます。 反射変換では、オブジェクトのサイズは変わりません。

次の図は、X軸とY軸、およびそれぞれ原点に関する反射を示しています。

Reflection Reflection Line

剪断

オブジェクトの形状を傾斜させる変換は、せん断変換と呼ばれます。 2つのせん断変換* X-せん断*および* Y-せん断*があります。 1つはX座標値をシフトし、もう1つはY座標値をシフトします。 しかしながら;どちらの場合も、1つの座標のみが座標を変更し、他の座標はその値を保持します。 せん断は、*スキュー*とも呼ばれます。

Xせん断

Xせん断はY座標を保持し、X座標に変更が加えられます。これにより、下の図に示すように垂直線が右または左に傾斜します。

X-Shear

X-せん断の変換行列は次のように表すことができます-

X _ \ {sh} = \ begin \ {bmatrix} 1&shx&0 \\ 0&1&0 \\ 0&0&1 \ end \ {bmatrix}

Y '= Y+ 〜 X

X ’= X

Yせん断

YシアはX座標を保持し、Y座標を変更します。これにより、次の図に示すように、水平線が上下に傾斜する線に変換されます。

Y-Shear

Yせん断は、次の行列から表すことができます-

Y _ \ {sh} \ begin \ {bmatrix} 1&0&0 \\ shy&1&0 \\ 0&0&1 \ end \ {bmatrix}

X ’= X+ Sh〜x〜。 Y

Y ’= Y

複合変換

平面T1の変換の後に2番目の平面変換T2が続く場合、結果自体は、T1とT2の順序で構成された単一の変換Tで表すことができます。 これはT = T1∙T2と書かれています。

複合変換は、変換行列を連結して結合変換行列を取得することで実現できます。

結合行列-

*[T] [X] = [X] [T1] [T2] [T3] [T4]…。 [Tn]*

[Ti]は次の組み合わせです

  • 翻訳
  • スケーリング
  • 剪断
  • 回転
  • 反射

一般的に行列の乗算は累積的ではないため、変換の順序の変更は異なる結果をもたらします。つまり、[A]です。 [B]≠[B]。 [A]および乗算の順序。 変換を作成する基本的な目的は、一連の変換を次々に適用するのではなく、1つの合成変換をポイントに適用することで効率を上げることです。

たとえば、任意の点(X〜p〜、Y〜p〜)を中心にオブジェクトを回転させるには、3つのステップを実行する必要があります-

  • ポイント(X〜p〜、Y〜p〜)を原点に変換します。
  • 原点を中心に回転させます。
  • 最後に、回転中心を元の位置に戻します。