import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.lang.Math;

public class tangram extends Applet implements Runnable{

   Thread th = null;
   Image os;
   Graphics og;
   int px[][] = {{20,136,20,20,20},
                 {360,360,244,360,360},
                 {278,360,360,278,278},
                 {319,360,360,319,319},
                 {61,20,20,61,61},
                 {171,253,212,130,171},
                 {20,78,78,20,20}};
   int py[][] = {{264,380,380,264,264},
                 {264,380,380,264,264},
                 {40,40,122,40,40},
                 {191,150,232,191,191},
                 {191,150,232,191,191},
                 {40,40,81,81,40},
                 {40,40,98,98,40}};
   int cx[] = {49,331,340,340,40,191,49};
   int cy[] = {351,351,60,191,191,60,69};
   int pdx[][] = {{108,272,272,108,108,108,108,108,108,108,108,108,108,108},
                  { 74,190,306,306,190, 74, 74, 74, 74, 74, 74, 74, 74, 74},
                  {132,248,248,190,190,248,248,190,190,248,248,132,132,132},
                  { 70,128,169,169,145,309,227,261,145, 87, 87,128,128, 70},
                  {103,277,277,195,219,161,161,185,267,103,103,103,103,103},
                  { 74,306,306,248,272,108,132, 74, 74, 74, 74, 74, 74, 74},
                  {190,248,272,313,190, 67,108,132,190,190,190,190,190,190},
                  {103,190,149,190,231,190,277,277,248,190,132,103,103,103}};
   int pdy[][] = {{122,122,286,286,122,122,122,122,122,122,122,122,122,122},
                  { 94,210, 94,210,326,210, 74, 74, 74, 74, 74, 74, 74, 74},
                  { 65, 65,123,123,181,181,239,239,297,297,355,355, 65, 65},
                  {137, 79,120,202,226,226,308,342,342,284,202,161,137,137},
                  {123,123,287,205,181,181,235,211,293,293,123,123,123,123},
                  {140,140,198,256,280,280,256,198,140,140,140,140,140,140},
                  {102,160,160,201,324,201,160,160,102,102,102,102,102,102},
                  {164,164,123, 82,123,164,164,280,280,338,280,280,164,164}};
   int sx[] = new int[5] , sy[] = new int[5];
   int scx,scy,xx,yy;
   int pn = 7,dn = 0;
   int mx,my,dx,dy;
   double ir2 = 0.707107;
   Choice cho = new Choice();

   public void init(){
      setBackground(new Color(0,96,96));
      os = createImage(380,400);
      og = os.getGraphics();
      cho.addItem("  square         ");
      cho.addItem("  V              ");
      cho.addItem("  E              ");
      cho.addItem("  swan           ");
      cho.addItem("  arrow          ");
      cho.addItem("  cup            ");
      cho.addItem("  diamond        ");
      cho.addItem("  man            ");
      cho.addItemListener(new MyListener());
      add(cho);
      addMouseListener(
         new MouseAdapter(){
            public void mousePressed(MouseEvent e){
               mx = e.getX();
               my = e.getY();
               if((cx[0]-mx)*(cx[0]-mx)+(cy[0]-my)*(cy[0]-my)<41*41){
                  pn = 0;
               }else if((cx[1]-mx)*(cx[1]-mx)+(cy[1]-my)*(cy[1]-my)<41*41){
                  pn = 1;
               }else if((cx[2]-mx)*(cx[2]-mx)+(cy[2]-my)*(cy[2]-my)<28*28){
                  pn = 2;
               }else if((cx[3]-mx)*(cx[3]-mx)+(cy[3]-my)*(cy[3]-my)<20*20){
                  pn = 3;
               }else if((cx[4]-mx)*(cx[4]-mx)+(cy[4]-my)*(cy[4]-my)<20*20){
                  pn = 4;
               }else if((cx[5]-mx)*(cx[5]-mx)+(cy[5]-my)*(cy[5]-my)<28*28){
                  pn = 5;
               }else if((cx[6]-mx)*(cx[6]-mx)+(cy[6]-my)*(cy[6]-my)<28*28){
                  pn = 6;
               }else{
                  pn = 7;
               }
               if(e.getClickCount() == 1){
                  if(pn != 7){
                     for(int di = 0;di < 5;di ++){
                        sx[di] = px[pn][di] ; sy[di] = py[pn][di] ;
                     }
                     scx = cx[pn] ; scy = cy[pn] ;
                  }
               }else{
                  for(int rn = 0;rn < 5;rn ++){
                     xx = px[pn][rn] ; yy = py[pn][rn] ;  
                     px[pn][rn] = (int)(Math.round(ir2 * (xx - cx[pn] - yy + cy[pn]))) + cx[pn];
                     py[pn][rn] = (int)(Math.round(ir2 * (xx - cx[pn] + yy - cy[pn]))) + cy[pn];
                  }
               }
               repaint();
            }
         }
      );

      addMouseMotionListener(
         new MouseMotionAdapter(){
            public void mouseDragged(MouseEvent e){
               dx = e.getX();
               dy = e.getY();
               for(int nr = 0;nr < 5;nr ++){
                  px[pn][nr] = sx[nr] + dx - mx;
                  py[pn][nr] = sy[nr] + dy - my;
               }
               cx[pn] = scx + dx - mx ; cy[pn] = scy + dy - my ; 
               repaint();
            }
         }
      );
   }

   class MyListener implements ItemListener{
      public void itemStateChanged(ItemEvent e){
         Choice cho = (Choice)e.getSource();
         switch(cho.getSelectedIndex()){
            case 0 : dn = 0 ; break;
            case 1 : dn = 1 ; break;
            case 2 : dn = 2 ; break;
            case 3 : dn = 3 ; break;
            case 4 : dn = 4 ; break;
            case 5 : dn = 5 ; break;
            case 6 : dn = 6 ; break;
            case 7 : dn = 7 ; break;
         }
         repaint();
      }
   }

   public void paint(Graphics g){
      og.setColor(new Color(0,96,96)); 
      og.fillRect(0,0,400,300);
      og.clipRect(10,30,360,360);
      og.setColor(Color.white); 
      og.fillRect(10,30,360,360);
      og.setColor(Color.black);
      og.fillPolygon(pdx[dn],pdy[dn],14);
      for(int di = 0;di <7;di ++){
         og.setColor(new Color(50,80,255));
         og.fillPolygon(px[di],py[di],5);
         og.setColor(Color.blue);
         og.drawPolygon(px[di],py[di],5);
      }
      g.drawImage(os,0,0,this );
   }

   public void start(){    
      if(th == null){
         th = new Thread(this);
            th.start();
      }
   }

   public void stop(){
      th = null;
   }

   public void run(){
      while (th != null){
         try {
            Thread.sleep(30);
         }
         catch (InterruptedException e){ }
      }
   }

   public void update( Graphics g ){
        paint( g ) ;
   }

}