こんにちわlisです!
座標計算をしなければいけない!となったときに自分の数学力(というか記憶)の無さがエグくて頭を抱えていました……
そんななか旧友に連絡したところ、中高の数学な三角関数に関することを教えてくれました!
今回は教えてくれたことのメモとなります。
内容的には中高の数学ですが……やってないと丸っきり忘れるものですね……
座標計算でやったこと
ここまでの計算式を踏まえたうえで、ぼくが実際に行った座標計算を例に使い方を書いていきます。
やりたかったこと
画像内に座標(点A)があったとする。
画像の中心座標(点P)を軸に、点Aの位置を角度θ回転させたときの座標(点A')を求めたい。
STEP1 点Pを基準に点
まず画像の中心を基準にするために、Aの座標から中点Pの座標をマイナスします。
$$ \begin{align} ax &= Ax - px\\ ay &= Ay - py \end{align} $$
これで中点Pの位置が(0, 0)として計算できます。
線PAと、点Aから垂直に線を引き、直角三角形を作ります。
この直角三角形の角θ(θ0とする)を求めます。
STEP2 θ0を求める
点Aの座標(ax, ay)は分かっています。
なのでこの直角三角形の辺a=ay、辺b=axとなります。
なので、これを使って角θ0の角度を求めます。
$$ \begin{align} \tan \theta{_0} &= \frac{ay}{ax} \\ \theta{_0} &= \arctan \frac{ay}{ax} \end{align} $$
注意点としては、プログラム等で計算する場合、角度の単位が
- degree
- radian
のどちらなのかを確認しましょう。
Pythonのmathは、radianで計算します。
STEP3 長辺c = rを求める
さて、今度は長辺cを求めます。
三平方の定理を使えば簡単に求めることができます。
$$ \begin{align} c^2 &= ax^2 + ay^2 \\ c &= \sqrt{ax^2 + ay^2} \end{align} $$
「中点Pを軸に回転させる」ということは、線PAを半径(r)に持つ円周上を指定角度分動かした座標が点A'となります。
なので
$$ r = c $$
となります。
STEP4 角θ1を定義
先程求めたθ0と、回転する分を指定した角度θの合計を「θ1」とします。
$$ \theta{_1} = \theta + \theta{_0} $$
つまり点Pから水平に引いた線から見ると、点A'は角θ1を持つ直角三角形を描くことになります。
STEP5 点A'を求める
やっと点A'を求めていきます。
θ1とc(=r)がわかれば、それを元に他の辺を求めてx, yを求めることができます。
A'=(x, y)とします。
点A'のxを求める
$$ \begin{align} \cos{\theta{_1}} &= \frac{x}{r}\\ x &= r \cos{\theta{_1}} \end{align} $$
点A'のyを求める
$$ \begin{align} \sin{\theta{_1}} &= \frac{y}{r}\\ y &= r \sin{\theta{_1}} \end{align} $$
STEP6 中点P基準に戻す
点Pを(0, 0)位置にした場合でのA'(×, y)が求まりました。
あとは点Pの座標を加算して、元の正しい位置までずらしてあげれば完了です。
$$ \begin{align} x + px\\ y + py \end{align} $$
これで座標が任意の角度分、移動させることができます!
あとがき
座標を回転させたときの計算の流れでした!
はじめてちゃんとできたとき
「すげー!!!」
って自己満足しました(笑)
Pythonのmatplotlibとかで計算→表示を繰り返してると「なるほど?」ってなります。