// StringFlying.java // Draw String Image and Free Running // by nagatani@eken.phys.nagoya-u.ac.jp import java.applet.Applet; import java.awt.*; public class StringFlying implements SGObject { int xWindow, yWindow; public Image imageString; int xImage, yImage; double xR, yR, xP, yP, xW, yW; boolean bFirstUse = true; int nMode; double t; StringFlying (Image imageString, Applet applet) { this.imageString = imageString; this.xWindow = applet.size().width; this.yWindow = applet.size().height; int xImage = 50, yImage = 50; // Default Image Size for (int n = 0 ; n < 10 ; n++) { int x = imageString.getWidth (applet), y = imageString.getHeight (applet); if (x > 0 && y > 0 ) { xImage = x; yImage = y; break; } try { Thread.sleep (10); // 10 ms Delay Time } catch (InterruptedException e) {} } this.xImage = xImage; this.yImage = yImage; nMode = 0; } public void paint (Graphics g, Applet applet) { if (nMode == 1 && t != 0.0) { g.drawImage (imageString, (int) xP, (int) yP, (int) xW, (int) yW, applet); // g.setColor (Color.white); // g.drawRect ((int) xP, (int) yP, // (int) xW, (int) yW); } } public void move () { if (nMode == 0) { // Reset & Initializing Mode double theta = Math.random () * 2.0 * Math.PI; xR = 1.5 * xWindow/2 * Math.cos (theta); yR = 1.5 * yWindow/2 * Math.sin (theta); if (bFirstUse) t = Math.random (); else t = 0.0; bFirstUse = false; nMode ++; return; } if (nMode == 1) { // Displaying Mode double T = t*t*t; xW = T * xImage * 1.5; yW = T * yImage * 1.5; double xCenter = xWindow/2 + T * xR, yCenter = yWindow/2 + T * yR; xP = xCenter - xW / 2; yP = yCenter - yW / 2; t += 0.01; if (t >= 1.0) { t = 0.0; nMode ++; } return; } if (nMode == 2) { // Sleeping Mode t += 0.01; if (t >= 0.0) { t = 0.0; nMode = 0; } return; } } }