import java.applet.*;
import java.awt.*;
import java.lang.Math;
import java.lang.Object;
public class Erscart extends Applet {

     public class point implements Cloneable{
                 public int x;
                 public int y;

                  public Object clone(){ //begin clone
                    try{ //begin try
                        return super.clone();
                        } //end try
                         
                    catch(CloneNotSupportedException e){ // begin catch
                        return null;  //if there is a catch
                         } //end catch
                    } //end cloning structure for point
             
                 }  //end point def

     public class pair implements Cloneable{
                 
                 public point rt=new point();
                 public point lt=new point();

                  public Object clone(){ //begin clone
                    try{ //begin try
                        pair pa=(pair)super.clone();
                        pa.rt=(point)rt.clone();
                        pa.lt=(point)lt.clone();
                        return pa;
                        } catch(CloneNotSupportedException e){
                           return null;
                          }//end catch

                    } //end cloning structure for pair
  
   
           } //end pair def
    
public class Body implements Cloneable{
                public point neck=new point();
                public point shoulder=new point();
                public point hip=new point();
                public pair elbow=new pair();
                public pair wrist=new pair();
                public pair knee=new pair();
                public pair foot=new pair();
                public pair head=new pair();
 
                  public Object clone(){ //begin clone
                    try{ //begin try
                        Body bo=(Body)super.clone();
                        bo.neck=(point)neck.clone();
                        bo.shoulder=(point)shoulder.clone();
                        bo.hip=(point)hip.clone();
                        bo.elbow=(pair)elbow.clone();
                        bo.wrist=(pair)wrist.clone();
                        bo.knee=(pair)knee.clone();
                        bo.foot=(pair)foot.clone();
                        bo.head=(pair)head.clone();
                        return bo;
                        } //end try
                    catch(CloneNotSupportedException e){
                           return null;
                          }//end catch

                    } //end cloning structure for body
  
 
                } // end Body  def

   private int i;
   private int top;
   private int topr;
   private int last_x=0;
   private int last_y=0;
   private int neckHite  = 50;
   private int shoulderHite = 60;
   private int hipHite = 100;
   private int footing = 140;
   private int hipX = 50;
   private int headX=75;
   private int headY;
   private int shoulderX = 70;
   private int neckX = 75;
   private int leg = 30;
   private int eneckx;
   private int eshoulderx;
   private Color current_color=Color.black;
   private Button clear_button;
   private Button draw_button;
   public pair pa=new pair();
   public Body s=new Body();
   public Body er=new Body();
   public Body bo=new Body();


   private double pie=3.14159265359; 
   private double skip = 1.0;  //to skip = 1/2
   private double angmult = 1.2;

