import java.applet.*;import java.awt.*;import java.awt.event.*;import java.awt.image.*;public class ImageApplet extends Applet implements ActionListener {    int lastImage=2;  Image im;  int width = 400, height = 400;  MemoryImageSource imSource;  public void init() {    setLayout(new BorderLayout());    Button b = new Button("New image");    b.addActionListener(this);    add(b, "South");  }  public void start() {    System.out.println("Busy...");    imSource = new MemoryImageSource(width, height, getImageData(width, height), 0, width);    im = createImage(imSource);    System.out.println("made image "+im);  }  public void update(Graphics g) {    paint(g);  }  public void actionPerformed(ActionEvent e) {    System.out.println("Busy...");    imSource = new MemoryImageSource(width, height, getImageData(width, height), 0, width);    im = createImage(imSource);    System.out.println("made image "+im);    repaint();  }  public void paint(Graphics g) {    g.drawImage(im, 0, 0, this);    System.out.println("painted "+im);  }    public int[] toRedOrange(int data[]) {    for(int i=0; i<data.length; i++) {      data[i] = (data[i] << 8) | (255 << 16) | (255 << 24);  // red & orange    }    return data;  }  public int[] toBlueBlack(int data[]) {    for(int i=0; i<data.length; i++) {      data[i] = data[i] | (255 << 24); // black & blue    }    return data;  }    public int[] smooth(int [] data, int w, int h) {  // doesn't handle edges    int[] newData = new int[data.length];    int y, x, i;    for(y=1; y<h-1; y++) {      for(x=1; x<w-1; x++) {        newData[x+w*y] = (data[x+w*y+w] + data[x+w*y-w] + data[x+w*y+1] + data[x+w*y-1] + data[x+w*y]) / 5;      }    }    for(i=0; i<newData.length; i++) {      newData[i] = newData[i] | (255 << 24); // black & blue    }    return newData;  }    public int[] getImageData(int w, int h) {    int i = (lastImage++) % 7;    int[] data = new int[0];    if      (i==0) data = getGravityImageData(w, h, randInt(20));    else if (i==1) data = getRandomImageData(w, h);    else if (i==2) data = smooth(smooth(getRandomImageData(w, h), w, h), w, h);    else if (i==3) data = getFeatherImageData(w, h);    else if (i==4) data = smooth(smooth(getFeatherImageData(w, h), w, h), w, h);    else if (i==5) data = getCheckerImageData(w, h);    else if (i==6) data = smooth(smooth(getCheckerImageData(w, h), w, h), w, h);    i = randInt(3);    if (i==0) return toRedOrange(data);    else return toBlueBlack(data);  }  public int[] getRandomImageData(int w, int h) {    int i;    int[] data = new int[w*h];    for(i=0; i<data.length; i++) {      data[i] = randInt(255);    }    return data;  }  public int[] getDoubleFeatherImageData(int w, int h) {    int i;    int[] data = new int[w*h], data1 = getFeatherImageData(w, h), data2 = getFeatherImageData(w, h);    for(i=0; i<data.length; i++) {      data[i] = ( data1[i] + data2[i%w + w*(h-i/w-1)] )/2;    }    return data;  }  public int[] getGravityImageData(int w, int h, int pCount) {    int x, y, i, pDist, pWDist;    Point3d[] points = new Point3d[pCount];    for(i = 0; i<points.length; i++) {      points[i] = new Point3d(randInt(w), randInt(h), randInt(255));      System.out.println(points[i]);    }    int[] data = new int[w*h];    for(y=0; y<h; y++) {      for(x=0; x<w; x++) {        pDist = 0;        pWDist = 0;        for(i=0; i<points.length; i++) {          pDist  += 1000000 / (sqrDist(points[i].x - x, points[i].y - y)+1);          pWDist += 1000000 / (sqrDist(points[i].x - x, points[i].y - y)+1) * points[i].z;        }        data[w*y+x] = pWDist/pDist;      }    }    for(i=0; i<data.length; i++) {      //data[i] = (data[i] << 8) | (255 << 16) | (255 << 24);  // red & orange      data[i] = data[i] | (255 << 24); // black & blue    }    return data;  }  public int[] getFeatherImageData(int w, int h) {    int x, y, i;    int[] data = new int[w*h];    data[0] = (int)(255*Math.random());    for(x=1; x<w; x++) {      data[x] = constrain( data[x-1] + dx() );    }    for(y=1; y<h; y++) {      data[w*y] = constrain( data[w*y-w] + dx() );    }    for(y=1; y<h; y++) {      for(x=1; x<w; x++) {        data[w*y+x] = constrain( ( data[w*y+x-1] + data[w*y+x-w] )/2 + dx() );      }    }    for(i=0; i<data.length; i++) {      //data[i] = (data[i] << 8) | (255 << 16) | (255 << 24);  // red & orange      data[i] = data[i] | (255 << 24); // black & blue    }    return data;  }  public int[] getCheckerImageData(int w, int h) {    int x, y, i;    int[] data = new int[w*h];    data[0] = (int)(255*Math.random());    for(x=1; x<w; x++) {      data[x] = constrain( data[x-1] + dx() );    }    for(y=1; y<h; y++) {      data[w*y] = constrain( data[w*y-w] + dx() );    }    for(y=1; y<h; y++) {      for(x=1; x<w; x++) {        data[w*y+x] = constrain( 2*( data[w*y+x-1] + data[w*y+x-w] - data[w*y+x-w-1] )/2 + dx() );      }    }    for(i=0; i<data.length; i++) {      //data[i] = (data[i] << 8) | (255 << 16) | (255 << 24);  // red & orange      data[i] = data[i] | (255 << 24); // black & blue    }    return data;  }    public int dx() {    return (int)(31*Math.random())-15;  }  public int constrain(int i) {    if (i<0) return 0;    else if (i>255) return 255;    else return i;  }  public final static int randInt(int i) {    return (int)(i*Math.random());  }  public final static int sqrDist(int x, int y) {    return x*x+y*y;  }    class Point3d {    public int x, y, z;    public Point3d(int x, int y, int z) {      this.x = x;      this.y = y;      this.z = z;    }    public String toString() {      return "( "+x+" , "+y+" , "+z+" )";    }  }  }