/*

* Paul Koop M.A.

* www.paul-koop.org pkoop@gmx.net

* CUMOS

* Coordinated Undefined Moving Others

* koordiniert sich bewegende irgendwelche anderen

* Quellcode darf mit Copyrightangabe URL und eMailadresse

* verwendet werden

*/

import java.awt.*;

import java.awt.event.*;

import java.applet.*;

import java.util.*;

// Paul Koop M.A. Applet cumos

//classes

class cumo

{//BEGIN cumo

 int xpos;

 int ypos;

 int xgesch;

 int ygesch;

 int n;//nachbarn

 public void show(Graphics g)

 {//BEGIN show

 g.setColor(Color.black ); g.fillOval(xpos , ypos , 5 , 5);

 }//END show

 public void hide(Graphics g)

 {//BEGIN show

 g.setColor(Color.white ); g.fillOval(xpos , ypos , 5 , 5);

 }//END show

}//END cumo

public class cumos extends Applet implements Runnable

{//BEGIN cumos

 //Deklarationen

 static private Random muenzeWerfen;

 static private int hoehe;

 static private int breite;

 static private final int anzahl = 100;

 static private int umgebung;

 

 static private cumo [] a = new cumo [anzahl];

 static private cumo [] b = new cumo[anzahl];

 

 Thread AnimaCumo;

           

public void start()

{

 if (AnimaCumo==null)

 {

  AnimaCumo = new Thread(this);

  AnimaCumo.start();

 }

}

public void stop()

{

 if (AnimaCumo!=null)

  {

   AnimaCumo.stop();

   AnimaCumo = null;

  }

}

public void run()

{

 while(true)

  {

   try

   {

    Thread.sleep(1);

   }

    catch (Exception e)

   {

   }

   repaint();

  }

}

           

 

 public boolean nachbarn(cumo nachbar, cumo von)

