Создание системы навигации (ArcTan2) - PullRequest
0 голосов
/ 20 января 2020

В настоящее время я работаю над навигационной системой с использованием маршрутных точек. Мы можем определить следующие периметры, предположим, что точка B - это то место, где мы хотим go, а точка A - ваше текущее местоположение:

  • Мы знаем, что местоположения (X, Y) обеих точек A и B.
  • Точка A (вы) и точка B (наш пункт назначения) положительны в соответствующих значениях X и Y.
  • Мы знаем угол, на который направлена ​​точка А (вы). (360 - 0 градусов)

Мой вопрос заключается в том, как бы получить наименьший угол поворота, чтобы повернуть к точке B (пункт назначения)?

Мой текущий метод использует ArcTan2 (X, Y)

B: = ArcTan2 (Y1 - Y2, X1 - X2)

B: = B * 180 / pi ---- Для преобразования радианы в градусы.

Это возвращает подходящий угол, но только иногда ... В других случаях он возвращает угол, который заставит меня повернуться лицом к противоположному направлению точки B (наш пункт назначения).

Другая проблема I Я выясняю, должен ли я повернуть налево или направо - Предположим, у нас есть угол возврата 80 градусов. Значит ли это, что я поворачиваю влево или вправо?

Надеюсь, мое объяснение несколько ясное Тригонометрия никогда не была моей сильной стороной.

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

Спасибо, MrClear

Ответы [ 2 ]

5 голосов
/ 20 января 2020

Вы используете неправильный порядок аргументов X / Y

B := ArcTan2(Y2 - Y1, X2 - X1)

- правильная формула для получения направления от 1-й точки до 2-й.

Если вам действительно нужно угол поворота, вы также должны указать текущее направление (или предыдущую точку)

Пусть вы двигаетесь из точки A в точку B, а после B вам нужно повернуть в точку C. В этом случае вам нужно вычислить относительный угол, чтобы изменить направление (этот подход использует перекрестное произведение векторов):

 CBX := C.X - B.X; 
 CBY := C.Y - B.Y; 
 BAX := B.X - A.X; 
 BAY := B.Y - A.Y;

RotationAngle := 
  RadToDeg(ArcTan2(CBX * BAY - CBY * BAX, CBX * BAX + CBY * BAY));

Обратите внимание, что функция возвращает угол со знаком, и вы можете легко проверить, нужно ли вам поворачивать влево или вправо. Также функция RadToDeg помогает получить градусы.

0 голосов
/ 20 января 2020

Если у вас есть две точки (xA, yA) и (xB, yB), с точкой A в качестве начала и точкой B в качестве пункта назначения, у вас есть вектор от начала до пункта назначения:

v = (xB-xA)i + (yB-yA)j

In 2D-система координат, с осью X вправо и осью Y вверх, этот вектор образует угол с горизонтальной осью, который легко вычислить:

angle = atan2((yB-yA), (xB-xA))

, где

i = unit vector in x-direction

j = unit vector in y-direction

Этот угол выражен в радианах. Он вращается от горизонтальной оси против часовой стрелки вокруг точки A.

Следите за векторами нулевой длины.

...