#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}$を取り出せる。