Как найти угол наклона стрелы в полете - PullRequest
0 голосов
/ 12 октября 2011

Я хочу, чтобы стрелка стреляла из исходного положения (60, 60) с разными скоростями x и y, а угол, из которого стреляет лук, будет меняться в зависимости от того, где пользователь касается экрана.

Стрелка отлично движется, учитывая скорости и силу тяжести, но как бы я получил угол стрелки, скажем, если она началась под углом 45 градусов, чтобы стрелка была 180 градусов, когда y = 0? и когда гравитация включается, заставляют наконечник стрелы медленно указывать вниз? Также спрайт перемещает изображение стрелки из центра.

Ответы [ 3 ]

2 голосов
/ 12 октября 2011

Ответ Тима правильно определяет правильные геометрические отношения между компонентами вектора скорости и его ориентацией, а именно функцию арктангенса. Тим предлагает вычислить arctangeant, используя arctan(y/x). (На самом деле я думаю, что это называется atan() не arctan()?).

Тем не менее, существует некоторая неопределенность в вычислении арктангенса с использованием atan():

  • Результат atan(y/x) ограничен интервалом] -90 °, 90 ° [.
  • Это даст тот же результат, если x и y оба отрицательны, как если бы x и y оба были положительны. Таким образом, ваша стрелка всегда будет указывать вверх и влево, никогда не опускаться, никогда не направо - если только вы не проверите знак x и y и не примените соответствующее исправление.
  • Деление на ноль при x = 0.

Я не знаю цель C, но большинство языков имеют функцию atan2(x,y), которая:

  • возвращает то же, что и atan(y/x), когда x и y оба положительные,
  • не ограничен: -90 °, 90 ° [но может проходить полный круг] -180 °, 180 °], поэтому возвращает правильный результат, если x и / или y отрицательны,
  • не дает «деление на ноль», когда x = 0, а скорее правильно возвращает 0 ° или 180 °.

На самом деле Objective C имеет функцию atan2(). На вашем месте я бы посмотрел документацию для него.

1 голос
/ 12 октября 2011

Ключевым моментом является то, что стрелка должна указывать так, чтобы она касалась кривой, по которой она движется. Таким образом, если путь стрелки (x (t), y (t)), то стрелка должна указывать в том же направлении, что и вектор (x '(t), y' (t)), где x '(t) - это производная от х (т). Если у вас есть x (t) и y (t), это, вероятно, проще всего.

Другой способ взглянуть на это состоит в том, что x '(t) - это просто x-компонент скорости. Так что если у вас есть компоненты скорости vx (t) и vy (t), то стрелка должна указывать в том же направлении, что и вектор (vx (t), vy (t))

1 голос
/ 12 октября 2011

Угол будет arctan(y/x), начиная с 0 для горизонтального наведения вправо, до 90 ° для наведения в вертикальном направлении.Обратите внимание, что это с системой координат, имеющей дом 0 ° = прямо на восток;убедитесь, что вы добавили или вычли угол для того, как указана ваша стрелка.

...