// esite.java - from bodytag.org's esite import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.awt.image.DirectColorModel; import java.awt.image.MemoryImageSource; import java.io.PrintStream; public class esite extends Applet implements Runnable, MouseListener, MouseMotionListener { DirectColorModel _dcm; MemoryImageSource _mis; Image _img; int _pxl []; particle _part []; int _sprCol, _nPart, _nCyc, _rV, _gV; int _w, _h, _wh, _cX, _cY, _bgCol; Thread _thr; public void addPxl (int p, int j) { char c = '\374'; int r0 = _pxl [p] & 0xFF0000; int g0 = _pxl [p] & 0xFF00; int b0 = _pxl [p] & 0xFF; int r1 = j & 0xFF0000; int g1 = j & 0xFF00; int b1 = j & 0xFF; int r2 = (c * (r0 - r1) >> 8) + r1 & 0xFF0000; int g2 = (c * (g0 - g1) >> 8) + g1 & 0xFF00; int b2 = (c * (b0 - b1) >> 8) + b1 & 0xFF; _pxl [p] = r2 | g2 | b2; } public void drawLn (int x1, int y1, int x2, int y2, int c) { int yD = y2 - y1; int xD = x2 - x1; int i; byte b; if (yD < 0) {yD = -yD; i = -_w;} else {i = _w;} if (xD < 0) {xD = -xD; b = -1;} else {b = 1;} yD <<= 1; xD <<= 1; y1 *= _w; y2 *= _w; addPxl (x1 + y1, c); if (xD > yD) { int d1 = yD - (xD >> 1); while (x1 != x2) { if (d1 >= 0) {y1 += i; d1 -= xD;} x1 += b; d1 += yD; addPxl (x1 + y1, c); } } else { int d2 = xD - (yD >> 1); while (y1 != y2) { if (d2 >= 0) {x1 += b; d2 -= yD;} y1 += i; d2 += xD; addPxl (x1 + y1, c); } } } public int byt (int i) { if (i < 0) i = 0; if (i > 255) i = 255; return i; } public void run () {while (_thr != null) repaint ();} public void start () { if (_thr == null) {_thr = new Thread (); _thr.start ();} } public void stop () {_thr = null;} public void update (Graphics g) { int xMin = _w, yMin = _h, xMax = 0, yMax = 0, i1, p; // _rV += -2..3 limit at -10..10 ditto for _gV _rV += (int)(Math.random () * 5D) - 2; if (_rV > 10) _rV = 10; else if (_rV < -10) _rV = -10; _gV += (int)(Math.random () * 5D) - 2; if (_gV > 10) _gV = 10; else if (_gV < -10) _gV = -10; i1 = byt ((_sprCol >> 16) + _rV); _sprCol = i1 << 16 | i1 << 8 | i1; // _cX += -7..8 limit at 0.._w ditto for _cY _cX += (int)(Math.random () * 15D) - 7; _cY += (int)(Math.random () * 15D) - 7; if (_cX < 0) _cX = 0; if (_cX > _w) _cX = _w; if (_cY < 0) _cY = 0; if (_cY > _h) _cY = _h; for (p = 1; p < _nPart; p++) { // draw part's line int x1 = (int)_part [p].x; int y1 = (int)_part [p].y; int x2 = (int)_part [p].lastx; int y2 = (int)_part [p].lasty; drawLn (x1, y1, x2, y2, _sprCol); // expand bounding rect if (x1 < xMin) xMin = x1; if (x1 > xMax) xMax = x1; if (x2 < xMin) xMin = x2; if (x2 > xMax) xMax = x2; if (y1 < yMin) yMin = y1; if (y1 > yMax) yMax = y1; if (y2 < yMin) yMin = y2; if (y2 > yMax) yMax = y2; // next spot double dx = (double)_cX - _part [p].x; double dy = (double)_cY - _part [p].y; double dl = Math.sqrt (dx * dx + dy * dy) + (double)(p * 3); _part [p].xvel = (_part [p].xvel + dx / dl) * 0.96D; _part [p].yvel = (_part [p].yvel + dy / dl) * 0.96D; _part [p].lastx = _part [p].x; _part [p].lasty = _part [p].y; _part [p].x += _part [p].xvel; _part [p].y += _part [p].yvel; if (_part [p].x > (double)_w) {_part [p].x = _w - 1; _part [p].xvel = 0.0D;} else if (_part [p].x < 0.0D) {_part [p].x = 0.0D; _part [p].xvel = 0.0D;} if (_part [p].y > (double)_h) {_part [p].y = _h - 1; _part [p].yvel = 0.0D;} else if (_part [p].y < 0.0D) {_part [p].y = 0.0D; _part [p].yvel = 0.0D;} } if (_nCyc == 100) { // every 100 updates, dim it ? for (p = 0; p < _wh; p++) { char c = '\365'; char c1 = '\377'; int r0 = _pxl [p] & 0xFF0000; int g0 = _pxl [p] & 0xFF00; int b0 = _pxl [p] & 0xFF; int r1 = 0xFF0000; int g1 = 0xFF00; int r2 = (c * (r0 - r1) >> 8) + r1 & 0xFF0000; int g2 = (c * (g0 - g1) >> 8) + g1 & 0xFF00; int b2 = (c * (b0 - c1) >> 8) + c1 & 0xFF; _pxl [p] = r2 | g2 | b2; } _nCyc = 0; xMin = 0; yMin = 0; xMax = _w; yMax = _h; } _mis.newPixels (xMin, yMin, xMax - xMin, yMax - yMin); g.drawImage (_img, 0, 0, this); _nCyc++; } public void paint (Graphics g) {update (g);} public void mouseDragged (MouseEvent mouseevent) {} public void mouseClicked (MouseEvent mouseevent) {} public void mouseEntered (MouseEvent mouseevent) {} public void mouseExited (MouseEvent mouseevent) {} public void mousePressed (MouseEvent mouseevent) {} public void mouseReleased (MouseEvent mouseevent) {} public void mouseMoved (MouseEvent mouseevent) {} public void init () { _w = getWidth (); _h = getHeight (); _wh = _w * _h; _cX = _w / 2; _cY = _h / 2; _part = new particle [_nPart]; _pxl = new int [_wh]; _dcm = new DirectColorModel (24, 0xFF0000, 0xFF00, 0xFF); _mis = new MemoryImageSource (_w, _h, _dcm, _pxl, 0, _w); _mis.setAnimated (true); _mis.setFullBufferUpdates (false); _img = createImage (_mis); _bgCol = 0xFFFFFF; for (int i = 0; i < _nPart; i++) _part [i] = new particle (0xFFFFFF, i / _w / 2, i % (_h * 5), 0.0D, 0.0D); for (int j = 0; j < _wh; j++) _pxl [j] = _bgCol; _sprCol = _bgCol; addMouseListener (this); addMouseMotionListener (this); } public esite () { _nPart = 200; _nCyc = 0; _rV = 0; _gV = 0; _thr = null; } }