Построение касательной



Максимум у нас будет 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

 


По всем вопросам обращаться: rumterg@gmail.com