Подход к 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