Flashゲーム講座 & アクションスクリプトサンプル集



角度とラジアン

 
 


 
■角度とは?

0 から 360 の値で一周する単位

 
■ラジアンとは?

0 から 2 * PI で一周する単位。
PI は円周率(3.14…)
 
■ラジアンって何に使うの?

sin や cos 関数を使うときに角度ではなくラジアンで指定する必要があります。

例)90度のときのサイン

    var kekka = Math.sin(0.5 * Math.PI);
 
■角度からラジアンに変換するには?

角度からラジアンに変換

    ラジアン = 角度 * Math.PI / 180;

 
■ラジアンから角度に変換するには?

ラジアンから角度に変換

    角度 = ラジアン * 180 / Math.PI;

 
 




角度から2Dベクトルに変換する

 
 


 
角度から2Dベクトルに変換する
 
 
必要なパラメータ

    rot = 30;	// 角度

角度から2Dベクトルに変換する

    x = Math.cos(rot * Math.PI / 180);
    y = Math.sin(rot * Math.PI / 180);
 
 

 




2Dベクトルから角度に変換する

 
 


 
2Dベクトルから角度に変換する


 
必要なパラメータ

    x = 2;	// x方向
y = 5; // y方向

2Dベクトルから角度に変換する

    rot = Math.atan2(y,x) * 180 / Math.PI;
 
 

 

■atan() を使って計算する

 
atan() を使うと、0~180度までの角度が求まります。

さらに x 軸の符号を調べて180度を加算すると0~360度まで計算することができます。
 
atan() を使って2Dベクトルから角度を求める

function MathGetAtan2(y,x){
	if(x > 0)	return Math.atan(y/x);
	else	return Math.atan(y/x) + Math.PI;
}

var x = Math.random() * 2 - 1;
var y = Math.random() * 2 - 1;
var rot = MathGetAtan2 (y,x) * 180 / Math.PI ;

if(rot > 180)	rot-= 360;
if(rot <-180)	rot+= 360;

trace(rot);
 
 




2つの角度の差を計算する

 

サンプルをダウンロード
 


 
■2つの角度の差を計算する

角度の差を計算するときに、360度の角度から-370度の角度まで最短距離で移動するには-10度移動すれば一致します。 そんな最短の角度の差を求めます。
 
必要なパラメータ

    rot1 = -70;	// 角度その1
    rot2 = 420;	// 角度その2
 
1) 2つの角度の差を求める

    sub = rot2 - rot1;

2) 角度差を 0~360度 に丸める

    sub -= Math.floor(sub / 360.0) * 360.0;

3) 角度差が -180~180 の範囲に収まるように丸める

    if(sub > 180.0)	sub -= 360.0;
 

 




2つの3Dベクトルから角度差を求める

 
 


 
■2つの3Dベクトルから角度差を求める

 
 
必要なパラメータ

    x1 = 2;   y1 = 4;    z1 = 4;
 
    x2 = 30;  y2 = -10;  z2 = -50;
 
1) ベクトル1を正規化

    var length = Math.sqrt((x1 * x1) + (y1 * y1) + (z1 * z1));
    if(length){
        length = 1.0 / length; 
        x1 = x1 * length;
        y1 = y1 * length;
        z1 = z1 * length;
    }

2) ベクトル2を正規化

	var length = Math.sqrt((x2 * x2) + (y2 * y2) + (z2 * z2));
	if(length){
		length = 1.0 / length; 
		x2 = x2 * length;
		y2 = y2 * length;
		z2 = z2 * length;
	}

3) 角度を求める

    var dot = ((x1 * x2) + (y1 * y2) + (z1 * z2));
    var rot = Math.acos(dot) * 180.0 / Math.PI;
 
注.この計算だけでは 0 度から 180 度までの差しか求まりません。 そこで、2 つのベクトルからさらに外積を求めてそれを回転軸にするといいです。