 {//BEGIN nachbarn

  int nx  =nachbar.xpos;

  int nxz =nx;

  int ny  =nachbar.ypos;

  int nyz =ny;

  int vx  =von.xpos;

  int vy  =von.ypos;

  if ((vx-umgebung)<=0){if (nx>vx){nx = - breite + nxz;}}

  if ((vx+umgebung)>=breite){if (nx<vx) {nx = breite + nxz;}}

  if ((vy-umgebung)<=0){if (ny>vy){ny = - hoehe + nyz;}}

  if ((vy+umgebung)>=hoehe){if (ny<vy) {ny = hoehe + nyz;}}

  if (von.xgesch<0)

   {

    if (von.ygesch<0)

    {if((nx>(vx-umgebung))&(nx<vx)&(ny>(vy-umgebung))&(ny<vy)){return true;}else{return false;}}//X <0 y<0

    else

    {if((nx>(vx-umgebung))&(nx<vx)&(ny<(vy+umgebung))&(ny>vy)){return true;}else{return false;}}//X <0 y>0           

   }

  else

   {

   if (von.ygesch<0)

    {if((nx<(vx+umgebung))&(nx>vx)&(ny>(vy-umgebung))&(ny<vy)){return true;}else{return false;}}//X >0 y<0

    else

    {if((nx<(vx+umgebung))&(nx>vx)&(ny<(vy+umgebung))&(ny>vy)){return true;}else{return false;}}//X >0 y>0           

           

   }

 }//END nachbarn

public void spiel (cumo von [], cumo nach [], Graphics g)

{//BEGIN spiel

   for(int z1=0;z1<anzahl;z1++)

   {//BEGIN for 1

    nach[z1].n =0;

    nach[z1].xgesch=0;

    nach[z1].ygesch=0;

    nach[z1].xpos=0;

    nach[z1].ypos=0;

    for (int z2=0;z2<anzahl;z2++)

    {//BEGIN for 2

     if ((nachbarn(von[z2],von[z1]))&(z2 != z1))

     {//BEGIN if

                 nach[z1].n++;

                 //nach[z1].xpos =nach[z1].xpos+von[z2].xpos;

                 //nach[z1].ypos =nach[z1].ypos+von[z2].ypos;

                 nach[z1].xgesch =nach[z1].xgesch+von[z2].xgesch;

                 nach[z1].ygesch =nach[z1].ygesch+von[z2].ygesch;    

     }//END if

    }//END for 2

    if (nach[z1].n>0)   

    {//BEGIN if

    //nach[z1].xpos=(nach[z1].xpos/nach[z1].n);

    //nach[z1].ypos=(nach[z1].ypos/nach[z1].n);

    nach[z1].xgesch=(nach[z1].xgesch/nach[z1].n);

    if (nach[z1].xgesch ==0)

    {

     nach[z1].xgesch=(int)((muenzeWerfen.nextFloat()*20)-10);

     }    

    nach[z1].ygesch=(nach[z1].ygesch/nach[z1].n);

    if (nach[z1].ygesch ==0)

    {

     nach[z1].ygesch=(int)((muenzeWerfen.nextFloat()*20)-10);

    }

    nach[z1].xpos= von[z1].xpos+nach[z1].xgesch;

    nach[z1].ypos= von[z1].ypos+nach[z1].ygesch;

    if (nach[z1].xpos < 0){nach[z1].xpos = breite+nach[z1].xpos;}

    if (nach[z1].xpos > breite){nach[z1].xpos = nach[z1].xpos-breite;}

    if (nach[z1].ypos < 0){nach[z1].ypos = hoehe+nach[z1].ypos;}

    if (nach[z1].ypos > hoehe){nach[z1].ypos = nach[z1].ypos-hoehe;}

    }//END if

    else

    {//BEGIN else

     nach[z1].xpos =von[z1].xpos;

     nach[z1].ypos =von[z1].ypos;

     nach[z1].xgesch =von[z1].xgesch;

     nach[z1].ygesch =von[z1].ygesch;

     nach[z1].xpos=nach[z1].xpos+nach[z1].xgesch;

     nach[z1].ypos=nach[z1].ypos+nach[z1].ygesch;

     if (nach[z1].xpos < 0){nach[z1].xpos = breite+nach[z1].xpos;}

     if (nach[z1].xpos > breite){nach[z1].xpos = nach[z1].xpos-breite;}

     if (nach[z1].ypos < 0){nach[z1].ypos = hoehe+nach[z1].ypos;}

     if (nach[z1].ypos > hoehe){nach[z1].ypos = nach[z1].ypos-hoehe;}           

    }//END else

    von[z1].hide(g);

    nach[z1].show(g);

 }//END for 1

}//END spiel   

                       

 public void paint(Graphics g)

    {//BEGIN paint

       spiel (a,b,g);

       spiel (b,a,g);

    }//END paint

                                   

 public void erzeuge(cumo [] a,  cumo [] b)

 {//BEGIN erzeuge

  for(int z=0;z<anzahl;z++)

  {//BEGIN for

   a[z]=new cumo();

   a[z].xpos=((int)(muenzeWerfen.nextFloat()*((float)breite+20)))-20;

   a[z].ypos=((int)(muenzeWerfen.nextFloat()*((float)hoehe+20)))-20;

   a[z].xgesch=(int)((muenzeWerfen.nextFloat()*40)-20);

   a[z].ygesch=(int)((muenzeWerfen.nextFloat()*40)-20);

   if (a[z].xgesch ==0)

   {

   a[z].xgesch=(int)((muenzeWerfen.nextFloat()*20)-10);

   a[z].ygesch=(int)((muenzeWerfen.nextFloat()*20)-10);

 

   }

   if (a[z].ygesch ==0)

   {

   a[z].xgesch=(int)((muenzeWerfen.nextFloat()*20)-10);

   a[z].ygesch=(int)((muenzeWerfen.nextFloat()*20)-10);

   }

  }//END for

 

  for(int z=0;z<anzahl;z++)

  {//BEGIN for

   b[z]=new cumo();

  }//END for

 }//END erzeuge

 

 public  void init()

 {//BEGIN init

     Dimension size = getSize();

     hoehe   = size.height;

     breite  = size.width;

     umgebung =20;// (int)(hoehe*0.05);       

     muenzeWerfen = new Random();

     int zufall = (int)(muenzeWerfen.nextFloat()*hoehe);

     erzeuge(a,b);   

 }//END init

 

}//END cumos