/*
* 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