今まで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 件のコメント:
コメントを投稿