У меня есть две линии, обозначенные двумя точками с координатами x и y каждая. Первая точка (где начинаются линии) равно, что означает, что у меня есть 3 точки A, B и C, где одна линия проходит от A до B, а другая - от A до C. для вычисления угла между двумя линиями, начиная с правой стороны первой линии. Результат не обязательно должен быть точным, мне нужно только знать, больше или меньше чем 180 ° (π рад). Спасибо за любую помощь - вам не нужно писать код, псевдокод и / или объяснение было бы замечательно.
Угол между двумя линиями, начинающимися с одной стороны линии
Ответы (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
будут иметь знак.
Взгляните на векторный продукт. Если вы вычислите трехмерные векторы для отрезков AB и AC, они оба будут иметь нулевые компоненты z.
Поскольку векторы AB и AC лежат в плоскости xy, единственным возможным ненулевым компонентом их векторного произведения является компонент z, поэтому это единственный компонент, который вам нужно вычислить.
Знак этого компонента z сообщит вам, больше или меньше угол 180 градусов в зависимости от вашей ориентации.