//
// (c) Pop / Optimum
//     Mars 1998
//

import java.applet.Applet;
import java.awt.*;
import java.net.URL;
import java.lang.*;

public class DotBall extends java.applet.Applet implements Runnable {

  MediaTracker tracker;
  Graphics buffer;
  Thread thread = null;
  Image image = null;
  double r;
  double angle = 0.0;

  double px[];
  double py[];
  double pz[];

  public void init () {

    // Fond noir

    setBackground ( Color.black );

    // Les tableaux de coordonnees

    px = new double [36*36];
    py = new double [36*36];
    pz = new double [36*36];

    for ( int j=0 ; j<36 ; j++ )
    {
      r = Math.sqrt ( 100*100 -
		     (100-j*2*100/(36-1))*
		     (100-j*2*100/(36-1)) );
      for ( int i=0 ; i<36 ; i++ )
	{
	  px [ j*36 + i ] = r*Math.cos ( i * 2*Math.PI/36 );
	  py [ j*36 + i ] = j * 2*100/36 - 100;
	  pz [ j*36 + i ] = r*Math.sin ( i * 2*Math.PI/36 );
	}
    }

    // Initialisation du buffer

    image = createImage ( 300 , 300 );
    buffer = image.getGraphics ();

    // Lancement du thread

    thread = new Thread ( this );
    thread.start ();

  }

  public void run () {

    // Boucle sans fin 

    while ( true ) {

      // On augmente l'angle

      angle += Math.PI/100;
      if ( angle == 2*Math.PI )
        angle = 0;

      // On rafraichit

      repaint ();
 
      // Une petite pause

      try {
        thread.sleep ( 50 );
      }
      catch ( InterruptedException e ) {
        showStatus ( "Interrupted" );
      }

    }

  }

  public void paint ( Graphics g ) {

    // Fond noir

    g.setColor ( Color.black );
    g.fillRect ( 0 , 0 , 300 , 300 );

    // On affiche les points

    g.setColor ( Color.white );

    double alpha = Math.PI*Math.cos(angle);
    double beta = Math.PI*Math.sin(angle);

    double cbeta = Math.cos(beta);
    double sbeta = Math.sin(beta);
    double calpha = Math.cos(alpha);
    double salpha = Math.sin(alpha);

    int k=0;    

    double xx,yy,zz;

    for ( int i=0 ; i<36*36 ; i++ )
        {	

	  zz = (py[k])*sbeta + (pz[k])*cbeta;

          if ( zz >= 0 )
	    {

	      yy = (py[k])*cbeta - (pz[k])*sbeta;

	      xx = (px[k])*calpha - (yy)*salpha;
	      yy = (px[k])*salpha + (yy)*calpha;

	      xx += 150;
	      yy += 150;

	      g.drawRect ( (int) xx , (int) yy , 1 , 1 );

	    }

	  k ++;
	 
        }

  }

  public void update ( Graphics g ) {

    paint ( buffer );
    g.drawImage ( image , 0 , 0 , 300 , 300 , this );

  }

}








