//
// JavaImage.java
// (c) Neil Gershenfeld  2/6/03
// demonstrates Java by animating sin(k*r)/k*r
//


import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
//import java.awt.image.BufferedImage;

import java.awt.geom.*;

public class JavaImage extends JApplet implements Runnable {
   
   static final int NPTS = 100;
   static final int NSTEPS = 100;
   static final int NGRAYS = 100;
   Thread T;
   WritableRaster R;
   BufferedImage I;
   DataBufferInt B;
   Graphics G;
   Color ColorTable[] = new Color[NGRAYS];
   
   public static void main(String args[]) {
	  JavaImage J = new JavaImage();
	  JFrame F = new JFrame("JavaImage");
	  F.setSize(2*NPTS,2*NPTS);
	  J.init();
	  F.getContentPane().add(J);
	  F.setVisible(true);
	  J.start();
   }
   
   class ImagePanel extends JPanel {
	   public void paintComponent(Graphics g) {
		   super.paintComponent(g);
		   Graphics2D g2d = (Graphics2D) g;
//		   ColorModel model = I.getColorModel();
//		   Color imagecolor = Color.red;
//		   int argb = imagecolor.getRGB();
//		   Object colordata = model.getDataElements(argb, null);
//		   int[] bleu = { 123, 234, 255};
		   // rects?
		   double xr, yr, r;
		   int gray;
		   int step;
		   for (step = 1; step < NSTEPS; ++step) {
			   System.out.println(step);
			   for (int i = 0; i < NPTS; i++) {
				   for (int j = 0; j < NPTS; j++) {
					   xr = (2.0*i + 1.0 - NPTS)/NPTS;
					   yr = (2.0*j + 1.0 - NPTS)/NPTS;
					   r = step* 20.0 * Math.sqrt(xr*xr + yr*yr)/NSTEPS;
					   gray = (int) (255*(0.5+Math.sin(r)/r)/1.5);
					   g2d.setColor(new Color(gray, gray, gray));
					   g2d.drawRect(2*i,2*j,2,2);
				   }
			   }
		   }
//		   g2d.drawImage(I, 0, 0, null);		   
	   }
   }
//				   R.setPixel(i,j,(byte) 100);
//			   R.setPixel( i, j, bleu);
//				   R.setDataElements(i,j,colordata);
//				   R.setDataElements(i,j,bleu);
		   //R.setPixel(11,21,128);
   
   public void init() {
	   Container C = getContentPane();
	   C.add(new ImagePanel());
	   I = new BufferedImage(NPTS,NPTS,BufferedImage.TYPE_BYTE_GRAY);
	   R = I.getRaster();
   }
   
   public void start() {
	   if (T == null) {
		   T = new Thread(this);
		   T.start();
	   }
   }
   
   public void stop() {
	   if (T != null) {
		   T = null;
	   }
   }
   
   public void run() {
	   while (true) {
		   repaint();
		   try {Thread.sleep(10);}
		   catch (InterruptedException e) { };
	   }
   }

/*      
   public synchronized void paint(Graphics g) {
      double r, xr, yr;
      int gray, i, j, step;
      Graphics2D g2d = (Graphics2D) g;
//      BufferedImage I = new BufferedImage(TYPE_BYTE_GRAY
      BufferedImage I = (BufferedImage) createImage(100,100);
      //bufferedimage raster data write writableraster databuffer
      //getraster
Graphics2D Ig = I.createGraphics();
        //Ig.drawImage(I, 0, 0, null);
	 Ig.setFont(new Font("Dialog", Font.PLAIN, 10));
   Ig.setColor(Color.black);
   Ig.drawString("BufferedImage", 4, 12);
        for (step = 1; step < NSTEPS; ++step) {
            for (i = 0; i < NPTS; ++i) {
               for (j = 0; j < NPTS; ++j) {
                  xr = (2.0*i + 1.0 - NPTS)/NPTS;
                  yr = (2.0*j + 1.0 - NPTS)/NPTS;
                  r = step * 20.0 * Math.sqrt(xr*xr + yr*yr)/NSTEPS;
                  gray = (int) (NGRAYS*100*(0.5+Math.sin(r)/r)/1.5);
		  //I.setRGB(i,j,0xffff3412);
		  I.setRGB(i,j,gray);		  
                  }
               }
        g2d.drawImage(I, 0, 0, this); 
       }
   }
*/
/*       
   public void update(Graphics g) {
      paint(g);
      }
*/      
   }