08.03 爺になってからの三角関数


以前作業中に昔懐かしいオールナイトニッポンという深夜ラジオを聞いておりましたら(最近はラジコのタイムフリーで昼間でも深夜ラジオを聞けます)、某アイドルが「大人になってから昔習ったsin cos tanなんて使う人がいるんかねぇ?」などと言っておりました。ところがこれから色々作っていくわけなんですけど、この三角関数が非常に大きな役割をもっており一番押さえておかねばならないのです。特にゲームを作っている方などは見た目とは違い非常に高度な三角関数・行列・ベクトルを駆使しています。このため取り合えず既に忘れてしまった三角関数を押さえておくことにします。



★三角関数とは
今までの部分を少しやってきてから改めて「三角関数はこれです」というのも変ですが、遠い昔学校で習ったときは単に「覚える」という目標でしたが、三角関数というのは別の見方をすると、「点Aから点Bを見た時、線bは点bのX座標値、線aはY座標値という見方ができます。


角度を求めるには、このようになります。
θ = arcSin a c

θ = arcCos b c

θ = arcTan a b


先日行いました点Pと全く同じことになるわけです。




★余弦定理
△ABCの頂点Cから辺ABに垂線を下ろしてきた点をHとすると、直角三角形AHCにおいて次の関係式が成り立ちます。
     CH = b * Sinθ            AH = b * Cosθ

すると、直角三角形BHCにおいて、次の式が成り立ちます。

    a2    = (CH)2 + (BH)2
            = (b * Sinθ)2+(c - b * Cosθ)2
            = b2 * Sin2θ + c2 - 2bcCosθ + b2Cos2θ
            = b2 (Sin2θ + Cos2θ ) + c2 - 2bcCosθ
            = b2 + c2 - 2bcCosθ 


   b2    = c2  +  a2 - 2caCosθ  
   c2    = a2  +  b2 - 2abCosθ  



★応用
  詳細を知りたい方のためにご紹介したブログ「roombaの日記」さんに載っている解法は、この余弦定理を利用している。

roombaの日記
テオ・ヤンセン機構の計算【詳細版】
http://roomba.hatenablog.com/entry/2015/02/26/024903



最初だけ少しだけ解説すると



★ディグリー(degree)とラジアン(radian)
三角関数をコンピュータで扱う場合最初に一番注意しないといけないのは、小中学校で習う場合は1回転すると360°、半分は180°ですが、sin/cos/tanの各々に入力する値はラジアン(radian)という単位で与えます。ラジアンに対しこちらはディグリー(degree)といいます。前者の角度法を弧度法といい、後者を度数法といいます。弧度法は円周を基準としているため下記となります。
  1周= (2 × π)radian = 360degree
    半周= π radian = 180degree



★原動節から点Aを求める
これはブラウン運動でやった長さ(m)と角度θから座標を求める方法を使って、次のように計算する。


{ Ax = Ox + m × cos θ Ay = Oy + m × sin θ



★△ABCを作るために点Aと点Bを結ぶ直線の長さを求める

AB = a + Ax 2 + l + Ay 2



★余弦定理用に線分ABに垂線を下ろした時のX成分とY成分を求める
ブログでは(xc , yc)を求めている。∠CBAは、θbとすると

{ xc = b × cos θ b = AB 2 + b 2 - j 2 2AB yc = b 2 - xc 2


θabを算出する
ここで気を付けないといけないのは、アークタンジェント(arcTan または tan-1)です。
コンピュータが使用できる関数はsin→sin-1、cos→cos-1、と一対なのですが、tanはtan-1とatan2と二種類存在します。
これは算出できる範囲の違いによるもので、
    atan()                -(π/2) ~ (π/2)
    atan2()               -π ~ π

θ ab = arcTan Ay - By Ax - Bx


★点Cを算出する
今度は点Bを基準に同じように余弦定理を利用すると点Cが算出されます。
これと全く同じことを全ての点で行っていくわけです。

{ Cx = Bx + xc × cos ( θ ab ) + yc × cos ( θ ab + π 2 ) Cy = By + xc × sin ( θ ab ) + yc × sin ( θ ab + π 2 )