サイトトップ

Director Flash 書籍 業務内容 プロフィール

Flash ActionScript 3.0 Reference

◎01 Mathクラス

☆05 ★座標を距離と角度で扱いたい

解説
ふたつの座標間の距離を計算したいことがあります。たとえば、当たり判定や距離をパラメータとして使いたい場合です。また、平面上の位置を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日


Copyright © 2001-2009 Fumio Nonaka.  All rights reserved.