2013年12月26日木曜日

今から始める三角関数



三角関数。

もはや自分の中では文学の用語です。

高校のときに数学は諦めました。
そして頭の中を通り過ぎていった単語。
三角関数。

いまになって、三角関数というものと対峙しました。
そしてちょっとだけ分かりましたので、忘れないうちにお伝えしておきたいです。


何とかこれをやりたい!(・・・でも、これが無いと出来ない・・・)

そんな状況に追い込まれないと、自分は学ぶことが出来ませんでした。

プログラムをやり始めて、いくつかやりたいことが出てきて、
どうやら三角関数を使わなくてはいけなさそうな状況になり、
やっと興味が湧いたんです。

だから、高校生のときに、三角関数が必要なシチュエーションがあったら、
きっと覚えられたのかもしれません。
(中学生くらいでプログラムを勉強を始めればよかった!)

そんなわけで、やりたかったものは下記の3つです。

  • 円を描く。
  • 獲物の方に自分を回転させる。
  • 2つの円に接した円を描く。


これらの課題を三角関数を勉強しながら、
図が簡単に描けるプロセシングという言語で実装していきます。

プロセシングのウィンドウ画面。
書けば、すぐに図が表示されるお手軽な言語。


サイン、コサイン ( sin , cos )


そもそも、サイン、コサインとは何なんでしょうか。

たぶん、単語が新しすぎて臆してしまうのです。
自分の中では下記のように訳して乗り越えました。


  • サイン  = 斜めに対しての縦軸の比率。 → y座標。
  • コサイン = 斜めに対しての横軸の比率。 → x座標。


こんな感じです。

斜めの部分からの比率!

角度が違えば、比率も違う。



繰り返しになりますが、サインは縦、コサインは横です。

このサイン、コサインの比率は、角度と関係性があります。

この関係性は時計の針をイメージしてもらえると分かりやすいと思います。
針の長さは10mmとします。

0度のとき cos = 1.0

90度のとき cos = 0.0


上記の例はcosなので、横軸(x軸)が基準です。
sinは縦軸なので、0度のとき、0.0になり、90度のとき、1.0になります。

中途半端な角度77度のときの横軸と縦軸の値はどうなるの?
そうゆう細かいことは、プログラムで入力すれば教えてくれます。

縦軸(y軸)が0.97で、横軸(x軸)が0.22

つまり図にすると、こんな位置になります。



今は77度のとき、時計の針がどこにあるのか。
それを調べました。

では、
角度1度のときは? 角度2度のときは? 角度3度のときは?
・・・と繰り返して点をうっていくと円になります。

ひとつひとつは点。
全体として円に見える。


これで一つ目の課題はクリアです。円が描けました!


アークタンジェント ( atan )


つぎは、「獲物の方に自分を回転させる」です。

どんなときに役に立つか?

それは自分がある方向に向いていて、突然、目的地が現れた時です。
すぐにその方向に向かなくては行けません。

ですが、どのくらい回転すれば良いのでしょう??



まず、自分が0度から、どのくらい角度なのかを調べます。
次に、獲物の方向の角度を調べます。

ここで求めた獲物への角度は、0度からの角度になっているので、
ここから自分の元々の角度を引くと、どのくらい回転すればよいか分かります。
(下図参照)



では、目標の座標から、どうやって自分の角度を求めるのか。
ここで活躍するのが、アークタンジェント(atan)です。

アークは「逆」という意味で逆三角関数と言われているようです。

三角関数が、角度を入れると辺の比率を出してくれるのに対して、
逆三角関数は、辺の比率を入れると、角度を出してくれます。


  • 角度分かる、座標を知りたい! →  三角関数
  • 座標分かる、角度を知りたい! → 逆三角関数


座標はx軸とy軸で表現されています。( x = 10 , y = 15 みたいな感じに)

便利なことにアークタンジェントは、x軸とy軸から角度を出してくれるんです。




サイン、コサインとか、アークタンジェントとか、
名前が仰々しいので臆してしまいますが、実際に便利に使える場面があると、
まるで新しい工具を手に入れたみたいになります。
(実際の工具と違って無料なのが良いところですね!)

追記(20131226):
atanだけでは、鏡に映ったような逆向きの三角形に対応出来ないことが分かりました。
atan2というものを使えば、うまく対応できますが、
それなりに説明が長くなりそうなので、更新に少々お時間をいただきます。


余弦定理


いま、とあるプログラムの課題に取り組んでいるのですが、
そこで2つの円に接していている円を描く必要がでてきました。

描こうとしている円の半径は分かっている。


分かっていることと、分からないことを整理します。

<分かっている>

  • 2つの円の半径
  • 2つの円の中心座標
  • 2つの円がどのくらい離れているのか
  • 描こうとしている円の半径

<分からない>


  • それぞれの角度
  • 描ことしている円の中心座標

下の図のように半径を足していくと、3つの辺の長さが分かります。
2つの円の中心がどのくらい離れているかは、もう分かっています。



ネットで調べたところ、辺の長さが分かっていれば角度が分かる式があるようです。
なぜ、このような式が成り立つか・・・
証明も読んでみたのですが、まだまだ理解ができません。
ここは目先の利益を優先して、式だけ使います。

見たことがあるような気もしなくはない・・・


ちなにみ、a,b,cが指す辺と、角度を求めたい角は下図のとおりです。

Aの正面の辺がaになる、というようなルール。


この計算で出てきた数値が、そのまま角度なのか?

残念ながら違いました。
そんなに甘くはなかったようです。

0.38? この数値は一体なに?

cos = 0.38 のとき、これは何を意味しているのでしょうか。

一番最初にご紹介した、サインとコサインの翻訳を見直します。

  • コサイン = 斜めに対しての横軸の比率。 → x座標。

もう一度。


つまり、コサインは角度ではなく、ただの比率です。

角度を求めるには、逆三角関数を使います。

この場合、斜めの線と、横軸の比率から角度を求める道具がります。
それがアークコサイン(acos)です。
斜めの線と、横軸を入れれば角度が出てきます。

余弦定理で出た数値を、アークコサインを使って変換したものが角度になります。

角度っぽい数値が出た!

実は角度を表示するためには、もう一工夫必要なんですが、
ちょっと長くなるので割愛します。



角度が分かれば、半径を足した長さ( ar + pr )の長さの線を、
求めた角度、回転させてあげれば、円の中心座標が分かります。

これで何とか出来ました。
先日買ったばかりのアンドロイド端末に、無駄に出力してみました。

指の位置で、半径が変化する。

大きさが変わっても、ちゃんと対応する。



0 件のコメント :