lisz-works

プログラミングと興味を貴方に

座標を回転させたときの計算の流れ

【スポンサーリンク】

三角関数

こんにちわlisです!

座標計算をしなければいけない!となったときに自分の数学力(というか記憶)の無さがエグくて頭を抱えていました……

そんななか旧友に連絡したところ、中高の数学な三角関数に関することを教えてくれました!

今回は教えてくれたことのメモとなります。

内容的には中高の数学ですが……やってないと丸っきり忘れるものですね……

座標計算でやったこと

ここまでの計算式を踏まえたうえで、ぼくが実際に行った座標計算を例に使い方を書いていきます。

やりたかったこと

画像内に座標(点A)があったとする。

画像の中心座標(点P)を軸に、点Aの位置を角度θ回転させたときの座標(点A')を求めたい。

やりたいこと 図

STEP1 点Pを基準に点

まず画像の中心を基準にするために、Aの座標から中点Pの座標をマイナスします。

$$ \begin{align} ax &= Ax - px\\ ay &= Ay - py \end{align} $$

これで中点Pの位置が(0, 0)として計算できます。

中点を(0, 0)とする

線PAと、点Aから垂直に線を引き、直角三角形を作ります。

この直角三角形の角θ(θ0とする)を求めます。

点P, 点Aを結ぶ直角三角形

STEP2 θ0を求める

点Aの座標(ax, ay)は分かっています。

なのでこの直角三角形の辺a=ay、辺b=axとなります。

直角三角形の辺と点A座標対応

なので、これを使って角θ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'となります。

c = r

なので

$$ r = c $$

となります。

STEP4 角θ1を定義

先程求めたθ0と、回転する分を指定した角度θの合計を「θ1」とします。

θ1

$$ \theta{_1} = \theta + \theta{_0} $$

つまり点Pから水平に引いた線から見ると、点A'は角θ1を持つ直角三角形を描くことになります。

STEP5 点A'を求める

やっと点A'を求めていきます。

θ1とc(=r)がわかれば、それを元に他の辺を求めてx, yを求めることができます。

点A'を求める

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とかで計算→表示を繰り返してると「なるほど?」ってなります。