import java.awt.Graphics;
import java.applet.Applet;
import java.awt.Color;
public class hielvo extends java.applet.Applet{
  Color col1,col2;
  int N,taka,haba,taka2,haba2;
  int k,i,j,l;
  double di2,di,cp2,cpx,ys,t,r,th,pi,z1x,z2x,z1y,z2y;
  double x,ya,yb,yc,yd,y,xa,xb,xc,xd,sa0,sa1,y21,y20;
  double x0,y0,xx,yy,xa1=0,ya1=0,yy2,rr,mind,maxd,dd;
  double di4,di3,cp3,cpx3,ys3,t2,ds,us,minx,miny,maxx,maxy;
  int br,br2,u,k2;
  String NS,habaS,takaS;
  double Nd,takad,habad;
  Color cl[]=new Color[13];
  double kx[]=new double[100];
  double ky[]=new double[100];
  double kz[]=new double[100];
  public double dou(String dous){
    double dou1;
    dou1 = (Double.valueOf(dous)).doubleValue();
    return dou1;
  }
  public double rand(){
    double rand1;
    rand1=Math.random();
    return rand1;
  }
  public void init(){
    col1=Color.black;
    col2=Color.yellow;
    cl[0]=Color.white;
    cl[1]=Color.green;
    cl[2]=new Color(199,111,238);
    takaS=getParameter("takap");
    habaS=getParameter("habap");
    NS=getParameter("Np");
    habad=dou(habaS);
    takad=dou(takaS);
    Nd=dou(NS);
    if(Nd==8){
      Nd=4+16*rand();
    }
    haba=(int)habad;
    taka=(int)takad;
    N=(int)Nd;
  }
  double x1[]=new double[100];
  double y1[]=new double[100];
  double x2[]=new double[100];
  double y2[]=new double[100];
  public double jou(double a,double b){
    double jou1;
    jou1=Math.pow(a,b);
    return jou1;
  }
  void heapv(double te1[],double te2[],double te3[],int NN){
    int kk,kks,ii,jj,mm;
    double b1,b2,b3,c1,c2,c3;
    kks=(int)(NN/2);
    for(kk=kks;kk>=1;kk--){
      ii=kk;
      b1=te1[ii-1];b2=te2[ii-1];b3=te3[ii-1];
      while(2*ii<=NN){
        jj=2*ii;
        if(jj+1<=NN){
          if(te1[jj-1]<te1[jj]){
            jj++;
          }
        }
        if(te1[jj-1]<=b1){
          break;
        }
        te1[ii-1]=te1[jj-1];te2[ii-1]=te2[jj-1];te3[ii-1]=te3[jj-1];
        ii=jj;
      }//wend
      te1[ii-1]=b1;te2[ii-1]=b2;te3[ii-1]=b3;
    }//next kk
    for(mm=NN-1;mm>=1;mm--){
      c1=te1[mm];c2=te2[mm];c3=te3[mm];
      te1[mm]=te1[0];te2[mm]=te2[0];te3[mm]=te3[0];
      ii=1;
      while(2*ii<=mm){
        kk=2*ii;
        if(kk+1<=mm){
          if(te1[kk-1]<=te1[kk]){
            kk++;
          }
        }
        if(te1[kk-1]<=c1){
          break;
        }
        te1[ii-1]=te1[kk-1];te2[ii-1]=te2[kk-1];te3[ii-1]=te3[kk-1];
        ii=kk;
      }//wend
      te1[ii-1]=c1;te2[ii-1]=c2;te3[ii-1]=c3;
    }//next mm
  }
  public void paint(java.awt.Graphics g){
    pi=3.141592653589793;
    N=4+(int)(11*rand());
    taka=350;
    haba=500;
    haba2=haba;
    taka2=taka;
    rr=10.0;
    g.setColor(col1);
    g.fillRect(1,1,haba,taka);
    g.setColor(col2);
    r=1.0+rand()*2.5;
    th=rand()*2.0*pi;
    for(k=0;k<N;k++){
      x1[k]=rand()*(haba-100)+85;
      y1[k]=rand()*(taka-30)+15;
    }
    for(k=0;k<N;k++){
      x1[k]=x1[k]+haba2*rr;
      y1[k]=y1[k]+taka2*rr;
    }
    for(k=0;k<N;k++){
      x2[k]=x1[k];
      y2[k]=y1[k];
      g.fillOval((int)(x2[k]-haba2*rr-3),(int)(y2[k]-taka2*rr-3),6,6);
    }
    for(k=0;k<N;k++){
      x1[k]=(jou(Math.cos(th),2)/r+jou(Math.sin(th),2))*x2[k]+(1.0-r)*Math.cos(th)*Math.sin(th)*y2[k]/r;
      y1[k]=(1.0-r)*Math.cos(th)*Math.sin(th)*x2[k]/r+(jou(Math.sin(th),2)/r+jou(Math.cos(th),2))*y2[k];
    }

    haba=(int)(haba2*rr*2);
    taka=(int)(taka2*rr*2);

    for(i=1;i<=N-1;i++){
      for(j=i+1;j<=N;j++){
        di2=(y1[i-1]-y1[j-1])/(x1[i-1]-x1[j-1]);
        di=-1/di2;
        cp2=(y1[i-1]+y1[j-1])/2;
        cpx=(x1[i-1]+x1[j-1])/2;
        ys=cp2-cpx*di;
        t=jou(x1[i-1]-x1[j-1],2)+jou(y1[i-1]-y1[j-1],2);
        if(ys>0 && ys<taka){
          x0=0;y0=ys;
        }
        else{
          if(di>0.0){
            x0=-ys/di;y0=0.0;
          }
          else{
            x0=(taka-ys)/di;
            y0=taka;
          }
        }
        yy=di*haba+ys;
        if(yy>0 && yy<taka){
          xa1=haba;ya1=yy;
        }
        else{
          if(di>0){
            xa1=(taka-ys)/di;ya1=taka;
          }
          else{
            xa1=-ys/di;
            ya1=0;
          }
        }
        l=1;
        kx[l-1]=x0;ky[l-1]=y0;
        for(k=1;k<=N;k++){
          if(k!=i && k!=j){
            di4=(y1[i-1]-y1[k-1])/(x1[i-1]-x1[k-1]);
            di3=-1/di4;
            cp3=(y1[i-1]+y1[k-1])/2;
            cpx3=(x1[i-1]+x1[k-1])/2;
            ys3=cp3-cpx3*di3;
            t2=jou(x1[i-1]-x1[k-1],2)+jou(y1[i-1]-y1[k-1],2);
            y20=di3*x0+ys3;
            y21=di3*xa1+ys3;
            sa0=y0-y20;
            sa1=ya1-y21;
            if(sa0*sa1<0){
              l++;
              kx[l-1]=(ys3-ys)/(di-di3);
              ky[l-1]=di*kx[l-1]+ys;
            }//if sa0*sa1<0
          }//if(k!=i && k!=j)
        }//next k
          l++;
          kx[l-1]=xa1;
          ky[l-1]=ya1;
          for(u=1;u<=l;u++){
            kz[u-1]=0;
          }
          heapv(kx,ky,kz,l);
          for(k=1;k<=l-1;k++){
            k2=k+1;
            xx=(kx[k-1]+kx[k2-1])/2;
            yy2=di*xx+ys;
            ds=jou(xx-x1[i-1],2)+jou(yy2-y1[i-1],2);
            br2=0;
            for(u=1;u<=N;u++){
              if(u!=i && u!=j){
                us=jou(xx-x1[u-1],2)+jou(yy2-y1[u-1],2);
                if(us<ds){
                  br2=br2+1;
                }
              }
            }//next u
            if(br2<3){
              g.setColor(cl[br2]);
              z1x=(r*jou(Math.cos(th),2.0)+jou(Math.sin(th),2.0))*kx[k-1]+(r-1.0)*Math.cos(th)*Math.sin(th)*ky[k-1];
              z1y=(r-1.0)*Math.cos(th)*Math.sin(th)*kx[k-1]+(r*jou(Math.sin(th),2)+jou(Math.cos(th),2.0))*ky[k-1];
              z2x=(r*jou(Math.cos(th),2.0)+jou(Math.sin(th),2.0))*kx[k2-1]+(r-1.0)*Math.cos(th)*Math.sin(th)*ky[k2-1];
              z2y=(r-1.0)*Math.cos(th)*Math.sin(th)*kx[k2-1]+(r*jou(Math.sin(th),2.0)+jou(Math.cos(th),2.0))*ky[k2-1];
              g.drawLine((int)(z1x-haba2*rr),(int)(z1y-taka2*rr),(int)(z2x-haba2*rr),(int)(z2y-taka2*rr));
            }//if br2<3
          }//next k
      }//next j
    }//next i


    g.setColor(cl[0]);
    g.drawRect(48,148,4,4);
    g.drawLine(50,150,70,150);
    g.setColor(cl[1]);
    for(x=-30.0;x<=30.0;x=x+0.25){
        g.setColor(col2);
        ya=Math.sqrt(900-x*x);
        yb=-Math.sqrt(900-x*x);
        xa=(r*jou(Math.cos(th),2.0)+jou(Math.sin(th),2.0))*x+(r-1.0)*Math.cos(th)*Math.sin(th)*ya;
        yc=(r-1.0)*Math.cos(th)*Math.sin(th)*x+(r*jou(Math.sin(th),2)+jou(Math.cos(th),2.0))*ya;
        xb=(r*jou(Math.cos(th),2.0)+jou(Math.sin(th),2.0))*x+(r-1.0)*Math.cos(th)*Math.sin(th)*yb;
        yd=(r-1.0)*Math.cos(th)*Math.sin(th)*x+(r*jou(Math.sin(th),2)+jou(Math.cos(th),2.0))*yb;
        g.drawLine(50+(int)(xa-.5),150+(int)yc,50+(int)(xa+.5),150+(int)yc);
        g.drawLine(50+(int)(xb-.5),150+(int)yd,50+(int)(xb+.5),150+(int)yd);
    }//x
    minx=0.0;
    miny=0.0;
    maxx=0.0;
    maxy=0.0;
    maxd=0.0;
    mind=9999.9;
    for(y=-30.0;y<30.0;y=y+0.25){
        xa=Math.sqrt(900-y*y);
        xb=-Math.sqrt(900-y*y);
        xc=(r*jou(Math.cos(th),2.0)+jou(Math.sin(th),2.0))*xa+(r-1.0)*Math.cos(th)*Math.sin(th)*y;
        ya=(r-1.0)*Math.cos(th)*Math.sin(th)*xa+(r*jou(Math.sin(th),2)+jou(Math.cos(th),2.0))*y;
        xd=(r*jou(Math.cos(th),2.0)+jou(Math.sin(th),2.0))*xb+(r-1.0)*Math.cos(th)*Math.sin(th)*y;
        yb=(r-1.0)*Math.cos(th)*Math.sin(th)*xb+(r*jou(Math.sin(th),2)+jou(Math.cos(th),2.0))*y;
        g.drawLine(50+(int)xc,150+(int)(ya-.5),50+(int)xc,150+(int)(ya+.5));
        g.drawLine(50+(int)xd,150+(int)(yb-.5),50+(int)xd,150+(int)(yb+.5));
        dd=jou(jou(xc,2.0)+jou(ya,2.0),0.5);
        if(dd<=mind){
            mind=dd;
            minx=xc;
            miny=ya;
        }
        if(dd>=maxd){
            maxd=dd;
            maxx=xc;
            maxy=ya;
        }
        dd=jou(jou(xd,2)+jou(yb,2),0.5);
        if(dd<=mind){
            mind=dd;
            minx=xd;
            miny=yb;
        }
        if(dd>=maxd){
            maxd=dd;
            maxx=xd;
            maxy=yb;
        }
    }//x
    g.setColor(new Color(255,155,0));
    if(th>pi){
        g.drawLine(50,150,50-(int)maxx,150-(int)maxy);
    }
    else{
        g.drawLine(50,150,50+(int)maxx,150+(int)maxy);
    }
    g.setColor(new Color(0,155,255));
    if(th>pi/2.0 && th<pi*1.5){
        g.drawLine(50,150,50+(int)minx,150+(int)miny);
    }
    else{
        g.drawLine(50,150,50-(int)minx,150-(int)miny);
    }
    g.setColor(col2);
    g.drawString("N="+N,15,15);
    g.drawString("r="+r,15,30);
    g.drawString("th="+(360.0-th*180/pi),15,45);
  }
}