package sim.app.pendulum;
import sim.engine.*;
import sim.field.continuous.*;
import ec.util.*;
import sim.physics2D.util.*;
import sim.physics2D.constraint.*;
import sim.physics2D.integrator.ODEEulerSolver;
import sim.util.Double2D;
import java.awt.*;
import sim.physics2D.*;
public class PendulumSim extends SimState
{
public double xMin = 0;
public double xMax = 100;
public double yMin = 0;
public double yMax = 100;
public Continuous2D fieldEnvironment;
public PendulumSim(long seed)
{
this(seed, 200, 200);
}
public PendulumSim(long seed, int width, int height)
{
super(seed);
xMax = width;
yMax = height;
createGrids();
}
boolean useEuler = false;
public boolean getUseEuler() { return useEuler; }
public void setUseEuler(boolean val) { useEuler = val; }
void createGrids()
{
fieldEnvironment = new Continuous2D(25, (xMax - xMin), (yMax - yMin));
}
// Resets and starts a simulation
public void start()
{
super.start(); // clear out the schedule
createGrids();
PhysicsEngine2D objPE = new PhysicsEngine2D();
if (useEuler)
objPE.setODESolver(new ODEEulerSolver());
Anchor anchor = new Anchor(new Double2D(100, 50), 5);
fieldEnvironment.setObjectLocation(anchor, new sim.util.Double2D(100, 50));
objPE.register(anchor);
Pendulum pend = new Pendulum(new Double2D(80, 50), new Double2D(0, 0), 20, 5, Color.red);
fieldEnvironment.setObjectLocation(pend, new sim.util.Double2D(80, 50));
schedule.scheduleRepeating(pend);
objPE.register(pend);
PinJoint pj = new PinJoint(new Double2D(100, 50), anchor, pend);
objPE.register(pj);
// schedule the physics engine
schedule.scheduleRepeating(objPE);
}
public static void main(String[] args)
{
doLoop(PendulumSim.class, args);
System.exit(0);
}
}