TrajectApp.java
import java.lang.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.NumberFormat;
import org.jfree.chart.*;
import org.jfree.chart.plot.*; // for PlotOrientation
import org.jfree.data.*;
/**
Demo of Strategy pattern using ODE/ODESolver interfaces.
Calculate and display a family of trajectories.
@author Walt Leipold
*/
public class TrajectApp
{
public static void main(String[] argv)
{
NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(5);
nf.setMinimumFractionDigits(2);
XYSeries xy = null;
XYSeriesCollection collect = null;
// Try a range of drag coefficients.
for (double logc=-4.0; logc<=-1.0; logc+=0.5) {
double c = Math.pow(10.0,logc);
// Muzzle velocity=50, elevation=45 deg
Traject traject = new Traject(50.0,Math.PI/4.0,c);
ODESolver solver = new Euler(traject);
solver.setStepSize(0.1);
xy = new XYSeries("C="+nf.format(c));
int n = 0;
while (true) {
solver.step();
double[] state = traject.getState();
if ((n % 10) == 0 || state[2] <= 0.0) {
System.out.println(state[0] + ", " +
state[1] + ", " +
state[2]);
xy.add(state[1],state[2]);
}
n++;
// Stop the simulation when the projectile
// falls back to earth.
if (state[2] <= 0.0)
break;
}
if (collect == null)
collect = new XYSeriesCollection(xy);
else
collect.addSeries(xy);
}
JFrame f = new TrajectFrame(collect);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.show();
}
}
class TrajectFrame extends JFrame
{
public TrajectFrame(XYSeriesCollection collect)
{
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension ss = kit.getScreenSize();
setSize(3*ss.width/4,3*ss.height/4);
setLocation(ss.width/8,ss.height/8);
setTitle("CISC370-011 -- ODE demo");
JFreeChart fc =
ChartFactory.createXYLineChart(
"Trajectories","Range","Height",
collect,PlotOrientation.VERTICAL,
true,false,false);
ChartPanel cp = new ChartPanel(fc);
getContentPane().add(cp,BorderLayout.CENTER);
}
}