こんにちはtaroです.

今回はゲームを作る上で必要となる基本的な位置や角度の計算方法について書いてみました.

ムツカシイ計算はやりたくないけれど、計算する方法が知りたい!という方にオススメです.

 

位置と距離の計算

 

点Aから点Bを見たときの位置と距離を計算します.

var A:Point = new Point(3, 5);
var B:Point = new Point(1, 1);

var direction:Point = B.subtract(A);

directionが方向となります.距離を測るには、direction.lengthを使います.

ab.png

どっちからどっちを引けばいいんだったか悩む時は、

2 - 5 = -3

について考えるといいでしょう.数直線上で5から2を見ると左に3のところにあります.数直線では左がマイナスでした.

scaler.png

 

Aから見たBの位置を知りたいので、BからAを引けばいいということになります.

 

角度の計算

これが少し厄介です.Math.atan2を用いれば、x軸から時計回りを正として測ってくれます.

angle.png

少し厄介なのは、Math.atan2が-Math.PI~Math.PIの値を返すということです.

図のようになるので調度Math.PIや-Math.PIの辺りで計算がずれてしまいます.これは特に二つの角度の差分をとるとき等に特に厄介です.

PI.png

下のサンプルでPlace mouse~と書いてある辺りにマウスをやってみるとどうも上手く差分が取れていないように見えてしまいます.

勿論このサンプルの動き程度でしたら、こういう計算は必要がないかもしれませんが、一般的に角度の差を求めようとしたとき、この問題にぶつかってしまいます.

 

 

そこで、

 

角度を0~2πに丸め込む

ということを考えます.ActionScriptでは小数点での割り算の余りというのをサポートします.

これは、ActionScriptというより、ActionScriptが採用しているECMAの数値の演算で規定されているのですが、

// 420°を直してみる
var a:Number = Math.PI * 7 / 3;
// 2πで割る.
a %= Math.PI * 2;
// ラジアン角だと分かりにくいので度数法に直します.
trace(a * 180 / Math.PI); // 59.999999999999986

大体60°になっているので目的は果たせていますね.これでは未だ困ります.aの値をマイナスにしてみるとどうでしょう.

// -420°を直してみる
var a:Number = - Math.PI * 7 / 3;
a %= Math.PI * 2;
trace(a * 180 / Math.PI); // -59.999999999999986

マイナスとなってしまいました.実は、Math.PI*2で割ると、-2π~2πの値が返ってきます.なので、0未満のときは2πを足します.

// 修正版
var a:Number = - Math.PI * 7 / 3;
a %= Math.PI * 2;
a += (a < 0) ? Math.PI * 2 : 0;
trace(a * 180 / Math.PI); // 59.999999999999986

出来ました.

 

 

HTML5飯