//
// (c) Pop / Optimum
//     Octobre 1997
//

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

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

  MediaTracker tracker;
  Graphics buffer;
  Thread thread = null;
  Image optimum = null;
  Image kp = null;
  Image image = null;
  boolean sens = true;
  boolean fastsens = false;
  boolean levelsens = true;
  int imX = 0;
  int imY = 0;
  int x = 0;
  int kpX = 0;
  int fastx = 0;
  int level = 0;
  Integer tmp;
  double angle = 0.0;

  public void init () {

    // Fond noir

    setBackground ( Color.black );

    // Initialisation des images

    optimum = getImage ( getDocumentBase () , getParameter ("opt") );    
    kp = getImage ( getDocumentBase () , getParameter ("kp") );

    // Initialisation des variables

    tmp = new Integer ( getParameter ("imX") );
    imX = tmp.intValue ();
    x = -imX;
    fastx = 5;
    tmp = new Integer ( getParameter ("imY") );
    imY = tmp.intValue ();
    tmp = new Integer ( getParameter ("kpX") );
    kpX = tmp.intValue ();

    // Initialisation du buffer

    image = createImage ( imX , imY );
    buffer = image.getGraphics ();

    // Chargement des images

    tracker = new MediaTracker ( this );
    tracker.addImage ( kp , 0 );
    tracker.addImage ( optimum , 1 );
    try {
      tracker.waitForID ( 0 );
      tracker.waitForID ( 1 );
    }
    catch ( InterruptedException e ) { 
      showStatus ( "Interrupted" );
    }
    while ( ! tracker.checkID ( 0 ) ) { }
    while ( ! tracker.checkID ( 1 ) ) { }

    // Lancement du thread

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

  }

  public void run () {

    // Boucle sans fin 

    while ( true ) {

      // On incremente ou decremente suivant
      // le sens dans lequel va l'image

      if ( sens )
        x += 1;
      else
        x -= 1;

      if ( fastsens )
        fastx += 3;
      else
        fastx -= 3;

      if ( levelsens )
        level += 3;
      else
        level -= 3;

      // On change de sens

      if ( x == imX )
        sens = false;
      if ( x == -imX )
        sens = true;

      if ( fastx < 5 )
        fastsens = true;
      if ( fastx >  imX - kpX - 5 )
        fastsens = false;

      if ( level > 25 )
        levelsens = false;
      if ( level == 0 )
        levelsens = true;

      // On augmente l'angle

      angle += Math.PI/50;
      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 , imX , imY );

    // On affiche les images

    g.drawImage ( kp , fastx , 105 , this );
    g.drawImage ( optimum , x , 5 , this );

    // On affiche les points

    double w = (double) imX/2;
    double h = (double) imY/2;

    double calc = angle;
    for ( int num_point = 0 ; num_point < 50 ; num_point++ ) {
      calc += Math.PI / 800;

      g.setColor ( new Color ( 0 , 5*num_point , 5*num_point ) );
      // Blaaaaaah c'est pas tres "optimum" tous ca
      g.drawRect ( (int)( w * (1+Math.cos(3*calc)/1.5)) , (int)( h * (1+Math.sin(2*calc)/1.5)) , 1 , 1 );
      g.drawRect ( (int)( w * (1+Math.cos(Math.PI/2+3*calc)/1.5)) , (int)( h * (1+Math.sin(Math.PI/2+2*calc)/1.5)) , 1 , 1 );
      g.drawRect ( (int)( w * (1+Math.cos(Math.PI+3*calc)/1.5)) , (int)( h * (1+Math.sin(Math.PI+2*calc)/1.5)) , 1 , 1 );
      g.drawRect ( (int)( w * (1+Math.cos(3*Math.PI/2+3*calc)/1.5)) , (int)( h * (1+Math.sin(3*Math.PI/2+2*calc)/1.5)) , 1 , 1 );

    }

    // On affiche le texte 

    g.setColor ( Color.red );
    g.drawString("Pop", imX/2 - 20 , 45-level );
    g.drawString("&", imX/2 - 12 , 60 );
    g.drawString("CorTeX", imX/2 - 28 , 75+level );

  }

  public void update ( Graphics g ) {

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

  }

}








