Нахождение угла между двумя точками - PullRequest
1 голос
/ 26 февраля 2011

По сути, это всего лишь математический вопрос.

Вот с чем у меня проблемы ... Мне трудно придумать, как сформулировать вопрос, так что терпите меня.По сути, я думаю, что мне нужно использовать некоторые сложные математические для этого, но я не знаю, что мне нужно.

Я буду использовать некоторые иллюстрации, чтобы прояснить это. Предотвращение спама не делаетпозвольте мне публиковать картинки ... Вот простое концептуальное изображение: http://radleygh.com/images/gimp-2_2011-057-00-57-26-40.bmp

Цель: Определить, лежат ли несколько объектов в конусе на плоскости 2D

КонусСвойства: Положение (x, y) Угол (0-359) Распространение (0-359, aka Width) Расстояние (0 ++)

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

Angle_A = Angle + (Spread / 2) Angle_B = Angle - (Spread / 2) Angle_Target = Point_Direction (origin, object_position)

Теперь я подумал сравнить их с положением каждого объекта с помощьюпростое выражение if / then:

If (Angle_A> Angle_Target) && (Angle_B Angle_Target находится между A и B

Это работает ... до Angle_Aили Angle_B пройти порог 0-360.0 * находится между 45 * и 315 * ... но приведенное выше выражение if не сработает.Затем мы можем определить, какое направление проверять, основываясь на размере конуса ...

А что, если эффект конуса больше, чем конус 180 *?

Я не уверен вответ.Я почти уверен, что должен использовать радианы ... Но я не понимаю концепцию радианов.если кто-то может указать мне правильное направление, возможно, покажите мне где-нибудь пример, это было бы замечательно!

В то же время я продолжу свое собственное исследование.

Ответы [ 2 ]

2 голосов
/ 26 февраля 2011

Вы можете рассмотреть простое преобразование, которое устанавливает вашу систему координат так, что Angle_B равен нулю.Другими словами, вместо тестирования

Angle_B < Angle_Target < Angle_A

вы также можете использовать

0 < Angle_Target - Angle_B < Angle_A - Angle_B

Если вы примените модуль 360 ° ко всем терминам, с которыми должна работать логика:

0 < (Angle_Target - Angle_B) % 360 < (Angle_A - Angle_B) % 360
0 голосов
/ 26 февраля 2011

Один радиан - это угол, образованный путем обведения окружности по длине, равной радиусу этого круга.Следовательно, в круге ровно 2 * Пи радиана.

Итак, 2 * Пи радианы = 360 градусов

Чтобы преобразовать градусы в радианы, умножьте на 2 * ПИ, а затем разделите на 360.(Или, конечно, умножьте на PI, разделите на 180).

Однако, если вы работаете в радианах или градусах, это должно быть продиктовано только библиотекой, которую вы используете.Даже тогда вы могли бы написать обертки, которые выполняют вышеприведенные вычисления.

Но к основной части вашего вопроса.Учтите, что:

sin (тета) = грех (360 + тета).

cos (тета) = cos (360 + тета).

и т. Д.

Так что, если вы столкнетесь с вашим конусом, который проходит через 0 градусов, просто добавьте 360 к обоим углам конуса.

Например, если ваш конус переходит от -10 до +20, просто используйте вместо 350 до 380,И, конечно же, когда вы проверяете угол, убедитесь, что вы добавили 360 к нему и протестировали как исходные, так и добавленные углы.

Например, тестирование +5 (которое находится в вашем конусе), вы протестируете 5 (что не получается) потом 365 (что проходит).

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...