import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class pentagram extends Applet implements Runnable{

   Thread th = null;
   Image os;
   Graphics og;
   double lx[][] = new double[7][2] , ly[][] = new double[7][2] ;
   double crx[] = new double[21] , cry[] = new double[21] ;
   double pi = 3.141592;
   double cx,cy;
   int pm,pn,ps,co,cf;
   double st,dt;
   int tx[] = new int[4],ty[] = new int[4];

   public void init(){
      os = createImage(360,360);
      og = os.getGraphics();
      setBackground(Color.white);

      pm = 0;
      for(int k1 = 0;k1 < 5;k1 ++){
         lx[k1][0] = Math.cos(2*pi*k1/5 - pi/2);
         ly[k1][0] = Math.sin(2*pi*k1/5 - pi/2);
         lx[k1][1] = Math.cos(2*pi*k1/5 + 3*pi/10);
         ly[k1][1] = Math.sin(2*pi*k1/5 + 3*pi/10);
      }
      lx[5][0] = Math.cos(pi/3)    ; ly[5][0] = Math.sin(pi/3)    ;
      lx[5][1] = Math.cos(2*pi/3)  ; ly[5][1] = Math.sin(2*pi/3)  ;
      lx[6][0] = Math.cos(-1*pi/3) ; ly[6][0] = Math.sin(-1*pi/3) ; 
      lx[6][1] = Math.cos(-2*pi/3) ; ly[6][1] = Math.sin(-2*pi/3) ;

      addMouseListener(
         new MouseAdapter(){
            public void mousePressed(MouseEvent e){
               cx = (e.getX()-180.0)/150.0 ; cy = (e.getY()-180.0)/150.0 ;
               if(pm == 0){
                  if((Math.abs(cx-lx[5][0])<0.05)&&(Math.abs(cy-ly[5][0])<0.05)){
                     pn = 5 ; ps = 0 ; pm = 1 ;
                  }else if((Math.abs(cx-lx[5][1])<0.05)&&(Math.abs(cy-ly[5][1])<0.05)){
                     pn = 5 ; ps = 1 ; pm = 1 ;
                  }else if((Math.abs(cx-lx[6][0])<0.05)&&(Math.abs(cy-ly[6][0])<0.05)){
                     pn = 6 ; ps = 0 ; pm = 1 ;
                  }else if((Math.abs(cx-lx[6][1])<0.05)&&(Math.abs(cy-ly[6][1])<0.05)){
                     pn = 6 ; ps = 1 ; pm = 1 ;
                  }
               }
               repaint();
            }
            public void mouseReleased(MouseEvent e){
               pm = 0;
               repaint();
            }
         }
      );

      addMouseMotionListener(
         new MouseMotionAdapter(){
            public void mouseDragged(MouseEvent e){
               st = pi/2 - Math.atan2((e.getX()-180.0)/150.0,(e.getY()-180.0)/150.0);
               if(pm == 1){
                  lx[pn][ps] = Math.cos(st);
                  ly[pn][ps] = Math.sin(st);
               }
               for(int n1 = 0;n1 < 7;n1 ++){
                  for(int n2 = 0;n2 < 2;n2 ++){
                     if((Math.abs(lx[pn][ps]-lx[n1][n2])<0.05)&&(Math.abs(ly[pn][ps]-ly[n1][n2])<0.05)){
                        lx[pn][ps] = lx[n1][n2] ; ly[pn][ps] = ly[n1][n2] ;
                     }
                  }
               }
               repaint();
            }
         }
      );

   }

   public void paint(Graphics g){
      og.setColor(Color.white); 
      og.fillRect(0,0,360,360);

      og.setColor(Color.lightGray);
      og.drawOval(30,30,300,300);
      for(int d1 = 0;d1 < 7;d1 ++){
         og.setColor(Color.black);
         og.drawLine((int)(150*lx[d1][0]+180),(int)(150*ly[d1][0]+180),(int)(150*lx[d1][1]+180),(int)(150*ly[d1][1]+180));
         if(d1 > 4){
            og.setColor(Color.blue);
            og.drawOval((int)(150*lx[d1][0]+177),(int)(150*ly[d1][0]+177),6,6);
            og.drawOval((int)(150*lx[d1][1]+177),(int)(150*ly[d1][1]+177),6,6);
         }
      }
      co = 0;
      for(int ln1 = 0;ln1 < 6;ln1 ++){
         for(int ln2 = ln1 + 1;ln2 < 7;ln2 ++){
            dt = (ly[ln1][1]-ly[ln1][0])*(lx[ln2][0]-lx[ln2][1])-(lx[ln1][0]-lx[ln1][1])*(ly[ln2][1]-ly[ln2][0]) ;
            if(dt == 0){
               crx[co] = 200 ; cry[co] = 200 ;
               co ++;
            }else{
               crx[co] = ((lx[ln2][0]-lx[ln2][1])*(lx[ln1][0]*ly[ln1][1]-lx[ln1][1]*ly[ln1][0])+(lx[ln1][1]-lx[ln1][0])*(lx[ln2][0]*ly[ln2][1]-lx[ln2][1]*ly[ln2][0]))/dt;
               cry[co] = ((ly[ln2][0]-ly[ln2][1])*(lx[ln1][0]*ly[ln1][1]-lx[ln1][1]*ly[ln1][0])+(ly[ln1][1]-ly[ln1][0])*(lx[ln2][0]*ly[ln2][1]-lx[ln2][1]*ly[ln2][0]))/dt;
               for(int n1 = 0;n1 < co;n1 ++){
                  if((Math.abs(crx[n1]-crx[co])<0.01)&&(Math.abs(cry[n1]-cry[co])<0.01)){
                     crx[co] = 200 ; cry[co] = 200 ;
                  }
               }
               if(crx[co]*crx[co]+cry[co]*cry[co] > 1.01){
                  crx[co] = 200 ; cry[co] = 200 ;
               }else{
                     og.setColor(Color.red);
                     og.fillOval((int)(150*crx[co]+178),(int)(150*cry[co]+178),5,5);
               }
               co ++ ;
            }
         }
      }
      co = 0;
      for(int p1 = 0;p1 < 19;p1 ++){
         for(int p2 = p1+1;p2 < 20;p2 ++){
            for(int p3 = p2+1;p3 < 21;p3 ++){
               if((crx[p1]*crx[p1]+cry[p1]*cry[p1]<=1.01)&&(crx[p2]*crx[p2]+cry[p2]*cry[p2]<=1.01)&&(crx[p3]*crx[p3]+cry[p3]*cry[p3]<=1.01)){
                  for(int l1 = 0;l1 < 7;l1 ++){
                     if(Math.abs((lx[l1][1]-lx[l1][0])*(cry[p1]-ly[l1][0])-(ly[l1][1]-ly[l1][0])*(crx[p1]-lx[l1][0]))<0.005){
                        if(Math.abs((lx[l1][1]-lx[l1][0])*(cry[p2]-ly[l1][0])-(ly[l1][1]-ly[l1][0])*(crx[p2]-lx[l1][0]))<0.005){
                           cf = 1;
                           for(int cn = 0;cn < 21;cn ++){
                              if((cn != p1)&&(cn != p2)){
                                 if((crx[cn]*crx[cn]+cry[cn]*cry[cn])<=1.01){
                                    if(Math.abs((lx[l1][1]-lx[l1][0])*(cry[cn]-ly[l1][0])-(ly[l1][1]-ly[l1][0])*(crx[cn]-lx[l1][0]))<0.005){
                                       if(((crx[p1]-crx[cn])*(crx[p2]-crx[cn])<0)||((cry[p1]-cry[cn])*(cry[p2]-cry[cn])<0))cf = 0;
                                    }
                                 }
                              }
                           }
                           if(cf == 1){
                              for(int l2 = 0;l2 < 7;l2 ++){
                                 if(l1 != l2){
                                    if(Math.abs((lx[l2][1]-lx[l2][0])*(cry[p2]-ly[l2][0])-(ly[l2][1]-ly[l2][0])*(crx[p2]-lx[l2][0]))<0.005){
                                       if(Math.abs((lx[l2][1]-lx[l2][0])*(cry[p3]-ly[l2][0])-(ly[l2][1]-ly[l2][0])*(crx[p3]-lx[l2][0]))<0.005){
                                          cf = 1;
                                          for(int cn = 0;cn < 21;cn ++){
                                             if((cn != p2)&&(cn != p3)){
                                                if((crx[cn]*crx[cn]+cry[cn]*cry[cn])<=1.01){
                                                   if(Math.abs((lx[l2][1]-lx[l2][0])*(cry[cn]-ly[l2][0])-(ly[l2][1]-ly[l2][0])*(crx[cn]-lx[l2][0]))<0.005){
                                                      if(((crx[p2]-crx[cn])*(crx[p3]-crx[cn])<0)||((cry[p2]-cry[cn])*(cry[p3]-cry[cn])<0))cf = 0;
                                                   }
                                                }
                                             }
                                          }
                                          if(cf == 1){
                                             for(int l3 = 0;l3 < 7;l3 ++){
                                                if((l2 != l3)&&(l1 != l3)){
                                                   if(Math.abs((lx[l3][1]-lx[l3][0])*(cry[p3]-ly[l3][0])-(ly[l3][1]-ly[l3][0])*(crx[p3]-lx[l3][0]))<0.005){
                                                      if(Math.abs((lx[l3][1]-lx[l3][0])*(cry[p1]-ly[l3][0])-(ly[l3][1]-ly[l3][0])*(crx[p1]-lx[l3][0]))<0.005){
                                                         cf = 1;
                                                         for(int cn = 0;cn < 21;cn ++){
                                                            if((cn != p3)&&(cn != p1)){
                                                               if((crx[cn]*crx[cn]+cry[cn]*cry[cn])<=1.01){
                                                                  if(Math.abs((lx[l3][1]-lx[l3][0])*(cry[cn]-ly[l3][0])-(ly[l3][1]-ly[l3][0])*(crx[cn]-lx[l3][0]))<0.005){
                                                                     if(((crx[p1]-crx[cn])*(crx[p3]-crx[cn])<0)||((cry[p1]-cry[cn])*(cry[p3]-cry[cn])<0))cf = 0;
                                                                  }
                                                               }
                                                            }
                                                         }
                                                         if(cf == 1){
                                                            tx[0] = (int)(150*crx[p1] + 180) ; ty[0] = (int)(150*cry[p1] + 180) ;
                                                            tx[1] = (int)(150*crx[p2] + 180) ; ty[1] = (int)(150*cry[p2] + 180) ;
                                                            tx[2] = (int)(150*crx[p3] + 180) ; ty[2] = (int)(150*cry[p3] + 180) ;
                                                            tx[3] = (int)(150*crx[p1] + 180) ; ty[3] = (int)(150*cry[p1] + 180) ;
                                                            og.setColor(new Color(100,100,255));
                                                            og.fillPolygon(tx,ty,4);
                                                            og.setColor(Color.black);
                                                            og.drawPolygon(tx,ty,4);
                                                            co ++;
                                                         }
                                                      }
                                                   }
                                                }
                                             }
                                          }
                                       }
                                    }
                                 }
                              }
                           }
                        }
                     }
                  }
               }
            }
         }
      }
      og.setFont(new Font("",Font.BOLD,16));
      og.drawString(""+co+" triangles",250,335);
      if(co == 10){
         og.setFont(new Font("",Font.BOLD,60));
         og.setColor(Color.black);
         og.drawString("clear!!",92,198);
         og.setColor(Color.red);
         og.drawString("clear!!",90,200);
      }
      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(50);
         }
         catch (InterruptedException e){
         }
      }
   }

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