Как можно построить в subj касательную к окружности из точки? Нашёл примеры для кривой, но там изначально указана точка касания, с окружностью - сложнее.
Можно, разумеется. Только координаты точки, я так понимаю, будут иррациональными, значит все достоинства аналитического описания рисунка сходят на нет (например, при сильном увеличении будет видно, что точки не совпадают).
Не очень понял задачу. Касательную можно в миллионе мест и под миллионом углов. Что именно надо-то? Рандомно точку на окружности и касательную к рандомной точке вне окружности? Ну это формула линии из школьного учебника геометрии.
Нужно построить касательную к заданной окружности из заданной точки
(лежащей вне окружности). Таких касательных может быть только две.
Задача сделать это в metapost.
P.S. Если так понятнее, то, например, задан такой код:
beginfig(2);
u=1cm;
%Окружность, её ценр в точке z1
path e;
z1=(1u,1u);
e=fullcircle scaled 2u shifted z1;
draw e;
%точка
z2=(1u,5u);
%а что писать дальше не знаю :)
endfig;
С metapost особо не общался, но вообще идея такая - от точки в центр окружности как бы проводится прямая, потом от неё строится касательная а-ля прямоугольный треугольник... Щас жутко хочу спать и лень сочинять нормальную формулу, но в самом тупом случае считаем угол этого радиуса, прибавляем 90 градусов и дальше x=x0+r*cos+r*sin; y=y0+r*sin-r*cos, если не ошибаюсь. Увеличиваем в цикле радиус и нарисуется прямая.
Получилось. Значит, как я понял, метапост умеет решать только линейные уравнения, следовательно придётся считать самому, это верно. Но, разумеется, с помощью функций metapost.
Идея в том, чтобы определить функцию arcsind в метапосте (неявно, через встроенную функцию angle). А потом просто посчитать. Код приблизительно такой (прошу прощения, торопился):
% Построение касательной к окружности в metapost
beginfig(1);
vardef arcsind primary x = angle((1+-+x,x)) enddef;
numeric u;
u=1mm;
path p;
p:=fullcircle scaled 2u;
z1=(0,10u);
z2=(1u,0);
z3=z1-z2;
z4=z3 rotated arcsind(u/length(z2-z1));
draw z1--z2;
%касательная к окружности
draw z2--z4+z2;
draw p shifted z1;
endfig;