#author("2019-05-22T18:06:54+09:00","default:qua","qua")
#author("2019-06-05T13:14:44+09:00","default:qua","qua")
#navi(Processing/2.ちょっと発展)
#mathjax()
*2-13 座標変換と行列 [#r0932e60]
rotate() や translate() で座標を変換することは行列の計算で行われている。
2次元の場合、
座標変換後の座標(x,y)と画面上の座標(u,v)の間には
\[\left[\begin{matrix}u\cr v\cr 1\end{matrix}\right]=M\left[\begin{matrix}x\cr y\cr 1\end{matrix}\right]\]
という関係がある。ただし、$M$は
\[\left[\begin{matrix}m_{00}& m_{01} & m_{02}\cr m_{10}& m_{11} & m_{12}\cr 0 & 0 & 1\end{matrix}\right]\]
であり、$m_{00}$, $m_{01}$, $m_{10}$, $m_{11}$ が座標の回転を、$m_{02}$, $m_{12}$ が原点の移動を表す。
実際、角度$\theta$の回転を表す行列は、
\[\left[\begin{matrix}\cos\theta & -\sin\theta & 0\cr \sin\theta & \cos\theta & 0\cr 0 & 0 & 1\end{matrix}\right]\]
であり、原点の$(a,b)$への移動は
\[\left[\begin{matrix}1 & 0 & a\cr 0 & 1 & b\cr 0 & 0 & 1\end{matrix}\right]\]
であることを確かめられる。

また、行列 $M_1$, $M_2$ に対応する座標変換を順次実施した結果は $M_1M_2$ による座標変換と等価である。

Processingで2次元の座標変換の行列を取得するには、
 PMatrix2D mat = (PMatrix2D)getMatrix();
を用いる。mat.mijにて要素$m_{ij}$を取り出せる。

3次元の場合は、点$(x,y,z)$ が点$(u,v,w)$に移されるとき、
\[\left[\begin{matrix}u\cr v\cr w\cr 1\end{matrix}\right]=M\left[\begin{matrix}x\cr y\cr z\cr 1\end{matrix}\right]\]
という関係がある。ただし、$M$は
\[\left[\begin{matrix}m_{00}& m_{01} & m_{02} & m_{03}\cr m_{10} & m_{11} & m_{12} & m_{13} \cr m_{20} & m_{21} & m_{22} & m_{23} \cr 0 & 0 & 0 & 1\end{matrix}\right]\]
である。左上の$3\times 3$ 行列が座標の回転を、右上の3次元列ベクトルが原点の移動を表す。

Processingで3次元の座標変換の行列を取得するには、
 PMatrix3D mat = (PMatrix3D)getMatrix();
を用いる。mat.mijにて要素$m_{ij}$を取り出せる。
を用いる。mat.m01, mat.m23など、mat.mijにて要素$m_{ij}$を取り出せる。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS