デグリーからラジアンに変換する

はいどーもこんにちは仕事ない数学嫌いマンの無職です。
本日はデグリー表記からラジアン表記に変換する方法を紹介したいと思います。
『ゲームを動かす数学・物理』から一部の計算式を借りてます(が、そもそも広く使われているものなのであんまり関係ないかも)。

デグリー表記とラジアン表記ってなんやねん

そもそもデグリー表記やらラジアン表記やらってなんでしょう。
おそらく僕と同じような文系の人間には馴染みのない言葉だと思います。
デグリー表記は「この三角形の角度は45度だ」とかで使う「45度」の「度」です。
ラジアン表記はこの「45度」を別の言い方に変えたものです(具体的にはラジアン表記で45度は「π/4」)。
例えば1メートルは100センチとも言えますし、3.28084フィートとも言えますよね。
それと同じです。

デグリー表記を使いたい

ここまでわかったところで、「ラジアン表記なぞわかりゃせん! おいはデグリー表記でいくばい!」と思う方もいるかと思います。
僕も似たようなもんです。
ですがプログラミングをしていると、引数にラジアン表記を受け取る関数ってわりとよくあるんですよね。
特に2Dのゲームを作っているとよく出てきます。
そこで変換するための式を覚えておくとラクチンです。

デグリー表記=ラジアン表記*180/π
ラジアン表記=デグリー表記*π/180

これを覚えておくと、デグリー表記のものを簡単にラジアン表記に変換できます。
で、変換した結果を関数に渡せばOKということですね。

計算式とか覚えたくない

上記の計算式は特に難しいものではないですが、そもそも数学嫌いの僕は計算式なんて覚えたくないです。
覚えられないです。
というわけで関数化しておきましょう。

例えばこんな感じ。

これでConvertToRagianメソッドにデグリー表記の値を渡すと、ラジアン表記の値を返してくれるようになります。
ただUnityにはMathf.Deg2Radというものがあるので(逆バージョンのMathf.Rad2Degもあります)、これを使ってみてもよいかもしれません。

結果は全く同じです。
このMathf.Deg2Radはいわゆる定数なので、Mathf.PI / 180.0fと計算するよりは高速かもしれません(コンパイラが最適化するのかどうかとかはよく知りませんが)。

ただ個人的なことを言えば、「デグリー表記に掛けて使う」ということすらすぐ忘れてしまうので、できればstaticなメソッドで用意してくれたら嬉しかったなあ……なんてのは思います(要はConvertToRagianと同じことをしてくれるヤツ)。
なんでひと手間かかる定数なんでしょうね?
僕は2Dのもの専門ですが、3Dのときにこれが生きてきたりするんでしょうか。
特に問題がなさそうなら、Mathf構造体の拡張メソッドとしてConvertToRagian追加してみようかなあ……。

余談

ここからは若干話が逸れるのですが、『ゲームを動かす数学・物理』でfloat型について面白い性質が紹介されていました。
例えば以下のプログラムはコンソール画面に何を出力するでしょうか?

普通に考えると1000000000と400を足しているのですから、1000000400ですよね。
ですが変数cには100000000が代入されます。
この現象をざっくりと説明すると「大きすぎる値と小さすぎる値で演算すると、うまく計算できない場合がある」ということです。
よく「float型はdouble型に比べて精度が低い。誤差が出る」とか言われてますが、まさにそれのことです。
こうなる詳しい理屈は『ゲームを動かす数学・物理』に書かれています。
僕なんかは「float型だと小数点の計算がたまに狂うのかな」くらいにしか思っていなかったので、こんな簡単な計算すら誤差が出るのは驚きましたよ。

さてこの「誤差」ですが、角度の正規化をおこなっていない場合

この計算でも誤差が生じる場合があるらしいです。
元の物体のdegreeが0として、延々と回転させると45、180、360、405……などなどと増えていきます(45と405は意味的に同じで、一回転している)。
これを放置して回転させ続けると、degreeの値がめちゃくちゃでかくなるんですね。
で、そうすると誤差が出てしまい、最悪の場合はゲーム中で回転が止まってしまうようです。

どうすりゃええねんっちゅー話ですが、値が大きくなるのが問題なわけですから、値を0度から360度までに制限し、その値をループさせればいいようです。
UnityならMathf.Repeatが使えると思ったのですが、そもそもMathf.Repeatが大きい値に対応してない臭いです(多分理屈はfloatで生じる誤差と同じ)。
もう少しイケてる方法を考えないとダメなようですね。

あとこの方法だと、例えば405を渡して返ってくる値は45度をラジアン表記した0.7853982であり、405度をラジアン表記した値ではないので注意が必要になります。
2Dゲームで使う分には特に問題ない気がしますが、数学的にややこしいことしたりすると混乱するんでしょうかね?
よくわかりません。

終わりに

数学大嫌いマンの僕ですが、ちょっとずつでも数学について勉強していきたいと思います。

ほなそんな感じでまた。

フォローする