Вычислить новый 2D вектор, перпендикулярно переведенный из исходного - PullRequest
0 голосов
/ 09 мая 2018

У меня есть вектор в 2D, который определяется двумя наборами точек (x1, y1) и (x2, y2). Мне нужно вычислить новый вектор, который перпендикулярно переводится на расстояние H.

Например, если мои точки (0, 0) и (0, 10), перпендикулярный перевод H = 5 приведет к новому вектору (5, 0) и (5, 10).

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

В идеале я хотел бы, чтобы H> 0 был правильным переводом, а H <0 - левым переводом (при условии, что он стоит на x1 / y1 и смотрит на x2 / y2). </p>

1 Ответ

0 голосов
/ 09 мая 2018

Начните с двух конечных точек вашего отрезка, A = (x 1 , y 1 ) и B = (x 2 , y 2 ). (Обратите внимание, что векторы и отрезки - это не одно и то же.)

Рассчитать вектор: v = BA = (x 2 -x 1 , y 2 -y 1 )

Рассчитайте его величину: | v | = sqrt (v 1 2 + v 2 2 )

Нормализуйте его (то есть измените его величину на единицу, оставив направление неизменным): v '= v / | v | = (v 1 / | v |, v 2 / | v |)

Поверните его на 90 градусов по часовой стрелке: v '' = (v ' 2 , -v' 1 )

Умножьте это на H: z = Hv '' = (Hv '' 1 , Hv '' 2 )

Добавьте это к своим двум конечным точкам: A '= A + z = (x 1 + z 1 , y 1 + z 2 ) B '= B + z = (x 2 + z 1 , y 2 + z 2 )

Подписчики могут выглядеть немного запутанно. Это потому, что мы с вами используем разные соглашения: вы используете буквы для измерений и подписки для точек; Я делаю это наоборот. Обычно я пытаюсь использовать язык человека, на вопрос которого я пытаюсь ответить, но в этом случае ваше соглашение становится запутанным, когда в этом есть несколько моментов. Если это действительно неясно, я могу попробовать переписать это.

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