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);
    }
}