Python: рисование перпендикулярной линии от точки внутри отдельной линии - PullRequest
1 голос
/ 12 октября 2019

Точка А находится в произвольном месте. Если линия (линия A) проведена из точки A в любое место на другой линии (линия B), как я могу создать функцию, которая создаст новую линию, которая перпендикулярна исходной линии (а также пересекает линию B)? У меня были проблемы с манипулированием конкретными точками между двумя точками (по сути, я не могу найти точное место, где происходит пересечение, и это место является ключевым для моего проекта).

enter image description here

Другие ограничения включают следующее: если линия A пересекается с линией B и создает перпендикулярную линию, она вместо этого создает линию C, которая идет в том же направлении, что и линия A, но назад.

ВАЖНОЕ ПРИМЕЧАНИЕ:Поскольку перпендикулярная новая линия может быть на 90 градусов влево или вправо относительно Линии A, как я могу сделать так, чтобы, если линия с длиной X пересекает другую линию (Линия C) с одной стороны, а не с другой, то генерируется третьялиния будет только сделана в пересекающейся траектории не-Line-C.

Наконец, такого рода функции должны быть рекурсивными. У кого-нибудь есть идеи, которые могли бы помочь мне в правильном направлении?

Кстати, я использую Python и пытаюсь найти решение, которое использует matplotlib (в дополнение к этому можно использовать и другие пакеты).

Огромная благодарность за помощь и поддержку в этомканал! Если мне было бы полезно сделать несколько демонстрационных рисунков, пожалуйста, дайте мне знать!

1 Ответ

0 голосов
/ 14 октября 2019

Представляет начальный луч в параметрической форме

R = A + t * dir

Где A - начальная точка, t - параметр (здесь значение> = 0), а dir - вектор направления единицы (его компонентыкосинус и синус угла направления)

Представьте также полигон или полилинию в параметрической форме

Side[i] = P[i] + u * (P[i-1] - P[i])

где P[i] - i-я вершина, u значение лежит в диапазоне 0..1

Теперь найдите пересечение луча с какой-либо стороной, используя любой метод (например, посмотрите на ответ Гарретта Риса здесь ). Пересечение лежит сбоку, если параметр u находится в диапазоне 0..1.

Когда точка пересечения I найдена, измените направление луча:

(dir'.x, dir'y) = (-dir.y, dir.x) 

Это соответствует повороту вектора на Pi / 2 в направлении против часовой стрелки. Если вам нужно другое направление, поменяйте знаки. Возможно, вы хотите изменить направление, чтобы сделать новый вектор «внутренним» - в этом случае проверьте наличие знака скалярного произведения старого dir и вектора бокового направления.

Теперь новое уравнение луча

R' = I + t * dir'

и продолжить с другой стороны.

...