/* Tri naif applique a un tableau d'entiers       */

public class TriBulleGraphique {

  static final int px = 40;
  static final int py = 170;
  
  static void affichage(int [] t,int px,int py) {
    EcranGraphique.drawLine(px-10,py-25,px+t.length*40-10,py-25);
    EcranGraphique.drawLine(px-10,py+10,px+t.length*40-10,py+10);
    for ( int i = 0 ; i <= t.length ; i++ )
      EcranGraphique.drawLine(px-10+i*40,py-25,px-10+i*40,py+10);
    for ( int i = 0 ; i < t.length ; i++ ) {
      EcranGraphique.drawText(px+40*i,py,EcranGraphique.COLABA8x13,"%d",t[i]); }
  }

  static void affichage(int [] t,int px,int py,int indi,int indf,int lim) {
    EcranGraphique.setColor(0,0,0);
    EcranGraphique.drawLine(px-10,py-25,px+t.length*40-10,py-25);
    EcranGraphique.drawLine(px-10,py+10,px+t.length*40-10,py+10);
    for ( int i = 0 ; i <= t.length ; i++ )
      EcranGraphique.drawLine(px-10+i*40,py-25,px-10+i*40,py+10);
    for ( int i = 0 ; i < t.length ; i++ )
      if ( ( i != indi ) && ( i != indf ) ) {
        if ( i > lim )
          EcranGraphique.setColor(0,192,0);
          else
          EcranGraphique.setColor(0,0,0);
        EcranGraphique.drawText(px+40*i,py,EcranGraphique.COLABA8x13,"%d",t[i]); }
  }

  static void animation(int [] t,int indi,int indf,int lim,int [] tc) {
    for ( int i = 0 ; i <= 45 ; i++ ) {
      EcranGraphique.clear();
      EcranGraphique.setColor(50,50,150);
      affichage(tc,px,py-100);
      affichage(t,px,py,indi,indf,lim);
      int px1 = 40+indi*40;
      int px2 = 40+indf*40;
      double angle = i/45.0*Math.PI;
      int pxf =(int) ((px1+px2)/2.0+20.0*Math.cos(angle));
      int pyf =(int) (py+40.0*Math.sin(angle));
      int pxi =(int) ((px1+px2)/2.0+20.0*Math.cos(angle+Math.PI));
      int pyi =(int) (py+40.0*Math.sin(angle+Math.PI));
      EcranGraphique.setColor(192,0,0);
      EcranGraphique.drawText(pxi,pyi,EcranGraphique.COLABA8x13,"%d",t[indi]);
      EcranGraphique.drawText(pxf,pyf,EcranGraphique.COLABA8x13,"%d",t[indf]);
      EcranGraphique.wait(10);
      EcranGraphique.flush(); }
  }

  static void affichage(int [] t,int ind,int lim,int [] tc) {
    EcranGraphique.clear();
    EcranGraphique.setColor(50,50,150);
    affichage(tc,px,py-100);
    EcranGraphique.setColor(0,0,0);
    EcranGraphique.drawLine(px-10,py-25,px+t.length*40-10,py-25);
    EcranGraphique.drawLine(px-10,py+10,px+t.length*40-10,py+10);
    for ( int i = 0 ; i <= t.length ; i++ )
      EcranGraphique.drawLine(px-10+i*40,py-25,px-10+i*40,py+10);
    for ( int i = 0 ; i < t.length ; i++ ) {
      if ( i > lim )
        EcranGraphique.setColor(0,192,0);
        else
        if ( ( i == ind ) || ( i == ind+1 ) )
          EcranGraphique.setColor(0,0,192);
          else
          EcranGraphique.setColor(0,0,0);
      EcranGraphique.drawText(px+40*i,py,EcranGraphique.COLABA8x13,"%d",t[i]); }
    EcranGraphique.flush();
    EcranGraphique.wait(1000);
  }
  
/* Fonction de tri a bulle d'un tableau d'entiers */

  static void triBulle(int [] t,int [] tc) {
    int aux;
    for ( int i = 0 ; i < t.length-1 ; i++ ) {
      for ( int j = 0 ; j < t.length-i-1 ; j++ ) {
        if ( t[j] > t[j+1] ) {
          animation(t,j,j+1,t.length-1-i,tc);
          aux = t[j];
          t[j] = t[j+1];
          t[j+1] = aux; }
          else {
          affichage(t,j,t.length-1-i,tc); } } }
    EcranGraphique.clear();
    EcranGraphique.setColor(50,50,150);
    affichage(tc,px,py-100);
    affichage(t,px,py,-1,-1,-1);
    EcranGraphique.flush();
    EcranGraphique.wait(10);
  }
  
/* Programme principal                            */

  public static void main(String [] args) {
    int [] t = Bibliotheque.initRand(15,99);
    int [] tc = Bibliotheque.clone(t);
    EcranGraphique.init(50,50,700,320,660,240,"Tri à bulle");
    EcranGraphique.setClearColor(255,255,255);
    triBulle(t,tc);
  }
}