2010年6月1日火曜日

[AS3.0]2点間の距離の計算比較

先日Point.distance()で2点間の距離を計算できることを初めて知りました。
今まで2点間の距離は、三平方の定理を使って計算していたので、Pointを使えば楽に求められると思ったのですが、どちらの計算方法が早いのか疑問に思ったので比べてみた。
package {
 import flash.display.Sprite;
 import flash.geom.Point;
 import flash.utils.getTimer;
 
 public class distance extends Sprite {
  public function distance() {
   // 点1
   var x1:Number = 100;
   var y1:Number = 0;
   // 点2
   var x2:Number = 391;
   var y2:Number = 36.8;
   
   var distance:Number;
   
   var start:Number;
   var end:Number;
   var t:Number;
   
   var i:uint;
   
   start = getTimer();
   for(i = 0; i < 1000000; i++)
    distance = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
   end = getTimer();
   t = end - start;
   trace("Math1: " + t);
   trace(distance);
   
   start = getTimer();
   for(i = 0; i < 1000000; i++)
    distance = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
   end = getTimer();
   t = end - start;
   trace("Math2: " + t);
   trace(distance);
   
   start = getTimer();
   var dx:Number = x2 - x1;
   var dy:Number = y2 - y1;
   for(i = 0; i < 1000000; i++)
    distance = Math.sqrt(dx * dx + dy * dy);
   end = getTimer();
   t = end - start;
   trace("Math2.5: " + t);
   trace(distance);
   
   start = getTimer();
   var pt1:Point = new Point(x1, y1);
   var pt2:Point = new Point(x2, y2);
   for(i = 0; i < 1000000; i++)
    distance = Point.distance(pt1, pt2);
   end = getTimer();
   t = end - start;
   trace("Point: " + t);
   trace(distance);
  }
 }
}
差が出やすいように100万回計算させてみた。 上のプログラムを実行した結果は、
Math1: 401
293.3176435197856
Math2: 205
293.3176435197856
Math2.5: 197
293.3176435197856
Point: 1214
293.3176435197856
計算結果は当然ながら全部一致。 計算時間は、Pointが目に見えて遅い。 あと二乗ぐらいなら、Math.pow()を使わない方が早い。 ちなみに、Math.sqrt()を使わないで自分で実装したらどうなのかと思って、ニュートン法を使って実行してみたのですが、圧倒的に遅かったです。Math.sqrt()すげー。

というわけで2点間の距離は、今後も三平方の定理を使って求めていきたいと思います。

0 件のコメント:

コメントを投稿