speg03の雑記帳

主に未来の自分のために試したことなどを記録しています

大きさのある物体の2次元回転

さっきのだと物体を動かすときに幅と高さが等しくないとダメだったので,幅と高さが違う場合でもできるように考えました.

状況としてはこんな感じ.

オブジェクトの幅がwで高さがh.括弧になっているのは座標を示します.

オブジェクトBaseを中心にオブジェクトOを右に90度回転させるとオブジェクトO'の位置になります.それぞれのオブジェクトの基準点は左上にあるよ!

で,さっきのを少し変えると….

\begin{eqnarray} \begin{pmatrix} x^{\prime} \\ y^{\prime} \\ 1 \end{pmatrix} &=& \begin{pmatrix} 1 && 0 && a \\ 0 && 1 && b \\ 0 && 0 && 1 \end{pmatrix} \begin{pmatrix} w && 0 && 0 \\ 0 && h && 0 \\ 0 && 0 && 1 \end{pmatrix} \begin{pmatrix} \cos\theta && -\sin\theta && 0 \\ \sin\theta && \cos\theta && 0 \\ 0 && 0 && 1 \end{pmatrix} \\ && \begin{pmatrix} 1/w && 0 && 0 \\ 0 && 1/h && 0 \\ 0 && 0 && 1 \end{pmatrix} \begin{pmatrix} 1 && 0 && -a \\ 0 && 1 && -b \\ 0 && 0 && 1 \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} \end{eqnarray}

幅と高さの分をスケーリングして後で戻すようにした.

で,最終的な点(x', y')は次のようになります.
\left\{x^{\prime} = (x - a)\cos\theta - w(\frac{y - b}{h})\sin\theta + a \\ y^{\prime} = h(\frac{x - a}{w})\sin\theta + (y - b)\cos\theta + b \right