   private double ivart;
   private double elbart;
   private double elbalt;
   private double kneeart;
   private double kneealt;
   private double angrt;
   private double anglt;
   private double ivalt;


//init applet
   public void init(){

//set backgd color
    this.setBackground(Color.white);

//create a button
    clear_button=new Button("Clear");
    clear_button.setForeground(Color.black);
    clear_button.setBackground(Color.lightGray);
    this.add(clear_button);

//create a button
    draw_button=new Button("Man Running");
    draw_button.setForeground(Color.black);
    draw_button.setBackground(Color.lightGray);
    this.add(draw_button);
   }
//end init applet




//called when mouse click
    public boolean mouseDown(Event e, int x, int y){
          last_x=x; last_y=y;
           return true;
       }


//called when mouse moves
    public boolean mouseDrag(Event e, int x, int y){
          Graphics g=this.getGraphics();
          g.setColor(current_color);
          g.drawLine(last_x,last_y,x,y);
          last_x=x;
          last_y=y;
          return true;
      }


//user clicks button or chooses a color
     public boolean action(Event event, Object arg){

          if(event.target==clear_button){
               Graphics g=this.getGraphics();
               Rectangle r=this.bounds();
               g.setColor(this.getBackground());
               g.fillRect(r.x,r.y,r.width,r.height);
               return true;
              }
              //end clear

          // in case of click
         else if(event.target==draw_button){
               Graphics g=this.getGraphics();
               g.setColor(Color.black);

 
// begin graphics routine
 top=10; topr=26;
    for(i=1; i < 296; i++){
     // begin for 

     top++; 
     if(top>32){top=1;}
     topr++; 
     if(topr>32){topr=1;}
s.neck.x=neckX + i;

s.neck.y=neckHite;

s.shoulder.x=shoulderX + i;

s.shoulder.y=shoulderHite;

s.hip.x=hipX + i;

s.hip.y=hipHite;

s.head.rt.x =neckX +i -10;
s.head.rt.y =neckHite-20;
s.head.lt.x =20;
s.head.lt.y =20;



//calc new angles

  ivalt=(pie)*i/10.0;
  ivart=ivalt + 1.5*skip*pie;
  if(top>16){
        elbart=0.25*pie + pie*((top/32.0) -0.5);
        elbalt=0.75*pie - pie*((top/32.0) -0.5);
        anglt=1.5*pie - 1.5*pie*(top/32.0);
        if(top>24){
             kneealt=pie - 3.0*pie*((top/32.0) - 0.75);
                  }
                  //end if top >24
          else{
              kneeart=0.75*pie + 0.25*pie*(top/32.0);
              }
                // else 16<top<25               
          }
           //end if top >16 
  else{
       elbart=0.75*pie - pie*(top/32.0);
       elbalt=0.25*pie + pie*(top/32.0);
       anglt=1.5*pie*(top/32.0);
       kneealt=0.25*pie + pie*(top/32.0);
       
       }
       // else top <=16
  if(topr>16){
       angrt=1.5*pie - 1.5*pie*(topr/32.0);
        if(topr>24){kneeart=pie -3.0*pie*((topr/32.0) - 0.75);}
                // end if topr>24
             else{kneeart=0.75*pie + 0.25*pie*(topr/32.0);}
      }       
    // end if topr >16
      else{
          angrt=1.5*pie*(topr/32.0);
          kneeart=0.25*pie + pie*(topr/32.0);
          }
          //end else topr<=16

      elbart=elbart*angmult;
      elbalt=elbalt*angmult;
 // angles for each limb have been calculated

s.knee.lt.x=(s.hip.x + (int)(leg*Math.cos(anglt)));
s.knee.lt.y=(s.hip.y + (int)(leg*Math.sin(anglt)));
s.knee.rt.x=(s.hip.x + (int)(leg*Math.cos(angrt)));
s.knee.rt.y=(s.hip.y + (int)(leg*Math.sin(angrt)));


s.foot.lt.x=(s.knee.lt.x + (int)(leg*Math.cos(kneealt)));
s.foot.lt.y=(s.knee.lt.y + (int)(leg*Math.sin(kneealt)));
s.foot.rt.x=(s.knee.rt.x + (int)(leg*Math.cos(kneeart)));
s.foot.rt.y=(s.knee.rt.y + (int)(leg*Math.sin(kneeart)));



s.elbow.lt.x=(int)(s.shoulder.x + (leg*Math.cos(elbalt)));
s.elbow.lt.y=(int)(s.shoulder.y + (leg*Math.sin(elbalt)));
s.elbow.rt.x=(int)(s.shoulder.x + (leg*Math.cos(elbart)));
s.elbow.rt.y=(int)(s.shoulder.y + (leg*Math.sin(elbart)));



s.wrist.lt.x=(int)(s.elbow.lt.x + (0.7*leg*Math.cos(2.0*elbalt - pie)));
s.wrist.lt.y=(int)(s.elbow.lt.y + (0.7*leg*Math.sin(2.0*elbalt - pie)));
s.wrist.rt.x=(int)(s.elbow.rt.x + 0.7*leg*Math.cos(elbart - 0.5*pie));
s.wrist.rt.y=(int)(s.elbow.rt.y + 0.7*leg*Math.sin(elbart -0.5*pie));

headX=headX+1;



//begin draw man
g.setColor(Color.black);
g.drawArc(s.head.rt.x,s.head.rt.y,s.head.lt.x,s.head.lt.y,0,360);
g.drawLine(s.neck.x,s.neck.y,s.shoulder.x,s.shoulder.y);
g.drawLine(s.shoulder.x,s.shoulder.y,s.hip.x,s.hip.y);
g.drawLine(s.hip.x,s.hip.y,s.knee.lt.x,s.knee.lt.y);
g.drawLine(s.knee.lt.x,s.knee.lt.y,s.foot.lt.x,s.foot.lt.y);
g.drawLine(s.hip.x,s.hip.y,s.knee.rt.x,s.knee.rt.y);
g.drawLine(s.knee.rt.x,s.knee.rt.y,s.foot.rt.x,s.foot.rt.y);
g.drawLine(s.shoulder.x,s.shoulder.y,s.elbow.lt.x,s.elbow.lt.y);
g.drawLine(s.shoulder.x,s.shoulder.y,s.elbow.rt.x,s.elbow.rt.y);
g.drawLine(s.elbow.rt.x,s.elbow.rt.y,s.wrist.rt.x,s.wrist.rt.y);
g.drawLine(s.elbow.lt.x,s.elbow.lt.y,s.wrist.lt.x,s.wrist.lt.y);
// end draw man

// begin erase
g.setColor(Color.white);
g.drawArc(s.head.rt.x-1,s.head.rt.y,s.head.lt.x,s.head.lt.y,0,360);
g.drawLine(er.neck.x,er.neck.y,er.shoulder.x,er.shoulder.y);
g.drawLine(er.shoulder.x,er.shoulder.y,er.hip.x,er.hip.y);
g.drawLine(er.hip.x,er.hip.y,er.knee.lt.x,er.knee.lt.y);
g.drawLine(er.knee.lt.x,er.knee.lt.y,er.foot.lt.x,er.foot.lt.y);
g.drawLine(er.hip.x,er.hip.y,er.knee.rt.x,er.knee.rt.y);
g.drawLine(er.knee.rt.x,er.knee.rt.y,er.foot.rt.x,er.foot.rt.y);
g.drawLine(er.shoulder.x,er.shoulder.y,er.elbow.lt.x,er.elbow.lt.y);
g.drawLine(er.shoulder.x,er.shoulder.y,er.elbow.rt.x,er.elbow.rt.y);
g.drawLine(er.elbow.rt.x,er.elbow.rt.y,er.wrist.rt.x,er.wrist.rt.y);
g.drawLine(er.elbow.lt.x,er.elbow.lt.y,er.wrist.lt.x,er.wrist.lt.y);
// end erase



//begin draw man
g.setColor(Color.black);
g.drawArc(s.head.rt.x,s.head.rt.y,s.head.lt.x,s.head.lt.y,0,360);
g.drawLine(s.neck.x,s.neck.y,s.shoulder.x,s.shoulder.y);
g.drawLine(s.shoulder.x,s.shoulder.y,s.hip.x,s.hip.y);
g.drawLine(s.hip.x,s.hip.y,s.knee.lt.x,s.knee.lt.y);
g.drawLine(s.knee.lt.x,s.knee.lt.y,s.foot.lt.x,s.foot.lt.y);
g.drawLine(s.hip.x,s.hip.y,s.knee.rt.x,s.knee.rt.y);
g.drawLine(s.knee.rt.x,s.knee.rt.y,s.foot.rt.x,s.foot.rt.y);
g.drawLine(s.shoulder.x,s.shoulder.y,s.elbow.lt.x,s.elbow.lt.y);
g.drawLine(s.shoulder.x,s.shoulder.y,s.elbow.rt.x,s.elbow.rt.y);
g.drawLine(s.elbow.rt.x,s.elbow.rt.y,s.wrist.rt.x,s.wrist.rt.y);
g.drawLine(s.elbow.lt.x,s.elbow.lt.y,s.wrist.lt.x,s.wrist.lt.y);
// end draw man

er=(Body)s.clone();

//begin pause
for(int j=1; j<10000;j++){int tempore=j;}
//end pause   
    } 
// end for i





// end graphics routine
              
         return true;
        }
        // end draw button

           // Otherwise let the superclass handle it.
           else return super.action(event, arg);
     }
     // end action method
}
//end Applet

