Найти в Дзене

Программирование на языке Python. Алгоритмы в геометрии на плоскости. Угол между прямыми и перпендикуляр из точки на прямую

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Алгоритмы определения угла между прямыми и расстояния от точки до прямой на python

С детства любил геометрию. Особенно мне нравилось то, что геометрические законы сводились к алгебраическим формулам и уравнениям. Просто какая-то магия. Да, математика это сверхъестественная наука, Ландау был прав.

Сегодня рассматриваем две задачи, связанные с прямым углом.

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

Напомню, что в общем случае уравнение прямой на плоскости имеет вид.

a*x + b*y = c

Для прямых в геометрии вводится понятие направляющего вектора. Это вектор, который лежит на прямой или на прямой, параллельной данной прямой. Его направление (два варианта) и величина нам безразлична. Если мы знаем направляющие вектора для двух прямых, мы можем вычислить угол между ними, например, через формулы скалярного умножения. Следовательно, мы сможем определить перпендикулярны прямые или нет, ну или просто узнать угол между прямыми.

Замечание
В геометрии углом между прямыми называется наименьший угол, а их всего 4.

Вопрос теперь состоит в том, как мы в программе будем определять направляющие вектора.

Исходя из уравнения прямой запишем для двух точек с координатами (x1, y1) и (x2, y2) и лежащих на прямой

a*x1 + b*y1 = c
a*x2 + b*y2 = c

Вычтем одно равенство из другого, получим

a*(x1-x2) + b*(y1-y2) = 0

Отсюда видно, что в качестве координат направляющего вектора можно взять например координаты

(-b, a)

Пусть имеем два направляющих вектора для двух прямых

v1 = (-b1, a1)
v2 = (-b2, a2)

Тогда cos(α) угла между ними будет (см. статью)

cos(α) = (b1*b2+a1*a2)/(sqrt(b1*b1+a1*a1)*sqrt(b2*b2+a2*a2))

Ну а по косинусу можно определить и угол. В частности для перпендикулярности нужно, чтобы косинус был равен 0, т.е. в сущности достаточно проверить числитель выражения на ноль: (b1*b2+a1*a2).

Ниже в программе (рисунок 1) задаются две прямые (координатами двух точек) и выводится сообщение: Прямой угол, Параллельны и Произвольный угол. Угол, кстати, можно и определить, так как в программе вычисляется cos(). При этом программа считает параллельными и совпадающие прямые.

Рисунок 1. Программа проверки перпендикулярности двух прямых на плоскости. Текст программы см. ниже по ссылке
Рисунок 1. Программа проверки перпендикулярности двух прямых на плоскости. Текст программы см. ниже по ссылке
primer373.py

Например на входе

0 0 1 1
0 0.5 0.5 0

Результат

Прямой угол

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

Здесь можно пойти по следующем пути. Рассмотрим рисунок 3. Из точки A проведён перпендикуляр на прямую. Нужно найти длину этого перпендикуляра. Сделаем следующее. Возьмём на прямой произвольную точку C. Проведём прямую через точки A и C. Найдём угол между ними (α). Тогда длина перпендикуляра будет равна длине AC, умноженной на sin(α).

Ниже (рисунок 2) представлена программа, которая определяет длину перпендикуляра из точки на прямую (расстояние от точки до прямой) указанным выше способом. Вводятся в начале две точки (четыре координаты), определяющие прямую и точка (две координаты). Выводится расстояние от точки до прямой.

Рисунок 2. Программа, определяющая расстояние от точки до прямой. Текст программы см. ниже по ссылке
Рисунок 2. Программа, определяющая расстояние от точки до прямой. Текст программы см. ниже по ссылке
primer374.py

Пояснения к программе

  • Функция alpha() возвращает угол между двумя векторами.
  • При определении параметров уравнения прямой (a1, b1, c1) мы сразу определяем и координаты точки C (см. Рисунок 3): xx2, yy2. При этом координаты точки A: xx1, yy1.
  • Далее определяются коэффициенты уравнения прямой AC (a2, b2, c2) опять же по двум точкам.
  • Далее определятся угол между прямыми AC и прямой CB и вычисляется расстояние AB: |AC|*sin(α).

На входе

-1 -2 2 2
0 10

Результат

6.3999999999999995

Рисунок 3. Точка, прямая и перпендикуляр из точки на прямую. Точка C вспомогательная, для определения длины перпендикуляра
Рисунок 3. Точка, прямая и перпендикуляр из точки на прямую. Точка C вспомогательная, для определения длины перпендикуляра

Пока всё!

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

Назовите виды перпендикуляров
Назовите виды перпендикуляров