以最快的方式找出2点之间的距离

时间:2011-09-22 00:28:08

标签: performance flash actionscript-3 math distance

此代码使用距离公式 Math.sqrt((x1 - x2)^ 2 +(y1 - y2)^ 2)计算2点之间的距离。我的第一点有mmxmmy协调,第二点有oxoy协调。我的问题很简单,有没有更快的方法来计算这个?

private function dist(mmx:int, mmy:int, ox:int, oy:int):Number{
  return Math.sqrt((mmx-ox)*(mmx-ox)+(mmy-oy)*(mmy-oy));
}

这是我的代码,感谢您的帮助。

public function moveIT(Xmouse, Ymouse):void{
            f = Point.distance( new Point( Xmouse, Ymouse ), new Point( mainSP.x, mainSP.y ) );// distance between mouse and instance 
            distancePro = Point.distance( pointO, new Point( mainSP.x, mainSP.y ) );// distance from start point 
            if (  f < strtSen ){ // move forward
                tt.stop(); tt.reset(); // delay timer on destination    
                mF = true;  mB = false;
                ag = Math.atan2((Ymouse - mainSP.y),(Xmouse - mainSP.x)); // move-forward angle, between mouse and instance
            }
            if (mF){ /// shoot loop
                if (f > 5){// 5 pixel
                    mainSP.x -= Math.round( (400 /f) + .5 ) * Math.cos(ag);
                    mainSP.y -= Math.round( (400 /f) + .5 ) * Math.sin(ag);
                }
                if (  distancePro > backSen ){// (backSen = max distance)
                    mF = false;         
                    tt.start();// delay timer on destination
                }
            }
            if (mB){ /// return loop
                if ( distancePro < 24 ){//  back angle re-calculation
                    agBACK = Math.atan2((y1 - mainSP.y),(x1 - mainSP.x));                   
                }
                mainSP.x += (Math.cos(agBACK) * rturnSpeed);
                mainSP.y += (Math.sin(agBACK) * rturnSpeed);
                if ( distancePro < 4 ){ // fix position to start point (x1,y1)
                    mB = false;
                    mainSP.x = x1; mainSP.y = y1;
                }
            }
        }
private function scTimer(evt:TimerEvent):void {// timer
            tt.stop();
            agBACK = Math.atan2((y1 - mainSP.y),(x1 - mainSP.x));// move-back angle between start point and instance
            mB = true;
        }

另外:pointO = new Point(x1,y1);设置起点。由于父类调用应用程序的方式,我不能使用mouseX和mouseY,因此我可以将x和y传递给我的循环。

3 个答案:

答案 0 :(得分:4)

我认为,如果你内联你的函数而不是进行实际的函数调用,那么这是最快的方法。

f = Math.sqrt((Xmouse-mainSP.x)*(Xmouse-mainSP.x)+(Ymouse-mainSP.y)*(Ymouse-mainSP.y)); 
distancePro = Math.sqrt((x1-mainSP.x)*(x1-mainSP.x)+(y1-mainSP.y)*(y1-mainSP.y));

使用Point.distance更具可读性,但速度要快几倍。如果你想要速度,你想直接内联你的数学。

答案 1 :(得分:2)

使用Point.distance

d = Point.distance( new Point( x1, y1 ), new Point( x2, y2 ) );

它将以本机代码执行,通常比解释代码更快。

如果您在3D空间中,请使用Vector3D.distance

如果您正在进行碰撞检测,则比较lengths向量(2D或3D)非常常见,并且由于使用了sqrt函数,因此可能会占用大量资源。如果你比较lengthSquared,它会更高效。

答案 2 :(得分:1)

调用静态函数有点贵。您可以通过执行以下操作来节省开销:

private var sqrtFunc = Math.sqrt;

private function dist(mmx:int, mmy:int, ox:int, oy:int):Number{
    return sqrtFunc((mmx-ox)*(mmx-ox)+(mmy-oy)*(mmy-oy));
}