Найти расстояние между 2 точками самым быстрым способом - PullRequest
3 голосов
/ 22 сентября 2011

Этот код вычисляет расстояние между двумя точками, используя формулу расстояния, Math.sqrt ((x1 - x2) ^ 2 + (y1 - y2) ^ 2) . Моя первая точка имеет координацию mmx и mmy, а вторая - координацию ox и oy. Мой вопрос прост, есть ли способ FASTER для расчета этого?

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 ]

4 голосов
/ 22 сентября 2011

Я думаю, что если вы подключите свою функцию вместо фактического вызова функции, это будет самый быстрый из возможных способов.

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 ПУТЬ более читабельно, но это несколькораз медленнее.Если вам нужна скорость, вы хотите напрямую указать свою математику.

2 голосов
/ 22 сентября 2011

Использование Point.distance

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

Это будет выполнено в собственном коде, который обычно быстрее интерпретируемого кода.

Если вы находитесь в 3Dпробел, используйте Vector3D.distance

Если вы выполняете обнаружение столкновений, сравнение длин векторов (2D или 3D) довольно распространено и может быть ресурсоемкимиз-за использования функции sqrt.Если вместо этого сравнить lengthSquared , он будет гораздо более производительным.

1 голос
/ 22 сентября 2011

Вызов статической функции немного дороже.Вы можете сохранить эти накладные расходы, выполнив следующее:

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