はつねの日記

Kinect, Windows 10 UWP, Windows Azure, IoT, 電子工作

Math.Atan2覚書

生徒「数学がわかったからって社会に出て何の役にたつの?」

先生「これがわからないあなたが社会に出て何の役にたつの?」

まあ、こんな会話があるとかないとか。

さて、一般的な社会よりも数学が役に立ちやすいプログラミングの世界ですが、というかプログラミング自体が数学だったり論理学だったりするわけですが、プログラミング以外の世界でも統計学と同じくらい使われることの多いのが三角関数だったりするのではないでしょうか。

でも、プログラミングの世界だと三角関数使わないって時も多いんですよね(統計学は資料作成とかで多かれ少なかれ、知らず知らずのうちにExcelとかでかるーく触れるときが)。

でも画像関連だとか、あと以外にXAMLでとか使うときがありますね。

そんな三角関数の一つがアークタンジェントですね。で、アークタンジェントにはAtanとAtan2がありますが、使い勝手や360度の区別があるAtan2だけしか使わないような。

VBC#で使うならば、Math.Atan2(y, x)ですね。返却値はラジアンなので180/Math.PIを書けると「度」で2点の角度が求まります。

2点で角度?察しのいい人なら分かると思いますが実は2点では角度って求まらないのです。2点の始点側がどっち向いているかというのを無意識的に補完してたりするんですよね。

で、この無意識な向いている方向とMath.Atan2(y, x)が想定している方向が若干ずれています。

 

image

無意識の場合、(x=0,y=1)方向を正面としているときが多いと思いますが、Math.Atan2は右を正面としています。また、時計回りにと思われがちですが反時計回りですね。

 

で、これなんですが、Math.Atan2(経度差=Δlongitude、緯度差=Δlatitude)としてみるといいんじゃないでしょうか。経度差がx軸だって感覚の方をずらしちゃうだけで、Math.Atan2の結果が北方向からの時計回りの角度に!

image

 

これで、CompassReading.MagneticHeadingプロパティ(磁北が0で時計回りを「度」で返却)と合わせやすくなりましたね。