import java.applet.*; import java.awt.*; import java.util.*; public class Direction { public static double anglestep = 0.5; public static double MINANGLE = 10, MAXANGLE = 80; public double angle, tangle; public int phase; public Direction (double a, int p) { setDirection (a, p); } public Direction (double a) { setDirection (a); } public void setDirection (double a, int p) { angle = a; phase = p; tangle = calAngle (); setDirection (tangle); } public void setDirection (double a) { double b; b = a; if (a < 0) b = 360 + a; if (a > 360) b = a % 360; if (b <= 90) { phase = 0; angle = b; } else if (b <= 180) { phase = 1; angle = 180 - b; } else if (b <= 270) { phase = 2; angle = b - 180; } else if (b <= 360) { phase = 3; angle = 360 - b; } tangle = b; } public double calAngle () { double i; int j; switch (phase) { case 0: j = phase; i = angle; break; case 1: j = phase; i = j*180-angle; break; case 2: j = 1; i = j*180+angle; break; case 3: j = 2; i = j*180-angle; break; default: i = 0L; break; } return (i); } public static double getRand (double t) { double r; r = t*2*Math.PI/360; return (r); } public int getnextx (int x, double speed) { int nx; double t; t = Math.cos (getRand(tangle)); nx = x + (int) (speed * t); return (nx); } public int getnexty (int y, double speed) { int ny; double t; t = Math.sin (getRand(tangle)); ny = y + (int) (speed * t); return (ny); } public void calangle (PBall b) { double dis, nangle; double aa, bb; // aa = b.x-b.ox; // bb = b.y-b.oy; aa = b.XValue; bb = b.YValue; dis = Math.sqrt (aa*aa+bb*bb); nangle = 360*Math.acos(aa/dis)/(2*Math.PI); if (bb < 0) nangle = 360 - nangle; b.speed = dis; setDirection (nangle); // b.g.setColor (Color.blue); // b.g.fillRect (5,15,300,15); // b.g.setColor (Color.white); // b.g.drawString ("Angle = "+nangle+", "+dis, 5,25); } public void reflect (PBall b, double base) { double nangle; if (base == 180) nangle = (360 - tangle) % 360; else { nangle = (360 - ((tangle+base)%360) - base) % 360; } setDirection (nangle); } public void checkspeed (PBall b) { double nangle; int nphase; nphase = phase; nangle = tangle; switch (nphase) { case 0: if (nangle+anglestep < MAXANGLE) nangle += anglestep; break; case 1: if (nangle-anglestep < MINANGLE) nangle -= anglestep; break; case 2: nangle -= anglestep; break; case 3: nangle += anglestep; break; } setDirection (nangle); } }