import java.awt.*;import java.awt.image.*;import java.net.*;public class RippleApplet extends java.applet.Applet {  String imageName;	Image im, waveImage;	public void init() {  	int w=-1, h=-1;	  imageName = getParameter("imageName");		try {	im = getImage(new URL(getDocumentBase(), imageName)); }		catch (Exception e) { System.out.println("couldn't find image"); }		while(w == -1 |+ h == -1) {		  w = im.getWidth(this);		  h = im.getHeight(this);			System.out.println("Loading image...");		  try { Thread.sleep(1000); } catch (Exception e) { }		}		System.out.println("Done loading image.");		PixelGrabber pix=null;		try {		  pix = new PixelGrabber(im, 0, 0, w, h, true);		  System.out.println("Getting data.");  		boolean b = pix.grabPixels();  		if (!b) System.out.println("aborted...");		}	  catch (Exception e) { System.out.println(e); }		int[] flatData = (int[])pix.getPixels();		int[][] data = deflatten(flatData, w, h);		int[][] data2 = new int[w][h];		double r;		for(int x=20; x<w-20; x++) {	  	for(int y=20; y<h-20; y++) {        r = Math.sqrt((x-w/2)*(x-w/2)+(y*2-h)*(y*2-h))/9;			  data2[x][y] = data[x+(int)(50*Math.cos(r)/(r+1))][y+(int)(130*Math.cos(r)/(r+1))];  		}			if (x % 10 == 0) System.out.println("working... "+x);		}		flatData = flatten(data2);		System.out.println("Making image");		waveImage = createImage(new MemoryImageSource(w, h, flatData, 0, w));		repaint();	}		public int[] flatten(int[][] data) {		int w=data.length, h=data[0].length;	  int[] flatData = new int[w*h];	  for(int x=0; x<w; x++) {		  for(int y=0; y<h; y++) {  			flatData[x+w*y] = data[x][y];			}		}		return flatData;	}		public int[][] deflatten(int[] flatData, int w, int h) {	  int[][] data = new int[w][h];	  for(int x=0; x<w; x++) {		  for(int y=0; y<h; y++) {  			data[x][y] = flatData[x+w*y];			}		}		return data;	}		public void paint(Graphics g) {	  if (waveImage != null) g.drawImage(waveImage, 0, 0, this);	}	}