import java.awt.Graphics;
import java.applet.Applet;
import java.awt.Color;
import java.awt.*;
public class catrsplcli extends java.applet.Applet{
    Point[] p = new Point[150];
    Color col1,col2,col3,col4;
    double px,py,nt,ti,x,y;
    double piaw=3.14159265358979;
    int q,phi,a,n;
    int Naw;
    int takaaw,habaaw,orikaeshi,Naw2;
    int kaw,iaw,jaw,i;
    String NS,habaS,takaS;
    double Nd,takad,habad;
    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.green;
        col3=Color.white;
        col4=Color.pink;
        takaS=getParameter("takap");
        habaS=getParameter("habap");
        habad=dou(habaS);
        takad=dou(takaS);
        habaaw=(int)habad;
        takaaw=(int)takad;
    }
    double x1aw[]=new double[150];
    double y1aw[]=new double[150];
    double bm1x[]=new double[150];
    double bm1y[]=new double[150];
    double bp1x[]=new double[150];
    double bp1y[]=new double[150];
    double w1aw[]=new double[150];
    double x2aw[]=new double[150];
    double y2aw[]=new double[150];
    double w2aw[]=new double[150];
    int xaw[]=new int[150];
    int yaw[]=new int[150];
    int waw[]=new int[150];
    double saw[]=new double[150];
    String sssaw[]=new String[150];

    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;
    }

    public double nqt(int qq,double tt){
        double re,re1,re2,re3;
        if(qq==1){
            re=0.0;
            if(tt>-1.0 && tt<=0.0){
                re=tt+1.0;
            }
            if(tt>0.0 && tt<1.0){
                re=-tt+1.0;
            }
        }//qq==1
        else{
            re=0.0;
            if(tt>-(qq+1.0)/2.0 && tt<(qq+1.0)/2.0){
                re1=1.0/qq;
                re2=(tt+(qq+1.0)/2.0)*nqt(qq-1,tt+0.5);
                re3=((qq+1.0)/2.0-tt)*nqt(qq-1,tt-0.5);
                re=re1*(re2+re3);
            }
        }
        return re;
    }

    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){
        double kat,kat2,sep,sep2,qx,qy,vipx,vipy,vimx,vimy;
        double t;
        g.setColor(col1);
        g.fillRect(1,1,habaaw,takaaw);
        a=0;
        q=3;//(int)(randaw()*7)+1;
        g.setColor(col2);
        Point old,current;
        Naw=n;
        for(kaw=0;kaw<Naw;kaw++){
            x1aw[kaw]=p[kaw].x+Math.cos(kaw*1.1)+kaw*0.0001;
            y1aw[kaw]=p[kaw].y+Math.sin(kaw*1.1)+kaw*0.001;
//            x1aw[0]=120.0;
//            y1aw[0]=180.0;
//            x1aw[1]=200.0;
//            y1aw[1]=200.0;
            x2aw[kaw]=x1aw[kaw];
            y2aw[kaw]=y1aw[kaw];
            xaw[kaw]=(int)x2aw[kaw];
            yaw[kaw]=(int)y2aw[kaw];
            g.fillOval(xaw[kaw]-3,yaw[kaw]-3,6,6);
            g.drawString(""+(kaw+1),xaw[kaw]+6,yaw[kaw]);
        }
        if(a==1){
            x1aw[Naw]=x1aw[0];
            y1aw[Naw]=y1aw[0];
            x2aw[Naw]=x1aw[0];
            y2aw[Naw]=y1aw[0];
            Naw++;
        }
        g.setColor(col4);
        for(kaw=1;kaw<Naw-1;kaw++){
            kat=(y1aw[kaw+1]-y1aw[kaw-1])/(x1aw[kaw+1]-x1aw[kaw-1]);
            kat2=-1.0/kat;
            sep=y1aw[kaw-1]-kat*x1aw[kaw-1];
            sep2=y1aw[kaw]-kat2*x1aw[kaw];
            qx=(sep2-sep)/(kat-kat2);
            qy=kat*qx+sep;
//            g.fillOval((int)qx-4,(int)qy-4,8,8);
            vimx=(qx-x1aw[kaw-1])/3.0;
            vimy=(qy-y1aw[kaw-1])/3.0;
            vipx=(x1aw[kaw+1]-qx)/3.0;
            vipy=(y1aw[kaw+1]-qy)/3.0;
            if(qx<x1aw[kaw-1] && x1aw[kaw-1]<x1aw[kaw+1]){
               vimx=-vimx;
               vimy=-vimy;
            }
            if(qx>x1aw[kaw+1] && x1aw[kaw+1]>x1aw[kaw-1]){
               vipx=-vipx;
               vipy=-vipy;
            }
            if(qx<x1aw[kaw+1] && x1aw[kaw+1]<x1aw[kaw-1]){
               vipx=-vipx;
               vipy=-vipy;
            }
            if(qx>x1aw[kaw-1] && x1aw[kaw-1]>x1aw[kaw+1]){
               vimx=-vimx;
               vimy=-vimy;
            }
            bm1x[kaw]=x1aw[kaw]-vimx;
            bm1y[kaw]=y1aw[kaw]-vimy;
            g.fillOval((int)bm1x[kaw]-2,(int)bm1y[kaw]-2,4,4);
            bp1x[kaw]=x1aw[kaw]+vipx;
            bp1y[kaw]=y1aw[kaw]+vipy;
            g.fillOval((int)bp1x[kaw]-2,(int)bp1y[kaw]-2,4,4);
        }//kaw
        Naw2=Naw;
        Naw=0;
        for(kaw=0;kaw<Naw2;kaw++){
            if(kaw!=0 && kaw!=Naw2-1){
                x1aw[Naw]=bm1x[kaw];
                y1aw[Naw]=bm1y[kaw];
//            g.drawString(""+(Naw+1),(int)x1aw[Naw]+16,(int)y1aw[Naw]);
                Naw++;
            }
            x1aw[Naw]=x2aw[kaw];
            y1aw[Naw]=y2aw[kaw];
//            g.drawString(""+(Naw+1),(int)x1aw[Naw]+16,(int)y1aw[Naw]);
            Naw++;
            if(kaw!=0 && kaw!=Naw2-1){
                x1aw[Naw]=bp1x[kaw];
                y1aw[Naw]=bp1y[kaw];
//            g.drawString(""+(Naw+1),(int)x1aw[Naw]+16,(int)y1aw[Naw]);
                Naw++;
            }
        }//kaw
        phi=(int)(q/2);
        g.setColor(col3);
        for(t=-phi+1.0;t<=Naw+phi;t=t+0.002){
            x=0.0;
            y=0.0;
            for(kaw=-2*phi+1;kaw<=Naw+2*phi;kaw++){
                ti=t-kaw;
                if(kaw<1){
                    px=x1aw[0];
                    py=y1aw[0];
                }
                if(kaw>Naw){
                    px=x1aw[Naw-1];
                    py=y1aw[Naw-1];
                }
                if(kaw>0 && kaw<=Naw){
                    px=x1aw[kaw-1];
                    py=y1aw[kaw-1];
                }
                x=x+nqt(q,t-kaw)*px;
                y=y+nqt(q,t-kaw)*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));
        }

        g.setColor(col2);
        if(a==0){
            g.drawString("N="+Naw2,15,15);
        }
        else{
            g.drawString("N="+(Naw2-1),15,15);
        }
        g.drawString("q="+q,15,30);
        g.drawString("a="+a,15,45);
    }

    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;
    }
}
