Найдите вектор, касательный к окружности

Мне нужно переместить точку по векторам фиксированной нормы вокруг центрального круга. Итак, чтобы сделать это, мне нужно вычислить вектор касательной окружности, чтобы применить его к моей точке.

Вот описательный график: введите здесь описание изображения

Итак, я знаю координаты p1, радиус и центр окружности, а также векторную норму d. Мне нужно найти p2 (= найти ориентацию вектора v).

Я нанес на график некоторые идеи, которые у меня возникли, чтобы найти его: p1' - это p1, спроецированный на окружность. И t является касательным вектором к C в p1'.

Это должно быть легко, но я слишком слаб в математике, чтобы понять, как это реализовать. Поэтому я хотел бы получить представление о реализации этого (независимо от языка все в порядке, javascript - это круто).

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

Изменить: получил это

let vx = cx - p1x,
    vy = cy - p1y,
    norm = Math.sqrt((vx * vx) + (vy * vy)),
    p2x = p1x - (vy * d / norm),
    p2y = p1y + (vx * d / norm);

Но есть еще причуда: используя это вовремя, точка медленно удаляется от центра круга, совершая спираль.


person FitzFish    schedule 20.11.2016    source источник


Ответы (1)


  1. Получите вектор Центр окружности - точка P1. Назовем этот вектор v1.

  2. Касательный вектор 't' перпендикулярен v1. Если v1=(vx, vy), то t=(-vy,vx) . Просто поменяйте местами значения и знак (я написал -vy, может быть и -vx, но не оба -vy, -vx).

  3. Установка одного направления или порядка просто с помощью t2= -t1= (vy, -vx) или (-vy, vx)

Для движений вы должны использовать нормализованные (||v|| = 1) векторы.

person Ripi2    schedule 20.11.2016
comment
Спасибо за ваш ответ. Следуя вашим указаниям, я получил это: let vx = cx - p1x, vy = cy - p1y, norm = Math.sqrt((vx * vx) + (vy * vy)), p2x = p1x + (vy * d / norm), p2y = p1y + (vx * d / norm); Но это все еще не работает. Значение p2 не соответствует ожидаемому. Что-то не так с моим кодом? - person FitzFish; 21.11.2016
comment
Хорошо, я понял, что перпендикулярный вектор получается не только путем замены значений, как вы сказали, но и путем изменения одного из знаков. Я был бы рад принять ваш ответ, если вы его отредактируете. - person FitzFish; 21.11.2016
comment
Кстати, это нормально, что с алгоритмом, который я добавил к своему вопросу, точка медленно уходит от центра, совершая спираль? - person FitzFish; 21.11.2016
comment
Да, спираль, потому что P1 был ближе к центру круга, чем новый P2. Чем короче модуль P1P2, тем медленнее раскручивается спираль. Если вам нужен круг вместо спирали, то касательная не может быть использована. - person Ripi2; 21.11.2016