/*
Copyright 2006 by Sean Luke and George Mason University
Licensed under the Academic Free License version 3.0
See the file "LICENSE" for more information
*/
package sim.app.woims3d;
import sim.field.continuous.*;
import sim.engine.*;
import sim.display3d.*;
import sim.util.*;
import javax.swing.*;
public class WoimsDemo3D extends SimState
{
private static final long serialVersionUID = 1;
public static final double XMIN = 0;
public static final double XMAX = 200;
public static final double YMIN = 0;
public static final double YMAX = 200;
public static final double ZMIN = 0;
public static final double ZMAX = 200;
public static final double DIAMETER = 1;
public static final double[][] obstInfo = { {40, 40, 40, 40}, {60, 135, 135, 135} };
public static final int NUM_WOIMS = 40;
public static final double TIMESTEP = 30;
public Display3D display;
public JFrame displayFrame;
public Continuous3D environment = new Continuous3D( 2*DIAMETER, XMAX-XMIN, YMAX-YMIN, ZMAX-ZMIN );
public Continuous3D woimEnvironment = null;
public Continuous3D obstacles = null;
public WoimsDemo3D(long seed)
{
super(seed);
}
public final static double EXTRA_SPACE = 10;
public void setObjectLocation( final Woim3D woim, Double3D location )
{
// toroidal world!
double x = location.x;
while( x < XMIN - EXTRA_SPACE )
x += XMAX-XMIN+EXTRA_SPACE+EXTRA_SPACE;
while( x > XMAX + EXTRA_SPACE )
x -= XMAX-XMIN+EXTRA_SPACE+EXTRA_SPACE;
double y = location.y;
while( y < YMIN - EXTRA_SPACE )
y += YMAX-YMIN+EXTRA_SPACE+EXTRA_SPACE;
while( y > YMAX + EXTRA_SPACE )
y -= YMAX-YMIN+EXTRA_SPACE+EXTRA_SPACE;
double z = location.z;
while( z < ZMIN - EXTRA_SPACE )
z += ZMAX-ZMIN+EXTRA_SPACE+EXTRA_SPACE;
while( z > ZMAX + EXTRA_SPACE )
z -= ZMAX-ZMIN+EXTRA_SPACE+EXTRA_SPACE;
location = new Double3D( x, y, z );
environment.setObjectLocation( woim, location );
woimEnvironment.setObjectLocation( woim, location );
woim.x = location.x;
woim.y = location.y;
woim.z = location.z;
}
public void start()
{
super.start(); // clear out the schedule
environment = new Continuous3D( 2*DIAMETER, XMAX-XMIN, YMAX-YMIN, ZMAX-ZMIN );
woimEnvironment = new Continuous3D( Woim3D.MAX_DISTANCE,XMAX-XMIN, YMAX-YMIN, ZMAX-ZMIN );
obstacles = new Continuous3D( Math.max(XMAX-XMIN,Math.max(YMAX-YMIN,ZMAX-ZMIN)),XMAX-XMIN, YMAX-YMIN, ZMAX-ZMIN );
// Schedule the Woims -- we could instead use a RandomSequence, which would be faster,
// but this is a good test of the scheduler
for(int x=0;x<NUM_WOIMS;x++)
{
Double3D loc = null;
Woim3D woim = null;
int caz = random.nextInt(6);
switch( caz )
{
case 0: loc = new Double3D( XMIN-EXTRA_SPACE,
random.nextDouble()*(YMAX-YMIN-DIAMETER)+YMIN+DIAMETER/2,
random.nextDouble()*(ZMAX-ZMIN-DIAMETER)+ZMIN+DIAMETER/2 );
break;
case 1: loc = new Double3D( XMAX+EXTRA_SPACE,
random.nextDouble()*(YMAX-YMIN-DIAMETER)+YMIN+DIAMETER/2,
random.nextDouble()*(ZMAX-ZMIN-DIAMETER)+ZMIN+DIAMETER/2 );
break;
case 2: loc = new Double3D( random.nextDouble()*(XMAX-XMIN-DIAMETER)+XMIN+DIAMETER/2,
YMIN-EXTRA_SPACE,
random.nextDouble()*(ZMAX-ZMIN-DIAMETER)+ZMIN+DIAMETER/2 );
break;
case 3: loc = new Double3D( random.nextDouble()*(XMAX-XMIN-DIAMETER)+XMIN+DIAMETER/2,
YMAX+EXTRA_SPACE,
random.nextDouble()*(ZMAX-ZMIN-DIAMETER)+ZMIN+DIAMETER/2 );
break;
case 4: loc = new Double3D( random.nextDouble()*(XMAX-XMIN-DIAMETER)+XMIN+DIAMETER/2,
random.nextDouble()*(YMAX-YMIN-DIAMETER)+YMIN+DIAMETER/2,
ZMIN-EXTRA_SPACE );
break;
case 5: loc = new Double3D( random.nextDouble()*(XMAX-XMIN-DIAMETER)+XMIN+DIAMETER/2,
random.nextDouble()*(YMAX-YMIN-DIAMETER)+YMIN+DIAMETER/2,
ZMAX+EXTRA_SPACE );
break;
}
woim = new Woim3D();
environment.setObjectLocation( woim, loc );
woimEnvironment.setObjectLocation( woim, loc );
woim.x = loc.x;
woim.y = loc.y;
woim.z = loc.z;
schedule.scheduleRepeating(woim);
}
for( int i = 0 ; i < obstInfo.length ; i++ )
{
environment.setObjectLocation(new Obstacle3D(obstInfo[i][0]),
new Double3D(obstInfo[i][1],obstInfo[i][2],obstInfo[i][3]));
}
}
public static void main(String[] args)
{
doLoop(WoimsDemo3D.class, args);
System.exit(0);
}
}