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 ) ;
}
}
