import java.awt.Graphics; import java.awt.image.BufferedImage; import java.util.*; import javax.swing.JFrame; public class BrownianTree extends JFrame implements Runnable { BufferedImage I; private List particles; static Random rand = new Random(); public BrownianTree() { super("Brownian Tree"); setBounds(100, 100, 400, 300); setDefaultCloseOperation(EXIT_ON_CLOSE); I = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB); I.setRGB(I.getWidth() / 2, I.getHeight() / 2, 0xff00); particles = new LinkedList(); } @Override public void paint(Graphics g) { g.drawImage(I, 0, 0, this); } public void run() { for (int i = 0; i < 20000; i++) { particles.add(new Particle()); } while (!particles.isEmpty()) { for (Iterator it = particles.iterator(); it.hasNext();) { if (it.next().move()) { it.remove(); } } repaint(); } } public static void main(String[] args) { BrownianTree b = new BrownianTree(); b.setVisible(true); new Thread(b).start(); } private class Particle { private int x, y; private Particle() { x = rand.nextInt(I.getWidth()); y = rand.nextInt(I.getHeight()); } /* returns true if either out of bounds or collided with tree */ private boolean move() { int dx = rand.nextInt(3) - 1; int dy = rand.nextInt(3) - 1; if ((x + dx < 0) || (y + dy < 0) || (y + dy >= I.getHeight()) || (x + dx >= I.getWidth())) { return true; } x += dx; y += dy; if ((I.getRGB(x, y) & 0xff00) == 0xff00) { I.setRGB(x - dx, y - dy, 0xff00); return true; } return false; } } }