PointやVector3Dクラスには、座標と座標の間の距離を求める同じ名前の静的メソッドdistance()があります。しかし、速さを稼ぐにはこれらのメソッドでなく、Math.sqrt()メソッドを用いて三平方の定理で導く方がお得です。
Point.distance()とVector3D.distance()は、ともに座標と座標の間の距離を求める静的メソッドです。引数には座標が納められたPointまたはVector3Dインスタンスをふたつ渡し、Number型の距離が返されます。
Point.distance(Pointインスタンス0, Pointインスタンス1)
Vector3D.distance(Vector3Dインスタンス0, Vector3Dインスタンス1)
決して、これらのメソッドを使っていけないという訳ではありません。ただ、座標は大量に扱うことがめずらしくなく、計算の速さを求めざるを得ない場合があります。そのようなとき、2点間の距離を求めるのに、Math.sqrt()メソッドで三平方の定理により導くのが有効だということです。
ふたつの座標の間の距離を、Math.sqrt()メソッドと三平方の定理で求めてみましょう。クラスの静的メソッドと同じ仕様で関数を定めます。以下のスクリプト001はPoint.distance()メソッドと同じく引数にふたつのPointインスタンスを、スクリプト002はVector3D.distance()と同じふたつのVector3Dインスタンスを受取って、ふたつの間の距離をNumber型の数値で返します。なお、座標値の2乗はMath.pow()メソッドでなく、速さを稼ぐため変数に入れた数値を単純に2回掛合わせています。
スクリプト001■ふたつのPointオブジェクトの間の距離をMath.sqrt()メソッドで求めるfunction distance2D(beginPoint:Point, endPoint:Point):Number { var nX:Number = endPoint.x - beginPoint.x; var nY:Number = endPoint.y - beginPoint.y; var distance:Number = Math.sqrt(nX * nX + nY * nY); return distance; }
function distance3D(beginVector3D:Vector3D, endVector3D:Vector3D):Number { var nX:Number = endVector3D.x - beginVector3D.x; var nY:Number = endVector3D.y - beginVector3D.y; var nZ:Number = endVector3D.z - beginVector3D.z; var distance:Number = Math.sqrt(nX * nX + nY * nY + nZ * nZ); return distance; }
ご参考のために、PointやVector3Dクラスの静的メソッドとMath.sqrt()で三平方の定理により求める距離計算の速さを比べてみました。テスト001はPoint.distance()とMath.sqrt()(三平方の定理)、テスト002がVector3D.distance()とMath.sqrt()(三平方の定理)の比較です。
テスト001■Point.distance()とMath.sqrt()(三平方の定理)で2点間の距離を求める比較Getting distance with Point.distance() and Math.sqrt() methods - wonderfl build flash online
Getting distance with Vector3D.distance() and Math.sqrt() methods - wonderfl build flash online