Подход к 2D положению

Я начал работать над концепцией, которая требует от меня найти способ перемещения прямоугольника к заданной точке с заданной скоростью. Я разрабатываю для Android, так что это относительно критично по скорости (он будет рассчитываться каждый кадр для потенциально сотен объектов).

Решения, которые я мог придумать, следующие:

float diff_x = x2 - x1;
float diff_y = y2 - y1;
float length = sqrt((diff_x * diff_x) + (diff_y * diff_y));
float dir_x = diff_x / len;
float dir_y = diff_y / len;

float move_x = dir_x * MOVE_SPEED;
float move_y = dir_y * MOVE_SPEED;

Как видите, этот путь требует квадратного корня, который, как я знаю, довольно дорог. Я подумал об альтернативе, которая использует тригонометрию, но это также дорого.

float diff_x = x2 - x1;
float diff_y = y2 - y1;
float angle = atan2(diff_y, diff_x);

float move_x = sin(angle) * MOVE_SPEED;
float move_y = cos(angle) * MOVE_SPEED;

Есть ли другие способы? Если нет, то какое из моих решений будет быстрее? Спасибо за любую помощь.

1 ответ

Решение

Очень распространенный трюк, который вы можете использовать, - это поставить все в квадрат / степень двух / ^2

таким образом, вместо использования sqrt вы просто используете

length = (diff_x * diff_x) + (diff_y * diff_y);
diff_x*diff_x/length
Другие вопросы по тегам