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

public class reverse extends Applet implements Runnable{

    Thread th = null;
    double r2 = 1.4142;
    double pi = 3.1415;
    int mR = 120;
    int cx = 200,cy = 200;
    int cR,nn = 0,co = 0;
    int dx,dy;
    double px,py;
    boolean cp[] = {false,false,false,false,false,false,false,false,false};
    Button shu = new Button("  shuffle  ");
    Color c1,c2;
    Image os;
    Graphics og;

    public void init(){
       
        setBackground(Color.white);
        os = createImage(400, 380);
        og = os.getGraphics();
        cR = (int)(mR * Math.sin(pi / 8)) - 10;

        setLayout(new FlowLayout());
        add(shu);

        addMouseListener(
            new MouseAdapter(){
                public void mousePressed(MouseEvent e){
                    px = (double)(e.getX() - cx) ; py = (double)(e.getY() - cy);
                    nn = (10 - (int)(Math.ceil(Math.atan2(px,py) / (pi / 4)))) % 8;
                    if(((px * px + py * py) > (mR - cR) * (mR - cR)) && 
                       ((px * px + py * py) < (mR + cR) * (mR + cR))){
                        cp[nn] = !cp[nn];
                        cp[(nn + 1) % 8] = !cp[(nn + 1) % 8];
                        cp[(nn + 7) % 8] = !cp[(nn + 7) % 8];
                        th.resume();  
                    }
                }
            }
        );

        shu.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                for(int k = 0;k < 8;k++){
                    if(Math.random() < 0.5){     
                        cp[k] = true;
                    }else{
                        cp[k] = false;
                    }
                }
               repaint();
            }
        });

    }

    public void paint(Graphics g){

        og.setColor(Color.white); 
        og.fillRect(0,0,400,380);
        og.setColor(Color.black);
        for(int k = 0;k < 8;k ++){
            if((k != nn) && (k != ((nn + 1) % 8)) && (k != ((nn + 7) % 8))){
                dx = (int)(mR * Math.cos((2 * k + 1) * pi / 8)) - cR + cx;
                dy = (int)(mR * Math.sin((2 * k + 1) * pi / 8)) - cR + cy;
                if(cp[k] == false){
                    og.setColor(Color.red);
                }else{
                    og.setColor(Color.blue);
                }
                og.fillOval(dx,dy,2 * cR,2 * cR);
            }else{
                if(cp[nn] == false){
                    c1 = Color.blue ; c2 = Color.red;
                }else{
                    c1 = Color.red ; c2 = Color.blue;
                }
                dx = (int)(mR * Math.cos((2 * nn + 1) * pi / 8)) - cR + cx;
                dy = (int)(mR * Math.sin((2 * nn + 1) * pi / 8)) - cR + cy;
                if(co == 0){
                    og.setColor(c2);
                    og.fillOval(dx + co,dy,2 * (cR - co),2 * cR);
                }else if(co < cR){
                    og.setColor(c1);
                    og.fillOval(dx + co,dy,2 * (cR - co),2 * cR);
                }else{
                    og.setColor(c2);
                    og.fillOval(dx + 2 * cR - co,dy,2 * (co - cR),2 * cR);
                }

                if(cp[(nn + 1) % 8] == false){
                    c1 = Color.blue ; c2 = Color.red;
                }else{
                    c1 = Color.red ; c2 = Color.blue;
                }
                dx = (int)(mR * Math.cos((2 * ((nn + 1) % 8) + 1) * pi / 8)) - cR + cx;
                dy = (int)(mR * Math.sin((2 * ((nn + 1) % 8) + 1) * pi / 8)) - cR + cy;
                if(co == 0){
                    og.setColor(c2);
                    og.fillOval(dx + co,dy,2 * (cR - co),2 * cR);
                }else if(co < cR){
                    og.setColor(c1);
                    og.fillOval(dx + co,dy,2 * (cR - co),2 * cR);
                }else{
                    og.setColor(c2);
                    og.fillOval(dx + 2 * cR - co,dy,2 * (co - cR),2 * cR);
                }

                if(cp[(nn + 7) % 8] == false){
                    c1 = Color.blue ; c2 = Color.red;
                }else{
                    c1 = Color.red ; c2 = Color.blue;
                }
                dx = (int)(mR * Math.cos((2 * ((nn + 7) % 8) + 1) * pi / 8)) - cR + cx;
                dy = (int)(mR * Math.sin((2 * ((nn + 7) % 8) + 1) * pi / 8)) - cR + cy;
                if(co == 0){
                    og.setColor(c2);
                    og.fillOval(dx + co,dy,2 * (cR - co),2 * cR);
                }else if(co < cR){
                    og.setColor(c1);
                    og.fillOval(dx + co,dy,2 * (cR - co),2 * cR);
                }else{
                    og.setColor(c2);
                    og.fillOval(dx + 2 * cR - co,dy,2 * (co - cR),2 * cR);
                }
            }
        }
        g.drawImage(os,0,0,this );
    }

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

    public void stop(){
        th = null;
    }

    public void run(){
        while (th != null){
            try {
                co ++;
                if(co > 2 * cR){
                    th.suspend();
                    co = 0;
                }
                Thread.sleep(20);
            }
            catch (InterruptedException e){ }
            repaint();
        }
    }
    public void update( Graphics g )
    {
        paint( g ) ;
    }
}