import java.applet.Applet; import java.awt.event.*; import java.awt.*; public class test1 extends Applet { PlayingBoard board1; TextCanvas board2; public void init() { setBackground(Color.black); board1=new PlayingBoard(600); board2=new TextCanvas(); board1.resize(600,600); board2.resize(300,600); board1.setBackground(Color.black); board2.setBackground(Color.black); board1=board1.addTextCanvas(board2); add(board2); add(board1); } } class TextCanvas extends Canvas { String[] S=new String[4]; TextCanvas() { S[1]=new String(); S[2]=new String(); S[3]=new String(); S[1]="Move the cursor over a part of"; S[2]="the screen and this text will"; S[3]="explain its function."; } public void paint(Graphics g) { g.setFont(new Font("TimesRoman",Font.PLAIN,30)); g.setColor(Color.yellow); g.drawString("Rich: Applet 32",5,25); g.setFont(new Font("TimesRoman",Font.PLAIN,20)); g.drawString("The sqrt(2) game",5,55); g.setColor(Color.white); g.setFont(new Font("TimesRoman",Font.PLAIN,15)); g.drawString(S[1],10,540); g.drawString(S[2],10,560); g.drawString(S[3],10,580); } } class PlayingBoard extends Canvas implements MouseListener,MouseMotionListener { TextCanvas X; int SIZE; int direction; int HIDE1, HIDE2,HIDE3,HIDE4,HIDE5; double SHADOW1,SHADOW2; int MOVE1,MOVE2; int history; LineFlip P1,P2; PlayingBoard(int SIZE) { history=0; this.SIZE=SIZE; Color[] C=new Color[10]; HIDE1=0; HIDE2=0; HIDE3=0; HIDE4=0; HIDE5=0; MOVE1=0; MOVE2=0; SHADOW1=0; SHADOW2=0; P1=new LineFlip(1,SIZE/2+SIZE/8,SIZE/2+SIZE/8,SIZE/20); P2=new LineFlip(2,SIZE/2-SIZE/8,SIZE/2-SIZE/8,SIZE/20); direction=0; addMouseListener(this); addMouseMotionListener(this); } PlayingBoard addTextCanvas(TextCanvas Y) { PlayingBoard P=this; P.X=Y; return(P); } public void paint(Graphics g) { /*buttons*/ g.setColor(Color.yellow); if(HIDE1==0) { g.drawRect(SIZE/2+SIZE/8-SIZE/15,SIZE-SIZE/30,SIZE/30,SIZE/30); g.drawRect(SIZE/2+SIZE/8-SIZE/30,SIZE-SIZE/30,SIZE/30,SIZE/30); g.drawRect(SIZE/2+SIZE/8,SIZE-SIZE/30,SIZE/30,SIZE/30); g.drawRect(SIZE/2+SIZE/8+SIZE/30,SIZE-SIZE/30,SIZE/30,SIZE/30); } if(HIDE2==0) { g.drawRect(0,SIZE/2-SIZE/8-SIZE/15,SIZE/30,SIZE/30); g.drawRect(0,SIZE/2-SIZE/8-SIZE/30,SIZE/30,SIZE/30); g.drawRect(0,SIZE/2-SIZE/8,SIZE/30,SIZE/30); g.drawRect(0,SIZE/2-SIZE/8+SIZE/30,SIZE/30,SIZE/30); } /*the pieces*/ if(HIDE1==0) { g.translate(MOVE1,0); g.setColor(Color.cyan); g.drawOval(SIZE/8+SIZE/2-8,SIZE-SIZE/8-SIZE/20-13,16,16); g.fillOval(SIZE/8+SIZE/2-8,SIZE-SIZE/8-SIZE/20-13,16,16); P1.render(g,SIZE,SHADOW1); g.translate(-MOVE1,0); } if(HIDE2==0) { g.translate(0,MOVE2); g.setColor(Color.cyan); g.fillOval(SIZE/8+SIZE/20-3,-SIZE/8+SIZE/2-8,16,16); g.drawOval(SIZE/8+SIZE/20-3,-SIZE/8+SIZE/2-8,16,16); P2.render(g,SIZE,SHADOW2); g.translate(0,-MOVE2); } if(HIDE1+HIDE2>0) { P1.x=P1.update(1,SIZE); P2.x=P2.update(2,SIZE); } g.setColor(Color.blue); if(HIDE1==0) g.drawLine(SIZE/4,SIZE-SIZE/8,SIZE,SIZE-SIZE/8); if(HIDE2==0) g.drawLine(SIZE/8,0,SIZE/8,SIZE-SIZE/4); /*grid frame*/ g.setColor(Color.cyan); g.drawRect(SIZE/4+1,0,SIZE-SIZE/4-2,SIZE-SIZE/4-1); g.setColor(Color.black); g.fillRect(1,SIZE-SIZE/4-1,SIZE/4,SIZE/4); double sq2= Math.sqrt(2.0); g.setColor(Color.yellow); g.drawRect(0,0,SIZE-1,SIZE-1); /*viewport*/ g.setColor(new Color(0,0,60)); g.setColor(Color.blue); g.fillRect(1,SIZE-SIZE/30,SIZE/30,SIZE/30); g.translate(SIZE/4-SIZE/30,0); g.fillRect(1,SIZE-SIZE/4-1,SIZE/30,SIZE/30); g.translate(-SIZE/4+SIZE/30,0); g.setColor(Color.yellow); g.drawRect(0,SIZE-SIZE/4-1,SIZE/4-SIZE/30,SIZE/30); g.drawRect(0,SIZE-SIZE/30,SIZE/30,SIZE/30); g.translate(SIZE/4-SIZE/30,0); g.drawRect(0,SIZE-SIZE/4-1,SIZE/30,SIZE/30); g.drawRect(0,SIZE-SIZE/4+SIZE/30-1,SIZE/30,SIZE/4-SIZE/30); g.translate(-SIZE/4+SIZE/30,0); g.setColor(Color.cyan); g.drawRect(SIZE/30,SIZE-SIZE/4+SIZE/30-1,SIZE/4-SIZE/15,SIZE/4-SIZE/15+1); /*viewport frame*/ g.setColor(Color.yellow); g.drawRect(0,SIZE-SIZE/4-1,SIZE/4,SIZE/4); g.setColor(Color.cyan); int p1=(int)((P1.x-SIZE/8-SIZE/2)/20); int p2=(int)((P2.x+SIZE/8-SIZE/2)/20); int q1=(int)((P1.init-SIZE/8-SIZE/2)/20); int q2=(int)((P2.init+SIZE/8-SIZE/2)/20); if(HIDE5==0) g.drawOval(SIZE/8+p1-1,SIZE-SIZE/8+p2-1,2,2); if(HIDE1==0) g.drawOval(SIZE/8+p1-1,SIZE-SIZE/60-1,2,2); if(HIDE2==0) g.drawOval(SIZE/60-1,SIZE-SIZE/8+p2-1,2,2); g.setColor(Color.yellow); if (HIDE5==0) g.drawOval(SIZE/8+q1-2,SIZE-SIZE/8-q2-2,4,4); if(HIDE1==0) g.drawOval(SIZE/8+q1-2,SIZE-SIZE/60-2,4,4); if(HIDE2==0) g.drawOval(SIZE/60-2,SIZE-SIZE/8+q2-2,4,4); /*little windows in viewport*/ g.setColor(Color.cyan); g.translate(-MOVE1/20,-MOVE2/20); if(HIDE5==0) g.drawRect(SIZE/8-SIZE/50,SIZE-SIZE/8-SIZE/50,SIZE/25,SIZE/25); g.translate(MOVE1/20,MOVE2/20); g.translate(-MOVE1/20,0); if(HIDE1==0) g.drawRect(SIZE/8-SIZE/50,SIZE-SIZE/120-SIZE/60,SIZE/25,SIZE/60); g.translate(MOVE1/20,0); g.translate(0,-MOVE2/20); if(HIDE2==0) g.drawRect(SIZE/120,SIZE-SIZE/8-SIZE/50,SIZE/60,SIZE/25); g.translate(0,MOVE2/20); /*grid*/ if(HIDE4==0) { g.clipRect(SIZE/4+2,2,SIZE-SIZE/4-4,SIZE-SIZE/4-4); g.setColor(new Color(0,0,70)); double s=P1.s; g.translate(MOVE1,MOVE2); double big=(sq2+1)/2; double sma=(sq2-1)/2; g.setColor(Color.yellow); if(direction==2) { g.drawLine((int)(P1.x),(int)(P2.x),(int)(P1.x+big*s),(int)(P2.x-sma*s)); g.drawLine((int)(P1.x+big*s),(int)(P2.x-sma*s),(int)(P1.x+big*s-6),(int)(P2.x-sma*s-4)); g.drawLine((int)(P1.x+big*s),(int)(P2.x-sma*s),(int)(P1.x+big*s-4),(int)(P2.x-sma*s+6)); } if(direction==1) { g.drawLine((int)(P1.x),(int)(P2.x),(int)(P1.x-big*s),(int)(P2.x+sma*s)); g.drawLine((int)(P1.x-big*s),(int)(P2.x+sma*s),(int)(P1.x-big*s+6),(int)(P2.x+sma*s+4)); g.drawLine((int)(P1.x-big*s),(int)(P2.x+sma*s),(int)(P1.x-big*s+4),(int)(P2.x+sma*s-6)); } if(direction==4) { g.drawLine((int)(P1.x),(int)(P2.x),(int)(P1.x+sma*s),(int)(P2.x-big*s)); g.drawLine((int)(P1.x+sma*s),(int)(P2.x-big*s),(int)(P1.x+sma*s+4),(int)(P2.x-big*s+6)); g.drawLine((int)(P1.x+sma*s),(int)(P2.x-big*s),(int)(P1.x+sma*s-6),(int)(P2.x-big*s+4)); } if(direction==3) { g.drawLine((int)(P1.x),(int)(P2.x),(int)(P1.x-sma*s),(int)(P2.x+big*s)); g.drawLine((int)(P1.x-sma*s),(int)(P2.x+big*s),(int)(P1.x-sma*s-4),(int)(P2.x+big*s-6)); g.drawLine((int)(P1.x-sma*s),(int)(P2.x+big*s),(int)(P1.x-sma*s+6),(int)(P2.x+big*s-4)); } sma=sma*2; big=big*2; int xx=0; int yy=0; int test=0; g.setColor(Color.cyan); g.fillOval(SIZE/2+SIZE/8-8,SIZE/2-SIZE/8-8,16,16); g.setColor(Color.blue); g.fillOval((int)(P1.x-5),(int)(P2.x-5),10,10); g.setColor(Color.cyan); g.drawOval((int)(P1.x-5),(int)(P2.x-5),10,10); g.setColor(Color.cyan); for(int i=-15;i<=15;++i) { for(int j=-15;j<=15;++j) { test=i+j; test=0; test=test-2*(test/2); if(test==0) { xx= (int)(SIZE/2+SIZE/8+i*+sma*s+big*j*s); yy= (int)(SIZE/2-SIZE/8+i*-big*s-sma*j*s); g.drawOval(xx-8,yy-8,16,16); } } } g.translate(-MOVE1,-MOVE2); } } public void mouseDragged(MouseEvent e) {} public void mouseClicked(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mousePressed(MouseEvent e) { Point p=new Point(); e.consume(); p.x=e.getX(); p.y=e.getY(); SHADOW1=0; SHADOW2=0; int test=0; double sq2=Math.sqrt(2); double bg=sq2+1; double sm=sq2-1; /*determination of point*/ if((p.x>SIZE/4)&&(p.y>SIZE-SIZE/4)) test=9; if((p.xSIZE/4)&&(p.y=SIZE/2+SIZE/8-SIZE/15)&&(p.x<=SIZE/2+SIZE/8-SIZE/30)&&(p.y>=SIZE-SIZE/30)) test=1; if((p.x>=SIZE/2+SIZE/8-SIZE/30)&&(p.x<=SIZE/2+SIZE/8)&&(p.y>=SIZE-SIZE/30)) test=5; if((p.x>=SIZE/2+SIZE/8)&&(p.x<=SIZE/2+SIZE/8+SIZE/30)&&(p.y>=SIZE-SIZE/30)) test=6; if((p.x>=SIZE/2+SIZE/8+SIZE/30)&&(p.x<=SIZE/2+SIZE/8+SIZE/15)&&(p.y>=SIZE-SIZE/30)) test=2; if((p.x<=SIZE/30)&&(p.y>=SIZE/2-SIZE/8-SIZE/15)&&(p.y<=SIZE/2-SIZE/8-SIZE/30)) test=3; if((p.x<=SIZE/30)&&(p.y>=SIZE/2-SIZE/8-SIZE/30)&&(p.y<=SIZE/2-SIZE/8)) test=7; if((p.x<=SIZE/30)&&(p.y>=SIZE/2-SIZE/8)&&(p.y<=SIZE/2-SIZE/8+SIZE/30)) test=8; if((p.x<=SIZE/30)&&(p.y>=SIZE/2-SIZE/8+SIZE/30)&&(p.y<=SIZE/2-SIZE/8+SIZE/15)) test=4; if(HIDE1==1) { if((p.x>SIZE/4)&&(p.y>SIZE-SIZE/4)) test=9; } if(HIDE2==1) { if((p.xSIZE-SIZE/30)) test=12; if((p.xSIZE/4-SIZE/30)&&(p.ySIZE-SIZE/4)) test=13; if((p.xSIZE-SIZE/4)) test=14; if((p.xSIZE/4-SIZE/30)&&(p.y>SIZE-SIZE/30)) test=15; if((p.x>SIZE/30)&&(p.xSIZE-SIZE/4+SIZE/30)) test=16; if((p.xSIZE-SIZE/4+SIZE/30)) test=17; if((p.x>SIZE/30)&&(p.xSIZE-SIZE/30)) test=18; if((p.x>SIZE/30)&&(p.x<=SIZE/4-SIZE/30)&&(p.y>SIZE-SIZE/4)&&(p.y<=SIZE-SIZE/4+SIZE/30)) test=14; if((p.x>SIZE/4-SIZE/30)&&(p.x<=SIZE/4)&&(p.y<=SIZE-SIZE/30)&&(p.y>SIZE-SIZE/4+SIZE/30)) test=15; if(test==1) { P1=P1.stepp(-1,-1); P2=P2.stepp(-1,-1); } if(test==2) { P1=P1.stepp(1,1); P2=P2.stepp(1,1); } if(test==3) { P1=P1.stepp(-1,1); P2=P2.stepp(-1,1); } if(test==4) { P1=P1.stepp(1,-1); P2=P2.stepp(1,-1); } if(test==5) { P1=P1.stepp(1,-1); P2=P2.stepp(1,-1); } if(test==6) { P1=P1.stepp(-1,1); P2=P2.stepp(-1,1); } if(test==7) { P2=P2.stepp(1,1); P1=P1.stepp(1,1); } if(test==8) { P2=P2.stepp(-1,-1); P1=P1.stepp(-1,-1); } if(test==9) {HIDE1=1-HIDE1;} if(test==10) {HIDE2=1-HIDE2;} if(test==11) {HIDE4=1-HIDE4;} if(test==12) { P1.x=P1.init; P2.x=P2.init; P1.a=0; P1.b=0; P2.a=0; P2.b=0; MOVE1=0; MOVE2=0; } int random=0; if(test==13) { P1.a=0;P1.b=0; P2.a=0; P2.b=0; MOVE1=0; MOVE2=0; double b=Math.random(); b=(b+1)/2; random=P1.random_integer(); while(P1.a*P1.a+2*P1.b*P1.b<500*b) { random=P1.random_integer(); if(random==1) { P1=P1.stepp(-1,-1); P2=P2.stepp(-1,-1); } if(random==2) { P1=P1.stepp(1,1); P2=P2.stepp(1,1); } if(random==3) { P1=P1.stepp(-1,1); P2=P2.stepp(-1,1); } if(random==4) { P1=P1.stepp(1,-1); P2=P2.stepp(1,-1); } } } Point q= new Point(); q.x=p.x; q.y=p.y; if(test==14) HIDE5=1-HIDE5; if(test==15) HIDE5=1-HIDE5; if((test==16)&&(HIDE5==0)) { if(q.xSIZE/4-SIZE/30-SIZE/40) q.x=SIZE/4-SIZE/30-SIZE/40; if(q.y>SIZE-SIZE/30-SIZE/40) q.y=SIZE-SIZE/30-SIZE/40; if(q.ySIZE-SIZE/30-SIZE/40) q.y=SIZE-SIZE/30-SIZE/40; if(q.ySIZE/4-SIZE/30-SIZE/40) q.x=SIZE/4-SIZE/30-SIZE/40; MOVE1=20*(-q.x+SIZE/8); } repaint(0,0,SIZE,SIZE); } public void mouseExited(MouseEvent e) { SHADOW1=0; SHADOW2=0; X.S[1]=""; X.S[2]="no function"; X.S[3]=""; history=0; direction=0; repaint(); X.repaint(5,500,260,100); } /************************************/ /************************************/ /************************************/ /************************************/ public void mouseMoved(MouseEvent e) { Point p=new Point(); e.consume(); p.x=e.getX(); p.y=e.getY(); double sq2=Math.sqrt(2); double bg=sq2+1; double sm=sq2-1; int test=0; /*determination of point*/ if((p.x>SIZE/4)&&(p.y>SIZE-SIZE/4)) test=9; if((p.x<=SIZE/4)&&(p.y<=SIZE-SIZE/4)) test=10; if((p.x>SIZE/4)&&(p.y<=SIZE-SIZE/4)) test=11; if((p.x>=SIZE/2+SIZE/8-SIZE/15)&&(p.x<=SIZE/2+SIZE/8-SIZE/30)&&(p.y>=SIZE-SIZE/30)) test=1; if((p.x>=SIZE/2+SIZE/8-SIZE/30)&&(p.x<=SIZE/2+SIZE/8)&&(p.y>=SIZE-SIZE/30)) test=5; if((p.x>=SIZE/2+SIZE/8)&&(p.x<=SIZE/2+SIZE/8+SIZE/30)&&(p.y>=SIZE-SIZE/30)) test=6; if((p.x>=SIZE/2+SIZE/8+SIZE/30)&&(p.x<=SIZE/2+SIZE/8+SIZE/15)&&(p.y>=SIZE-SIZE/30)) test=2; if((p.x<=SIZE/30)&&(p.y>=SIZE/2-SIZE/8-SIZE/15)&&(p.y<=SIZE/2-SIZE/8-SIZE/30)) test=3; if((p.x<=SIZE/30)&&(p.y>=SIZE/2-SIZE/8-SIZE/30)&&(p.y<=SIZE/2-SIZE/8)) test=7; if((p.x<=SIZE/30)&&(p.y>=SIZE/2-SIZE/8)&&(p.y<=SIZE/2-SIZE/8+SIZE/30)) test=8; if((p.x<=SIZE/30)&&(p.y>=SIZE/2-SIZE/8+SIZE/30)&&(p.y<=SIZE/2-SIZE/8+SIZE/15)) test=4; if(HIDE1==1) { if((p.x>SIZE/4)&&(p.y>SIZE-SIZE/4)) test=9; } if(HIDE2==1) { if((p.xSIZE-SIZE/30)) test=12; if((p.x<=SIZE/4)&&(p.x>SIZE/4-SIZE/30)&&(p.y<=SIZE-SIZE/4+SIZE/30)&&(p.y>SIZE-SIZE/4)) test=13; if((p.x<=SIZE/30)&&(p.y<=SIZE-SIZE/4+SIZE/30)&&(p.y>SIZE-SIZE/4)) test=14; if((p.x<=SIZE/4)&&(p.x>SIZE/4-SIZE/30)&&(p.y>SIZE-SIZE/30)) test=15; if((p.x>SIZE/30)&&(p.x<=SIZE/4-SIZE/30)&&(p.y<=SIZE-SIZE/30)&&(p.y>SIZE-SIZE/4+SIZE/30)) test=16; if((p.x<=SIZE/30)&&(p.y<=SIZE-SIZE/30)&&(p.y>SIZE-SIZE/4+SIZE/30)) test=17; if((p.x>SIZE/30)&&(p.x<=SIZE/4-SIZE/30)&&(p.y>SIZE-SIZE/30)) test=18; if((p.xSIZE-SIZE/4)&&(p.ySIZE/4-SIZE/30)&&(p.xSIZE-SIZE/4+SIZE/30)) test=15; direction=0; int s1=(int)(P1.x-sq2*P1.s+MOVE1); int s2=(int)(P2.x-sq2*P2.s+MOVE2); int s3=(int)(2*sq2*P1.s); /*list of functions*/ if((test==1)&&(history!=1)) { X.S[1]="move this piece sqrt(2)+1 units left"; X.S[2]="and"; X.S[3]="the other piece sqrt(2)-1 units down."; if(HIDE2+HIDE3>0) {X.S[2]="";X.S[3]=X.S[2];} X.repaint(5,500,260,100); direction=1; SHADOW1=-1-sq2; SHADOW2=-1+sq2; repaint(); repaint(); history=1; } if((test==2)&&(history!=2)) { X.S[1]="move this piece sqrt(2)+1 units right"; X.S[2]="and"; X.S[3]="the other piece sqrt(2)-1 units up."; if(HIDE2+HIDE3>0) {X.S[2]="";X.S[3]=X.S[2];} X.repaint(5,500,260,100); direction=2; repaint(); SHADOW1=1+sq2; SHADOW2=1-sq2; history=2; } if((test==3)&&(history!=3)) { X.S[1]="move this piece sqrt(2)+1 units up"; X.S[2]="and"; X.S[3]="the other piece sqrt(2)-1 units right."; if(HIDE1+HIDE4>0) {X.S[2]="";X.S[3]=X.S[2];} direction=4; SHADOW2=-1-sq2; SHADOW1=-1+sq2; repaint(0); X.repaint(5,500,260,100); history=3; } if((test==4)&&(history!=4)) { X.S[1]="move this piece sqrt(2)+1 units down"; X.S[2]="and"; X.S[3]="the other piece sqrt(2)-1 units left."; if(HIDE1+HIDE4>0) {X.S[2]="";X.S[3]=X.S[2];} X.repaint(5,500,260,100); direction=3; SHADOW2=1+sq2; SHADOW1=1-sq2; repaint(); history=4; } if((test==5)&&(history!=5)) { X.S[1]="move this piece sqrt(2)-1 units left"; X.S[2]="and"; X.S[3]="the other piece sqrt(2)+1 units down."; if(HIDE2+HIDE3>0) {X.S[2]="";X.S[3]=X.S[2];} X.repaint(5,500,260,100); direction=3; SHADOW1=1-sq2; SHADOW2=1+sq2; repaint(); history=5; } if((test==6)&&(history!=6)) { X.S[1]="move this piece sqrt(2)-1 units right"; X.S[2]="and"; X.S[3]="the other piece sqrt(2)+1 units up."; if(HIDE2+HIDE3>0) {X.S[2]="";X.S[3]=X.S[2];} X.repaint(5,500,260,100); direction=4; SHADOW1=-1+sq2; SHADOW2=-1-sq2; repaint(); history=6; } if((test==7)&&(history!=7)) { X.S[1]="move this piece sqrt(2)-1 units up"; X.S[2]="and"; X.S[3]="the other piece sqrt(2)+1 units right."; X.repaint(5,500,260,100); if(HIDE1+HIDE4>0) {X.S[2]="";X.S[3]=X.S[2];} direction=2; SHADOW2=1-sq2; SHADOW1=1+sq2; repaint(); history=7; } if((test==8)&&(history!=8)) { X.S[1]="move this piece sqrt(2)-1 units down"; X.S[2]="and"; X.S[3]="the other piece sqrt(2)+1 units left."; if(HIDE1+HIDE4>0) {X.S[2]="";X.S[3]=X.S[2];} X.repaint(5,500,260,100); direction=1; SHADOW2=sq2-1; SHADOW1=-sq2-1; repaint(); history=8; } if(test>8) {SHADOW1=0;SHADOW2=0;} if(test<1) {SHADOW1=0;SHADOW2=0;} if((test==9)&&(history!=9)) { X.S[1]="playing board: Click to hide/uncover"; X.S[2]="The solid kayak is the piece; the faint"; X.S[3]= "kayak the shadow; the moon is the goal."; X.repaint(5,500,260,100); if((history<=8)&&(history>=1)) repaint();; history=9; } if((test==10)&&(history!=10)) { X.S[1]="playing board: Click to hide/uncover"; X.S[2]="The solid kayak is the piece; the faint"; X.S[3]= "kayak the shadow; the moon is the goal."; X.repaint(5,500,260,100); if((history<=8)&&(history>=1)) repaint();; history=10; } if((test==11)&&(history!=11)) { X.S[1]="central grid: Click to hide/uncover."; X.S[2]="Projecting the grid onto the x and y axes"; X.S[3]="gives the set of allowable piece positions."; X.repaint(5,500,260,100); if((history<=8)&&(history>=1)) repaint();; history=11; } if((test==12)&&(history!=12)) { X.S[1]=""; X.S[2]="reset button"; X.S[3]=""; X.repaint(5,500,260,100); if((history<=8)&&(history>=1)) repaint();; history=12; } if((test==13)&&(history!=13)) { X.S[1]="click on this button to move to"; X.S[2]="a randomly chosen position on the"; X.S[3]="playing board"; X.repaint(5,500,260,100); if((history<=8)&&(history>=1)) repaint();; history=13; } if((test==14)&&(history!=14)) { X.S[1]="hide/uncover central viewport"; X.S[2]=""; X.S[3]=""; X.repaint(5,500,260,100); if((history<=8)&&(history>=1)) repaint();; history=14; } if((test==15)&&(history!=15)) { X.S[1]="hide/uncover central viewport"; X.S[2]=""; X.S[3]=""; X.repaint(5,500,260,100); if((history<=8)&&(history>=1)) repaint();; history=15; } if((test==16)&&(history!=16)) { X.S[1]="this is the viewport for the central grid."; X.S[2]="Click in this area to recenter"; X.S[3]="the playing board"; X.repaint(5,500,260,100); if((history<=8)&&(history>=1)) repaint();; history=16; } if((test==17)&&(history!=17)) { X.S[1]="this is the viewport for the upper left"; X.S[2]="playing board. Click in this area to"; X.S[3]="recenter the playing board"; X.repaint(5,500,260,100); if((history<=8)&&(history>=1)) repaint();; history=17; } if((test==18)&&(history!=18)) { X.S[1]="this is the viewport for the lower right"; X.S[2]="playing board. Click in this area to"; X.S[3]="recenter the playing board"; X.repaint(5,500,260,100); if((history<=8)&&(history>=1)) repaint();; history=18; } if((test==0)&&(history!=0)) { X.S[1]=""; X.S[2]="no function"; X.S[3]=""; X.repaint(5,500,260,100); history=0; } } public void mouseReleased(MouseEvent e) { Point p=new Point(); e.consume(); p.x=e.getX(); p.y=e.getY(); double sq2=Math.sqrt(2); double bg=sq2+1; double sm=sq2-1; int test=0; /*determination of point*/ if((p.x>SIZE/4)&&(p.y>SIZE-SIZE/4)) test=9; if((p.x=SIZE/2+SIZE/8-SIZE/15)&&(p.x<=SIZE/2+SIZE/8-SIZE/30)&&(p.y>=SIZE-SIZE/30)) test=1; if((p.x>=SIZE/2+SIZE/8-SIZE/30)&&(p.x<=SIZE/2+SIZE/8)&&(p.y>=SIZE-SIZE/30)) test=5; if((p.x>=SIZE/2+SIZE/8)&&(p.x<=SIZE/2+SIZE/8+SIZE/30)&&(p.y>=SIZE-SIZE/30)) test=6; if((p.x>=SIZE/2+SIZE/8+SIZE/30)&&(p.x<=SIZE/2+SIZE/8+SIZE/15)&&(p.y>=SIZE-SIZE/30)) test=2; if((p.x<=SIZE/30)&&(p.y>=SIZE/2-SIZE/8-SIZE/15)&&(p.y<=SIZE/2-SIZE/8-SIZE/30)) test=3; if((p.x<=SIZE/30)&&(p.y>=SIZE/2-SIZE/8-SIZE/30)&&(p.y<=SIZE/2-SIZE/8)) test=7; if((p.x<=SIZE/30)&&(p.y>=SIZE/2-SIZE/8)&&(p.y<=SIZE/2-SIZE/8+SIZE/30)) test=8; if((p.x<=SIZE/30)&&(p.y>=SIZE/2-SIZE/8+SIZE/30)&&(p.y<=SIZE/2-SIZE/8+SIZE/15)) test=4; if((p.x>SIZE/4)&&(p.ySIZE/4)&&(p.y>SIZE-SIZE/4)) test=0; } if(HIDE2==1) { if((p.xSIZE-SIZE/30)) test=12; if((p.xSIZE/4-SIZE/30)&&(p.ySIZE-SIZE/4)) test=13; if((p.xSIZE-SIZE/4)) test=14; if((p.xSIZE/4-SIZE/30)&&(p.y>SIZE-SIZE/30)) test=15; if((p.x>SIZE/30)&&(p.xSIZE-SIZE/4+SIZE/30)) test=16; if((p.xSIZE-SIZE/4+SIZE/30)) test=17; if((p.x>SIZE/30)&&(p.xSIZE-SIZE/30)) test=18; if((p.xSIZE-SIZE/4)&&(p.ySIZE/4-SIZE/30)&&(p.xSIZE-SIZE/4+SIZE/30)) test=15; direction=0; int s1=(int)(P1.x-sq2*P1.s+MOVE1); int s2=(int)(P2.x-sq2*P2.s+MOVE2); int s3=(int)(2*sq2*P1.s); history=0; if(test>8) {SHADOW1=0;SHADOW2=0;} if(test<1) {SHADOW1=0;SHADOW2=0;} /*list of functions*/ if((test==1)&&(history!=1)) { X.S[1]="move this piece sqrt(2)+1 units left"; X.S[2]="and"; X.S[3]="the other piece sqrt(2)-1 units down."; if(HIDE2+HIDE3>0) {X.S[2]="";X.S[3]=X.S[2];} X.repaint(5,500,260,100); direction=1; SHADOW1=-1-sq2; SHADOW2=-1+sq2; repaint(); repaint(); history=1; } if((test==2)&&(history!=2)) { X.S[1]="move this piece sqrt(2)+1 units right"; X.S[2]="and"; X.S[3]="the other piece sqrt(2)-1 units up."; if(HIDE2+HIDE3>0) {X.S[2]="";X.S[3]=X.S[2];} X.repaint(5,500,260,100); direction=2; repaint(); SHADOW1=1+sq2; SHADOW2=1-sq2; history=2; } if((test==3)&&(history!=3)) { X.S[1]="move this piece sqrt(2)+1 units up"; X.S[2]="and"; X.S[3]="the other piece sqrt(2)-1 units right."; if(HIDE1+HIDE4>0) {X.S[2]="";X.S[3]=X.S[2];} direction=4; SHADOW2=-1-sq2; SHADOW1=-1+sq2; repaint(0); X.repaint(5,500,260,100); history=3; } if((test==4)&&(history!=4)) { X.S[1]="move this piece sqrt(2)+1 units down"; X.S[2]="and"; X.S[3]="the other piece sqrt(2)-1 units left."; if(HIDE1+HIDE4>0) {X.S[2]="";X.S[3]=X.S[2];} X.repaint(5,500,260,100); direction=3; SHADOW2=1+sq2; SHADOW1=1-sq2; repaint(); history=4; } if((test==5)&&(history!=5)) { X.S[1]="move this piece sqrt(2)-1 units left"; X.S[2]="and"; X.S[3]="the other piece sqrt(2)+1 units down."; if(HIDE2+HIDE3>0) {X.S[2]="";X.S[3]=X.S[2];} X.repaint(5,500,260,100); direction=3; SHADOW1=1-sq2; SHADOW2=1+sq2; repaint(); history=5; } if((test==6)&&(history!=6)) { X.S[1]="move this piece sqrt(2)-1 units right"; X.S[2]="and"; X.S[3]="the other piece sqrt(2)+1 units up."; if(HIDE2+HIDE3>0) {X.S[2]="";X.S[3]=X.S[2];} X.repaint(5,500,260,100); direction=4; SHADOW1=-1+sq2; SHADOW2=-1-sq2; repaint(); history=6; } if((test==7)&&(history!=7)) { X.S[1]="move this piece sqrt(2)-1 units up"; X.S[2]="and"; X.S[3]="the other piece sqrt(2)+1 units right."; X.repaint(5,500,260,100); if(HIDE1+HIDE4>0) {X.S[2]="";X.S[3]=X.S[2];} direction=2; SHADOW2=1-sq2; SHADOW1=1+sq2; repaint(); history=7; } if((test==8)&&(history!=8)) { X.S[1]="move this piece sqrt(2)-1 units down"; X.S[2]="and"; X.S[3]="the other piece sqrt(2)+1 units left."; if(HIDE1+HIDE4>0) {X.S[2]="";X.S[3]=X.S[2];} X.repaint(5,500,260,100); direction=1; SHADOW2=sq2-1; SHADOW1=-sq2-1; repaint(); history=8; } } } class LineFlip { double x; double s; double init; int a,b; int k; LineFlip(int k,double x,double init,double s) { this.k=k; this.x=x; this.s=s; this.a=0;this.b=0; this.init=init; } double update(int k,int Z) { double dd=0; if(k==1) dd=Z/2+Z/8+a*s+b*s*Math.sqrt(2.0); if(k==2) dd=Z/2-Z/8+a*s-b*s*Math.sqrt(2.0); return(dd); } void render(Graphics g,int SIZE,double t) { if(k==1) { double sq2=Math.sqrt(2.0); double bg=sq2+1; double sm=sq2-1; g.translate(0,-SIZE/8); x=SIZE/2+SIZE/8+a*s+b*s*Math.sqrt(2.0); g.setColor(new Color(0,0,150)); g.fillRect((int)(x-sm*s),SIZE-5-SIZE/40,(int)(sm*s+1),SIZE/40); g.setColor(Color.cyan); g.drawRect((int)(x-sm*s),SIZE-5-SIZE/40,(int)(sm*s+1),SIZE/40); g.setColor(Color.blue); g.fillRect((int)(x),SIZE-5-SIZE/40,(int)(sm*s),SIZE/40); g.setColor(Color.cyan); g.drawRect((int)(x),SIZE-5-SIZE/40,(int)(sm*s),SIZE/40); g.setColor(Color.blue); int[] ypoints1={SIZE-5,SIZE-5-SIZE/80,SIZE-5-SIZE/40}; int[] xpoints1={(int)(x-sm*s),(int)(x-bg*s),(int)(x-sm*s)}; g.fillPolygon(xpoints1,ypoints1,3); g.setColor(Color.cyan); g.drawPolygon(xpoints1,ypoints1,3); g.setColor(new Color(0,0,150)); int[] ypoints2={SIZE-5,SIZE-5-SIZE/80,SIZE-5-SIZE/40}; int[] xpoints2={(int)(x+sm*s),(int)(x+bg*s),(int)(x+sm*s)}; g.fillPolygon(xpoints2,ypoints2,3); g.setColor(Color.cyan); g.drawPolygon(xpoints2,ypoints2,3); g.setColor(Color.cyan); g.drawLine((int)(x),SIZE-5,(int)(x),SIZE-5-SIZE/20); g.setColor(Color.blue); g.fillOval((int)(x-5),SIZE-SIZE/20-10,10,10); g.setColor(Color.cyan); g.drawOval((int)(x-5),SIZE-SIZE/20-10,10,10); g.setColor(Color.blue); g.translate(0,SIZE/8); /*the shadow*/ g.translate((int)(s*t),-SIZE/8+SIZE/40+10); g.setColor(Color.blue); g.drawRect((int)(x-sm*s),SIZE-5-SIZE/40,(int)(sm*s+1),SIZE/40); g.drawRect((int)(x),SIZE-5-SIZE/40,(int)(sm*s),SIZE/40); g.drawPolygon(xpoints1,ypoints1,3); g.drawPolygon(xpoints2,ypoints2,3); g.drawLine((int)(x),SIZE+SIZE/40,(int)(x),SIZE+SIZE/40-SIZE/20); g.setColor(Color.black); g.fillOval((int)(x-5),SIZE+SIZE/40-10,10,10); g.setColor(Color.cyan); g.drawOval((int)(x-5),SIZE+SIZE/40-10,10,10); g.translate(-(int)(s*t),SIZE/8-SIZE/40-10); } if(k==2) { double sq2=Math.sqrt(2.0); double bg=sq2+1; double sm=sq2-1; x=SIZE/2-SIZE/8+a*s-b*s*Math.sqrt(2.0); g.translate(SIZE/8,0); g.setColor(new Color(0,0,150)); g.fillRect(5,(int)(x-sm*s),(int)(SIZE/40),(int)(sm*s)+1); g.setColor(Color.cyan); g.drawRect(5,(int)(x-sm*s),(int)(SIZE/40),(int)(sm*s)+1); g.setColor(Color.blue); g.fillRect(5,(int)(x),(int)(SIZE/40),(int)(sm*s)+1); g.setColor(Color.cyan); g.drawRect(5,(int)(x),(int)(SIZE/40),(int)(sm*s)+1); int[] xpoints3={5,5+SIZE/80,5+SIZE/40}; int[] ypoints3={(int)(x-sm*s),(int)(x-bg*s),(int)(x-sm*s)}; g.setColor(Color.blue); g.fillPolygon(xpoints3,ypoints3,3); g.setColor(Color.cyan); g.drawPolygon(xpoints3,ypoints3,3); int[] xpoints4={5,5+SIZE/80,5+SIZE/40}; int[] ypoints4={(int)(x+sm*s+1),(int)(x+bg*s),(int)(x+sm*s+1)}; g.setColor(new Color(0,0,150)); g.fillPolygon(xpoints4,ypoints4,3); g.setColor(Color.cyan); g.drawPolygon(xpoints4,ypoints4,3); g.setColor(Color.cyan); g.drawLine(5,(int)(x),(int)(5+SIZE/20),(int)(x)); g.setColor(Color.blue); g.fillOval(SIZE/20,(int)(x-5),10,10); g.setColor(Color.cyan); g.drawOval(SIZE/20,(int)(x-5),10,10); g.translate(-SIZE/8,0); /*the shadow*/ g.translate(SIZE/8-SIZE/40-10,(int)(s*t)); g.setColor(Color.blue); g.drawRect(5,(int)(x-sm*s),(int)(SIZE/40),(int)(sm*s)+1); g.drawRect(5,(int)(x),(int)(SIZE/40),(int)(sm*s)+1); g.drawPolygon(xpoints3,ypoints3,3); g.drawPolygon(xpoints4,ypoints4,3); g.drawLine(-SIZE/40,(int)(x),(int)(SIZE/20-SIZE/40),(int)(x)); g.setColor(Color.black); g.fillOval(-SIZE/40,(int)(x-5),10,10); g.setColor(Color.cyan); g.drawOval(-SIZE/40,(int)(x-5),10,10); g.translate(-SIZE/8+SIZE/40+10,-(int)(s*t)); } } LineFlip step(double d) { LineFlip Y=this; Y.x=x+d*s; return(Y); } LineFlip stepp(int i,int j) { LineFlip Y=this; Y.a=a+i; Y.b=b+j; return(Y); } int random_integer() { int m=0; double ran; ran=Math.random(); ran=4.0*ran; m=1+(int)(Math.floor(ran)); return(m); } } class Complex { double x,y; Complex() { this.x=x; this.y=y; } } class ListenTriangle { double x1,x2,x3; double y1,y2,y3; Color C; ListenTriangle() { this.x1=x1; this.x2=x2; this.x3=x3; this.y1=y1; this.y2=y2; this.y3=y3; this.C=C; } int inside(Point p) { double v1x,v1y,v2x,v2y; double A1,A2,A3; int val; v1x=p.x-this.x1; v1y=p.y-this.y1; v2x=p.x-this.x2; v2y=p.y-this.y2; A3=v1x*v2y-v1y*v2x; v1x=p.x-this.x2; v1y=p.y-this.y2; v2x=p.x-this.x3; v2y=p.y-this.y3; A1=v1x*v2y-v1y*v2x; v1x=p.x-this.x3; v1y=p.y-this.y3; v2x=p.x-this.x1; v2y=p.y-this.y1; A2=v1x*v2y-v1y*v2x; val=0; if((A1<0)&&(A2<0)&&(A3<0)) val=1; if((A1>0)&&(A2>0)&&(A3>0)) val=1; return(val); } void render(Graphics g,Color C1,Color C2) { int x[]={(int)(x1),(int)(x2),(int)(x3)}; int y[]={(int)(y1),(int)(y2),(int)(y3)}; g.setColor(C1); g.fillPolygon(x,y,3); g.setColor(C2); g.drawPolygon(x,y,3); } }