import java.awt.Graphics;
import java.applet.Applet;
import java.awt.Color;
import java.awt.*;
public class hichbezcli extends java.applet.Applet{
  Point[] p = new Point[100];
  Color col1,col2,col3;
  double piaw=3.14159265358979;
  int Naw,j,k,cou,br,Naw2,n4,n;
  int takaaw,habaaw,orikaeshi;
  int kaw,iaw,jaw,i;
  String NS,habaS,takaS;
  double Nd,takad,habad,xx,yy,lto,th,xmax,x,y,px,py,bnit,t;
  public double dou(String dous){
    double dou1;
    dou1 = (Double.valueOf(dous)).doubleValue();
    return dou1;
  }
  public double randaw(){
    double rand1aw;
    rand1aw=Math.random();
    return rand1aw;
  }
  public void init(){
    col1=Color.black;
    col2=Color.pink;
    col3=Color.white;
    takaS=getParameter("takap");
    habaS=getParameter("habap");
    NS=getParameter("Np");
    habad=dou(habaS);
    takad=dou(takaS);
    Nd=dou(NS);
    if(Nd==20){
      Nd=4+46*randaw();
    }
    habaaw=(int)habad;
    takaaw=(int)takad;
    Naw=(int)Nd;
  }
  double x1aw[]=new double[100];
  double y1aw[]=new double[100];
  double w1aw[]=new double[100];
  double x2aw[]=new double[100];
  double y2aw[]=new double[100];
  double w2aw[]=new double[100];
  double x3aw[]=new double[100];
  double y3aw[]=new double[100];
  double w3aw[]=new double[100];
  double x4aw[]=new double[100];
  double y4aw[]=new double[100];
  int xaw[]=new int[100];
  int yaw[]=new int[100];
  int waw[]=new int[100];
  double saw[]=new double[100];
  String sssaw[]=new String[100];
  public double jouaw(double aaw,double baw){
    double jou1aw;
    jou1aw=Math.pow(aaw,baw);
    return jou1aw;
  }
  public double arcsinaw(double atasw){
    double artn1saw;
    artn1saw=Math.asin(atasw);
    return artn1saw;
  }
  public double artnaw(double ataw){
    double artn1aw;
    artn1aw=Math.atan(ataw);
    return artn1aw;
  }
  public double sainaw(double saiaw){
    double sain1aw;
    sain1aw=Math.sin(saiaw);
    return sain1aw;
  }
  public double kosaw(double kosainaw){
    double kos1aw;
    kos1aw=Math.cos(kosainaw);
    return kos1aw;
  }
  public double d(double d1,double d2,double d3,double d4){
    double dw;
    dw=jouaw(jouaw(d3-d1,2.0)+jouaw(d4-d2,2.0),0.5);
    return dw;
  }
  void heapaw(double he1aw[],double he2aw[],double he3aw[],int NNaw){
    int kkaw,kksaw,iiaw,jjaw,mmaw;
    double b1aw,b2aw,b3aw,c1aw,c2aw,c3aw;
    kksaw=(int)(NNaw/2);
    for(kkaw=kksaw;kkaw>=1;kkaw--){
      iiaw=kkaw;
      b1aw=he1aw[iiaw-1];b2aw=he2aw[iiaw-1];b3aw=he3aw[iiaw-1];
      while(2*iiaw<=NNaw){
        jjaw=2*iiaw;
        if(jjaw+1<=NNaw){
          if(he1aw[jjaw-1]<he1aw[jjaw]){
            jjaw++;
          }
        }
        if(he1aw[jjaw-1]<=b1aw){
          break;
        }
        he1aw[iiaw-1]=he1aw[jjaw-1];he2aw[iiaw-1]=he2aw[jjaw-1];he3aw[iiaw-1]=he3aw[jjaw-1];
        iiaw=jjaw;
      }//wend
      he1aw[iiaw-1]=b1aw;he2aw[iiaw-1]=b2aw;he3aw[iiaw-1]=b3aw;
    }//next kk
    for(mmaw=NNaw-1;mmaw>=1;mmaw--){
      c1aw=he1aw[mmaw];c2aw=he2aw[mmaw];c3aw=he3aw[mmaw];
      he1aw[mmaw]=he1aw[0];he2aw[mmaw]=he2aw[0];he3aw[mmaw]=he3aw[0];
      iiaw=1;
      while(2*iiaw<=mmaw){
        kkaw=2*iiaw;
        if(kkaw+1<=mmaw){
          if(he1aw[kkaw-1]<=he1aw[kkaw]){
            kkaw++;
          }
        }
        if(he1aw[kkaw-1]<=c1aw){
          break;
        }
        he1aw[iiaw-1]=he1aw[kkaw-1];he2aw[iiaw-1]=he2aw[kkaw-1];he3aw[iiaw-1]=he3aw[kkaw-1];
        iiaw=kkaw;
      }//wend
      he1aw[iiaw-1]=c1aw;he2aw[iiaw-1]=c2aw;he3aw[iiaw-1]=c3aw;
    }//next mm
  }
  public void paint(java.awt.Graphics g){
    g.setColor(col1);
    g.fillRect(1,1,habaaw,takaaw);
    xx=0.0;
    yy=0.0;
    Point old,current;
    Naw=n;
    Naw2=Naw;
    g.setColor(col3);
    for(kaw=1;kaw<=Naw;kaw++){
      x1aw[kaw-1]=p[kaw-1].x+Math.cos(kaw*1.1)+kaw*0.0001;
      y1aw[kaw-1]=p[kaw-1].y+Math.sin(kaw*1.1)+kaw*0.001;
      xaw[kaw-1]=(int)(x1aw[kaw-1]+0.5);
      yaw[kaw-1]=(int)(y1aw[kaw-1]+0.5);
      w1aw[kaw-1]=arcsinaw((y1aw[kaw-1]-yy)/d(x1aw[kaw-1],y1aw[kaw-1],xx,yy))+piaw/2;
      sssaw[kaw-1]=""+waw[kaw-1];
      g.fillOval(xaw[kaw-1]-3,yaw[kaw-1]-3,6,6);
    }
    g.setColor(col2);
    n4=0;
    while(Naw>0){
        heapaw(x1aw,y1aw,w1aw,Naw);
        for(kaw=1;kaw<=Naw;kaw++){
            x2aw[kaw-1]=x1aw[kaw-1];
            y2aw[kaw-1]=y1aw[kaw-1];
        }
        xmax=x1aw[Naw-1];
        th=piaw/2;
        orikaeshi=0;
        lto=0.0;
        cou=0;
        while(lto!=x2aw[0]){
            x3aw[cou]=x1aw[0];
            y3aw[cou]=y1aw[0];
            cou++;
            xx=x1aw[0];
            yy=y1aw[0];
            for(i=1;i<Naw;i++){
                w1aw[i]=arcsinaw((y1aw[i]-yy)/d(x1aw[i],y1aw[i],xx,yy))+piaw/2;
                if(x1aw[i]>xx){
                    w1aw[i]=3*piaw/2-arcsinaw((y1aw[i]-yy)/d(x1aw[i],y1aw[i],xx,yy));
                }
                w1aw[i]=w1aw[i]+piaw;
                if(w1aw[i]>2*piaw){
                    w1aw[i]=w1aw[i]-2*piaw;
                }
                if(orikaeshi==1){
                    w1aw[i]=arcsinaw((y1aw[i]-yy)/d(x1aw[i],y1aw[i],xx,yy))+piaw/2;
                    if(x1aw[i]>xx){
                        w1aw[i]=3*piaw/2-arcsinaw((y1aw[i]-yy)/d(x1aw[i],y1aw[i],xx,yy));
                    }
                    w1aw[i]=w1aw[i];
                    if(w1aw[i]>2*piaw){
                        w1aw[i]=w1aw[i]-2*piaw;
                    }
                }
            }//next i
            x1aw[0]=xx;
            y1aw[0]=yy;
            w1aw[0]=100.0;
            heapaw(w1aw,x1aw,y1aw,Naw);
            g.setColor(col2);
            g.drawLine((int)xx,(int)yy,(int)x1aw[0],(int)y1aw[0]);
            x4aw[n4]=xx;
            y4aw[n4]=yy;
            n4++;
            g.setColor(col3);
            g.drawString(""+n4,(int)xx,(int)yy);
            lto=x1aw[0];
            if(x1aw[0]==xmax){
                orikaeshi=1;
            }
        }//wend
        for(j=0;j<cou;j++){
            br=0;
            for(i=0;i<Naw2;i++){
                if(x3aw[j]==x1aw[i]){
                    for(k=i;k<Naw-1;k++){
                        x1aw[k]=x1aw[k+1];
                        y1aw[k]=y1aw[k+1];
                        w1aw[k]=w1aw[k+1];
                    }//k
                    Naw--;
                    br=1;
                    break;
                }//x3==x1
            }//i
        }//j
    }//Naw>2
    Naw2--;
    g.setColor(col3);
    for(i=0;i<Naw2+1;i++){
        x1aw[i]=x4aw[i];
        y1aw[i]=y4aw[i];
    }//i
    for(t=0.0;t<=1.0;t=t+0.0002){
        x=0.0;
        y=0.0;
        for(iaw=0;iaw<=Naw2;iaw++){
            bnit=1.0;
            for(k=1;k<=iaw;k++){
                if(k>0){
                    bnit=bnit*t*(Naw2-k+1)/k;
                }
                else{
                    bnit=bnit*t*Naw2;
                }
            }//k
            bnit=bnit*jouaw(1.0-t,Naw2-iaw);
            px=x1aw[iaw];
            py=y1aw[iaw];
            x=x+bnit*px;
            y=y+bnit*py;
        }
        g.drawLine((int)(x-.5),(int)y,(int)(x+.5),(int)y);
        g.drawLine((int)x,(int)(y-.5),(int)x,(int)(y+.5));
    }
    if(n==0){
        g.drawString("N=0",15,15);
    }
    else{
        g.drawString("N="+(Naw2+1),15,15);
    }
  }
  public boolean mouseDown(Event evt, int x, int y) {
    if(n<50){
      p[n] = new Point(x,y); n++;
    }
    else{
      n=0;
    }
    repaint();
    return true;
  }
}