Расчет угла направления по скорости x и y - PullRequest
3 голосов
/ 06 февраля 2012

Я разрабатываю игру в программе типа Game Maker (хотя не в Game Maker), потому что я много раз терпел неудачу в кодировании игр на реальных языках (могу кодировать обычные приложения, но не игры). *

В любом случае, в программе, в которой я использую функцию направления, время от времени оказывались ошибки. Однако x и y скорость объекта всегда правильны, поэтому я бы хотел рассчитать угол направления (в градусах) из них. К сожалению, я не гений математики, и я всегда терплю неудачу в тригонометрии; (. Вы можете мне помочь?

Моя система создания угловых координат в IDE выглядит следующим образом:

         270 deg.
  180 deg.      0 deg.
         90 deg.

Система позиционирования похожа на большинство сред (0,0 слева вверху)

Ответы [ 3 ]

12 голосов
/ 06 февраля 2012

Математические библиотеки обычно поставляются с функцией atan2 как раз для этой цели:

double angle = atan2(y, x);

Угол измеряется в радианах;умножьте на 180 / PI, чтобы преобразовать в градусы.Диапазон угла от -pi до pi.Угол 0 является положительной осью X, и угол увеличивается по часовой стрелке.Незначительные изменения необходимы, если вы хотите какую-то другую конфигурацию, например, угол 0 является отрицательной осью Y, а диапазон изменяется от 0 до 359,99 градусов.

Основная причина использования atan2 вместо atan или любая другая обратная функция триггера заключается в том, что она вычисляет для вас правильный квадрат угла, и вам не нужна серия операторов if.

2 голосов
/ 06 февраля 2012

Используйте функцию арктангенса.Это должно быть примерно так:

double direction(double x, double y) {
    if (x > 0)
        return atan(y/x);
    if (x < 0)
        return atan(y/x)+M_PI;
    if (y > 0)
        return M_PI/2;
    if (y < 0)
        return -M_PI/2;
    return 0; // no direction
}

(где x и y - горизонтальная и вертикальная скорость, M_PI - это пи, а atan - функция арктангенса.)

0 голосов
/ 25 января 2017

В частности, в Game Maker вы можете использовать следующее:

direction = point_direction(x, y, x+x_speed, y+y_speed)
speed = point_distance(x, y, x+x_speed, y+y_speed)

(сравнить текущие и будущие координаты x / y и возвращаемые значения)

В обратном порядке получить x / y_speed:

x_speed = lengthdir_x(speed, direction)
y_speed = lengthdir_y(speed, direction)

Note: Added this post because its still viewed in relation to Game Maker:
Studio and its specific functions. Maybe it has no value for the person who
asked originally but i hope it will help some Game Maker users who wander here.
...