Эффективный алгоритм перемещения страусов по линии с постоянной скоростью - PullRequest
3 голосов
/ 09 июня 2011

Проблема: перемещать объект по прямой линии с постоянной скоростью в декартовой системе координат (только x, y).Скорость обновления нестабильна.Скорость движения должна быть близкой к точной, а объект должен приближаться к месту назначения.Источник и пункт назначения могут быть где угодно.

Дано: адреса источника и назначения (x0, x1, y0, y1) и скорость произвольного значения.

Помощь: Естьответ на SO относительно этого, и это хорошо, однако это предполагает, что дано общее время, потраченное на поездки.

Вот что у меня есть: <pre> x0 = 127; y0 = 127; x1 = 257; y1 = 188; speed = 127; ostrich.x=x0 //plus some distance along the line; ostrich.y=y0 // plus some distance along the line; //An arbitrarily large value so that each iteration increments the distance a minute amount SPEED_VAR = 1000; xDistPerIteration = (x1 - x0) / SPEED_VAR; yDistPerIteration = (y1 - y0) / SPEED_VAR; distanceToTravel = ;//Pythagorean theorum limitX = limit1 = 0; //determines when to stop the while loop <br>//get called 40-60 times per second void update(){ //Keep incrementing the ostrich' location while (limitX < speed && limitY < speed) { limitX += Math.abs(xDistPerIteration); limitY += Math.abs(yDistPerIteration); ostrich.x += xDistPerIteration; ostrich.y += yDistPerIteration; } distanceTraveled -= Math.sqrt(Math.pow(limitX, 2) + Math.pow(limitY, 2)); if (distanceTraveled <=0) //ostrich arrived safely at the factory }

Этот код выполняет свою работу, однако он занимает исключительно 18% программного времени в программе, интенсивно использующей процессор.Это фигня, программно и с точки зрения производительности.Любые идеи о том, что здесь делать?

Ответы [ 3 ]

2 голосов
/ 09 июня 2011

Помощник: на SO есть ответ по этому поводу, и это хорошо, однако он предполагает, что дано общее время, потраченное на путешествия.

базовая физика для спасения

общее время, потраченное на путешествие = расстояние / скорость

btw Math.hypot(limitX,limitY) быстрее, чем Math.sqrt(Math.pow(limitX, 2) + Math.pow(limitY, 2))

, хотя на самом деле, в то время как в цикле вы должны рефакторировать

1 голос
/ 09 июня 2011

Update вызывается 40-60 раз в секунду, верно?Другими словами, один раз за кадр.Так почему же внутри него есть петля while?

Кроме того, делать sqrt один раз и pow дважды для каждого кадра не нужно.Просто позвольте d2 быть квадратом расстояния и остановитесь, когда limitX*limitX+limitY*limitY превысит его.

1 голос
/ 09 июня 2011

Одна вещь, которую нужно улучшить:

Нет необходимости вычислять квадратный корень при каждом вызове функции обновления. Вместо этого вы можете использовать квадрат distanceTraveled.

Аналогично, Math.abs(xDistPerIteration) и Math.abs(yDistPerIteration) не меняются при каждом вызове для обновления, вы можете сохранить эти значения и избавиться от вызовов функции абсолютного значения, чтобы сэкономить немного больше вычислительного времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...