[AS3] 距離はPointやVector3DクラスのメソッドよりMath.sqrt()と三平方の定理で求める方が速い [Edit]

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;
}

スクリプト002■ふたつのVector3Dオブジェクトの間の距離をMath.sqrt()メソッドで求める
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


テスト002■Vector3D.distance()とMath.sqrt()(三平方の定理)で2点間の距離を求める比較

Getting distance with Vector3D.distance() and Math.sqrt() methods - wonderfl build flash online

コメント

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

その他の記事