此代码使用距离公式 Math.sqrt((x1 - x2)^ 2 +(y1 - y2)^ 2)计算2点之间的距离。我的第一点有mmx
和mmy
协调,第二点有ox
和oy
协调。我的问题很简单,有没有更快的方法来计算这个?
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传递给我的循环。
答案 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)
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));
}