Учитывая 2 точки, как я могу нарисовать линию под прямым углом к ​​линии, образованной двумя точками? - PullRequest
13 голосов
/ 19 сентября 2011

В идеале я хочу указать последовательность точек и провести линию под прямым углом в каждой точке (начиная со второй точки).

Направление каждой линии будет чередоваться, поэтому, если мне случится нарисовать кривую, состоящую из 6 точек, линия каждой длины будет нарисована для каждой точки, начиная со второй точки, то есть 5 дополнительных линий на чередующихся сторонах кривая, немного похожая на гусеницу с чередующимися ногами.

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

1 Ответ

33 голосов
/ 19 сентября 2011

Это вопрос векторной математики .Вы можете рассчитать направляющий вектор между двумя точками A и B, вычтя B из A. В 2D и только в 2D вектор, направленный под прямым углом к ​​этому вектору, можно получить, поменяв местами компоненты x и y и взяв один компонент отрицательным.Если вы отрицаете новый компонент x, вы сделаете левый поворот, отрицая y, вы сделаете правый поворот.Затем можно уменьшить вектор направления до размера единицы (= длины 1), разделив каждый компонент на длину вектора (sqrt (x x + y y)).Наконец, вы можете снова растянуть единичный вектор на желаемую длину и выбрать нужный вам размер.Если вы добавите этот вектор к A или B, вы получите точку, к которой вы хотите нарисовать линию.

Вот небольшая математическая справка:

Это точки A и B, выраженные в виде вектора.

Вектор направления вычисляется простым вычитанием.

Нормальный вектор задается путем переворота направляющего вектора, то есть инвертирования компонентов и превращения одного компонента в отрицательный.nl = нормальный, перевернутый влево, nr = нормальный, перевернутый вправо

Единичный вектор нормального вектора задается делением каждого компонента на длинуvector.

Вычисляет длину вектора

Если вы хотите нарисовать линию от B слева (при выходе из A), вы рассчитываететочка P, чтобы нарисовать линию как

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

Если у вас есть точки, лежащие за пределами холста, значит, ваша длина, вероятно, слишком велика.Конечно, вы можете рассчитать точку, в которой вектор P пересечет границу, вычислив точку пересечения вектора BP и границы.

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