Example #1
0
 /** Prepare ball images with different sizes */
 private void makeBalls() {
   balls = new Image[nBalls];
   byte red[] = new byte[256];
   byte green[] = new byte[256];
   byte blue[] = new byte[256];
   for (int id = 0; id < nBalls; id++) {
     // smaller `b' means closer to black
     // if id == 0 (fartherest from the viewer)
     //        b = 1/(1 + zContrast)
     //        the outer blend() gives a color close to bgGrey
     // if id == nBalls - 1 (closest to the viewer),
     //        b = 1, the outer blend() gives the color of
     //        the inner blend()
     double b = (zContrast * id / (nBalls - 1) + 1) / (zContrast + 1);
     for (int i = maxr; i >= 0; --i) {
       // closeness to the spotlight
       double q = 1 - 1. * i / maxr;
       // dampness of the color along the radius
       double p = 1 - rContrast * i / maxr;
       // contrast of the spotlight
       // if i == 0 (closest to the spotlight),
       //        d = 1.0 - spotlightAmp, the inner
       //        blend() gives a color close to 255
       //        (if spotlightAmp == 1).
       // if i == maxr (fartherest from the spotlight),
       //        d = 1.0, the inner blend() gives
       //        the foreground color, i.e., Rl, Gl, Bl
       // Thus, the inner blend() depends on the distance
       // from the spotlight, i == 0 means to be closest
       // to the spotlight
       double d = 1 - q * spotlightAmp;
       red[i] = (byte) blend(blend(Rl * p, 255, d), 0, b);
       green[i] = (byte) blend(blend(Gl * p, 255, d), 0, b);
       blue[i] = (byte) blend(blend(Bl * p, 255, d), 0, b);
     }
     // 256 color model
     IndexColorModel model = new IndexColorModel(8, maxr + 1, red, green, blue, 0);
     balls[id] = component.createImage(new MemoryImageSource(R * 2, R * 2, model, data, 0, R * 2));
   }
 }