●解説
ふたつの座標間の距離を計算したいことがあります。たとえば、当たり判定や距離をパラメータとして使いたい場合です。また、平面上の位置をxy座標でなく、レーダーのように距離と角度(方向)で指定できると便利なときもあります。たとえば、ゲームで飛行機を操縦するとか、砲台から砲弾を発射するといった処理です。
まず2点間の距離は、三平方の定理を使って求められます。これは直角三角形の斜辺の2乗は、他の2辺の2乗の和に等しいという関係です。2点の座標をそれぞれ(x1, y1)および(x2, y2)とし、2点間を結ぶ直線を斜辺とした直角二等辺三角形を考えます(図01-05-001)。すると、直角二等辺三角形の底辺が(x1 - x2)、高さが(y1 - y2)になります。よって、三平方の定理より、2点間の距離lはつぎのように導かれます。
l = √(x1 - x2)2 + (y1 - y2)2
|
図01-05-001■三平方の定理により2点間の距離を求める【ActionScript30_Math02_002.png】
数値の累乗には、Math.pow()メソッドを用います。また、平方根を求めるのは、Math.sqrt()メソッドです。
Mathクラス |
パッケージ
|
トップレベル
|
継承
|
Math→Object
|
pow()メソッド |
ASタイプ
|
M |
ランタイムバージョン
|
AIR 1.0/Flash Player 9
|
文法
|
Math.pow(base:Number, power:Number):Number
|
意味
|
基数を指数で累乗した数値が返されます。
|
引数
|
base:Number ― 基数つまり累乗される数値。
power:Number ― 指数つまり累乗する数値。
|
戻り値
|
引数に指定された基数を、同じく指定の指数で累乗し、その結果の数値を返します。
|
sqrt()メソッド |
ASタイプ
|
M |
ランタイムバージョン
|
AIR 1.0/Flash Player 9
|
文法
|
Math.sqrt(value:Number):Number
|
意味
|
指定された数値の平方根を返します。
|
引数
|
value:Number ― 平方根を計算する0以上の数値。
|
戻り値
|
引数に0以上の数値を指定するとその平方根、マイナスの値が指定されればNaNを返します。
|
つぎに、原点(0, 0)からの距離が1でx軸と成す角度がθの座標は、「円・楕円軌道をシミュレートしたい」で解説した三角関数の定義より、(cosθ, sinθ)で示されました(図01-05-002)。したがって、距離がrであれば、角度θの座標は(r cosθ, r sinθ)となります。
図01-05-002■距離が1で角度θのxy座標【FigMath03-002.png】
また、座標から角度を求めるには、Math.atan2()メソッドを用います。このメソッドの使い方については、「座標から角度を求めたい」をご覧ください。
→関連項目
「円・楕円軌道をシミュレートしたい」「座標から角度を求めたい」
○記述例
以下のスクリプト01-05-001をMovieClipシンボルのフレームアクションに設定すると、インスタンスがマウスポインタを追いかけるように、減速しながら近づきます(図01-05-003)。DisplayObject.enterFrameイベント(定数Event.ENTER_FRAME)のリスナー関数xMove()では、マウスポインタの座標から距離(nDistance)とラジアン値の角度(nRadian)を計算し、移動先の位置をMath.cos()とMath.sin()メソッドにより求めています。そして、その値に減速の比率(nDeceleration)を乗じたうえで、インスタンスのDisplayObject.xおよびDisplayObject.yプロパティに加算しています。
スクリプト01-05-001■インスタンスをマウスポインタに追随させる
// フレームアクション
// MovieClip: マウスポインタを追いかけるインスタンス
var nDeceleration:Number = 0.2;
addEventListener(Event.ENTER_FRAME, xMove);
function xMove(eventObject:Event):void {
var nX:Number = mouseX;
var nY:Number = mouseY;
var nDistance:Number = Math.sqrt(Math.pow(nX, 2) + Math.pow(nY, 2));
var nRadian:Number = Math.atan2(nY,nX);
x += nDistance * Math.cos(nRadian) * nDeceleration;
y += nDistance * Math.sin(nRadian) * nDeceleration;
}
|
図01-05-003■マウスポインタに減速しながら近づく【ActionScript30_04_010.png】
なお、減速しながら近づくいわゆる「イーズアウト」のアニメーションについては、前出「座標から角度を求めたい」の「※プロパティ値をイーズアウト(減速しながら変化)させる」をお読みください。また、同様の処理はPointクラスを使ってもできます。具体的には、「2点の座標間の計算をしたい」をご参照ください。
→関連項目
「2点の座標間の計算をしたい」
作成者: 野中文雄
ドラフト作成: 2009年5月18日