バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia3-backnumber/
はじめに
アフィン変換のアフィン行列は合成できる。
その理屈の話。
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
アフィン行列の合成
前回は、アフィン変換を実際にプログラムしたから、もうばっちりだね。
あー、まだ入り口に立っただけだな。
まだ入り口かよ・・・。
実は、アフィン変換のアフィン行列は合成ができる。
合成?
アフィン変換のシリーズの最初にもちょっと見せたが、
伸縮、移動、回転の組み合わせが可能だ。
これは、それぞれのアフィン変換を順番にやっただけじゃないの?
伸縮したあとに移動させて、そのあとに回転。
って感じで。
いんや。
変換行列としては1個として処理している。
このアニメーションの1フレームに対しては1回のアフィン変換しかしていない。
まじかよ。
そんなことできんのか。
アフィン行列の合成の具体例
試しに移動アフィンと回転アフィンを合成してみよう。
まずはそれぞれのアフィン変換の式を見てみよう。
移動アフィン
\(
\begin{bmatrix}
x\prime\\
y\prime\\
1
\end{bmatrix}=
\begin{bmatrix}
1 & 0 & 0.5 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{bmatrix}
\begin{bmatrix}
x\\
y\\
1
\end{bmatrix}
\)
回転アフィン
\(
\begin{bmatrix}
x\prime\\
y\prime\\
1
\end{bmatrix}=
\begin{bmatrix}
\cos(30^\circ) & -\sin(30^\circ) & 0 \\
\sin(30^\circ) & \cos(30^\circ) & 0 \\
0 & 0 & 1
\end{bmatrix}
\begin{bmatrix}
x\\
y\\
1
\end{bmatrix}
\)
そして、移動したあとに回転させる場合は以下になる。
\(
\begin{bmatrix}
x\prime\\
y\prime\\
1
\end{bmatrix}=
\begin{bmatrix}
\cos(30^\circ) & -\sin(30^\circ) & 0 \\
\sin(30^\circ) & \cos(30^\circ) & 0 \\
0 & 0 & 1
\end{bmatrix}
\begin{bmatrix}
1 & 0 & 0.5 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{bmatrix}
\begin{bmatrix}
x\\
y\\
1
\end{bmatrix}
\)
実施したいアフィン変換の行列を後ろから並べていくのか。
先に移動アフィンの計算をして、その後に回転の計算をするからイメージともあってるな。
あれ?
それだと、行列を合成していることにならないのか?
行列を合成ということは、
回転アフィン行列と、移動アフィン行列を先に計算して、そのあとにアフィン変換をするってことだよね?
そうそう。
行列は交換法則は適用できないが、結合法則は適用できる。
この点は次回深堀りしていこう。
まとめ
まとめだよ。
- アフィン行列の合成できる。
- 試しに回転アフィンと移動アフィンの合成の雰囲気。
- 実施したい行列が後ろから並ぶ感じ。
- 行列の結合法則を利用して計算自体は前方から実施可能。
バックナンバーはこちら。
コメント