Построение касательной
Максимум у нас будет 2 точки, поэтому для удобства хранения мы
запомним эту пару точек в структуре отрезок.
Функция имеет вид TouchPoints(p,c).
Используем объект point,line,circle,segment.
Используем функции turnof(), toline(), tolinel(), CrossLine(), turn().
Листинг Delphi
function TouchPoints(p:point;c:circle):segment;
var
pi,d,s,alpha,betta:double;
np1,nc1,np2,nc2:point;
t:segment;
begin
pi:=3.14159265358979323;
d:=dist(p,c.c);
s:=sqrt(d*d-c.r*c.r);
alpha:=atan(c.r/s);
betta:=pi/2-alpha;
np1:=turnof(p,betta,c.c);
nc1:=turnof(c.c,2*pi-alpha,p);
np2:=turnof(p,2*pi-betta,c.c);
nc2:=turnof(c.c,alpha,p);
t.p1:=CrossLine(toline(c.c,np1),toline(p,nc1));
t.p2:=CrossLine(toline(c.c,np2),toline(p,nc2));
result:=t;
end;
Листинг C++
segment TouchPoints(point p,circle c)
{
double pi=M_PI;
double d=dist(p,c.c);
double s=sqrt(d*d-c.r*c.r);
double alpha=atan(c.r/s);
double betta=pi/2.-alpha;
point np1=turnof(p,betta,c.c);
point nc1=turnof(c.c,2*pi-alpha,p);
point np2=turnof(p,2*pi-betta,c.c);
point nc2=turnof(c.c,alpha,p);
segment t;
t.p1 = CrossLine(toline(c.c,np1),toline(p,nc1));
t.p2 = CrossLine(toline(c.c,np2),toline(p,nc2));
return t;
}
Листинг C#
public static segment TouchPoints(point p,circle c)
{
double pi=Math.PI;
double d=dist(p,c.c);
double s=Math.Sqrt(d*d-c.r*c.r);
double alpha=atan(c.r/s);
double betta=pi/2.-alpha;
point np1=turnof(p,betta,c.c);
point nc1=turnof(c.c,2*pi-alpha,p);
point np2=turnof(p,2*pi-betta,c.c);
point nc2=turnof(c.c,alpha,p);
segment t=new segment();
t.p1 = CrossLine(toline(c.c,np1),toline(p,nc1));
t.p2 = CrossLine(toline(c.c,np2),toline(p,nc2));
return t;
}
Листинг Java
public static segment TouchPoints(point p,circle c)
{
double pi=Math.pi;
double d=dist(p,c.c);
double s=Math.sqrt(d*d-c.r*c.r);
double alpha=atan(c.r/s);
double betta=pi/2.-alpha;
point np1=turnof(p,betta,c.c);
point nc1=turnof(c.c,2*pi-alpha,p);
point np2=turnof(p,2*pi-betta,c.c);
point nc2=turnof(c.c,alpha,p);
segment t=new segment();
t.p1 = CrossLine(toline(c.c,np1),toline(p,nc1));
t.p2 = CrossLine(toline(c.c,np2),toline(p,nc2));
return t;
}
14.06.2007, 15:57