Угол между двумя линиями, начинающимися с одной стороны линии

У меня есть две линии, обозначенные двумя точками с координатами x и y каждая. Первая точка (где начинаются линии) равно, что означает, что у меня есть 3 точки A, B и C, где одна линия проходит от A до B, а другая - от A до C. для вычисления угла между двумя линиями, начиная с правой стороны первой линии. Результат не обязательно должен быть точным, мне нужно только знать, больше или меньше чем 180 ° (π рад). Спасибо за любую помощь - вам не нужно писать код, псевдокод и / или объяснение было бы замечательно.


person borchero    schedule 23.05.2015    source источник
comment
правило косинуса. a ^ 2 = b ^ 2 + c ^ 2 - 2bc cos (тета). Я уверен, что есть идеи получше.   -  person Isaac    schedule 23.05.2015


Ответы (2)


Определим некоторые обозначения:

A := (a1, a1).
B := (b1, b2).
C := (c1, c2).

Тогда определитель D матрицы

1 a1 a2
1 b1 b2
1 c1 c2

определяет, лежит ли C слева или справа от направленной линии AB [см. Вычислительная геометрия - Берг, ван Кревельд, Овермарс, Шварцкопф - Глава 1, Упражнение 1.4 а)]

Теперь вы можете вычесть строку 1 из строк 2 и 3:

1 a1     a2
0 b1-a1 b2-a2
0 c1-a1 c2-a2

и вычислим D из первого столбца, чтобы получить:

(b1-a1)*(c2-a2) > (c1-a1)*(b2-a2)

как условие, указывающее, находится ли C слева от AC или нет. Конечно, лежание справа (соответственно слева) означает, что угол <180 (соответственно> 180).

Пример

A = (0, 0)
B = (0, 1)
C = (1, 0)

Тогда AB - это вертикальный сегмент (ось y), а C явно находится справа от него. Состояние

(b1-a1)*(c2-a2) > (c1-a1)*(b2-a2)           ineq(1)

становится:

0 > 1

который равен false, что означает, что C не находится слева от AB (как и ожидалось)

Визуализация

Чтобы визуализировать состояние, мы можем переводить три точки A, B и C, пока A не станет (0,0). Это безобидное преобразование, потому что условие в ineq (1) вычитает a1 и a2 из координат B и C. С этим преобразованием ineq (1) становится:

b1*c2 > c1*b2                              ineq(2)

Теперь давайте визуализируем три точки (пока не обращайте внимания на коричневые линии относительно C' = (c'1, c'2)):

введите описание изображения здесь

Продукт b1*c2 - это площадь КРАСНОГО прямоугольника. Продукт c1*b2 - это площадь ЗЕЛЕНОГО прямоугольника. На рисунке показано, что КРАСНЫЙ ‹ЗЕЛЕНЫЙ означает, что C находится справа.

Теперь мысленно переместите C вокруг, скажем, C' и визуализируйте новые КРАСНЫЙ и ЗЕЛЕНЫЙ прямоугольники. Неравенство остается в силе, пока C находится справа.

Еще не убедили? Хорошо, напишите программу, которая динамически воспроизводит это изображение, пока вы меняете положение C и вуаля! (Или изучите еще немного математики и решите упражнение из книги;)

Примечание. Учтите, что у этих прямоугольников есть знак. На картинке у них обоих есть положительная область, однако, как правило, товары b1*c2 и b2*c1 будут иметь знак.

person Leandro Caniglia    schedule 23.05.2015
comment
@OliverBorchert Я добавил картинку, которая поможет вам представить, что происходит. - person Leandro Caniglia; 23.05.2015
comment
отличное объяснение! Большое спасибо за ваши усилия! - person borchero; 23.05.2015

Взгляните на векторный продукт. Если вы вычислите трехмерные векторы для отрезков AB и AC, они оба будут иметь нулевые компоненты z.

Поскольку векторы AB и AC лежат в плоскости xy, единственным возможным ненулевым компонентом их векторного произведения является компонент z, поэтому это единственный компонент, который вам нужно вычислить.

Знак этого компонента z сообщит вам, больше или меньше угол 180 градусов в зависимости от вашей ориентации.

person mathematician1975    schedule 23.05.2015