/* (c) 1996 B J Soares, J J O'Connor & E F Robertson. All rights reserved.
 * The Famous Curves interactive associated curve plotter in java
 * adapted from Pascal routines by J J O'Connor for The Mathematical MacTutor,
 * School of Mathematical and Computational Sciences, University of St Andrews
 * by Ben Soares for the Famous Curves section of the MacTutor History of
 * Mathematics Archive on the WWW at 
 *             http://www-groups.dcs-st-and.ac.uk/~history/
 * Please do not modify this code without the authors' permission.
 * The authors' email addresses are;
 * Ben Soares:    bs@st-and.ac.uk
 * John O'Connor: joc@st-and.ac.uk
 * Constructive comments are always welcome.
 * Whilst a reasonable amount of effort has been taken to make this a useful
 * application no responsibility for this code and its use will be taken by
 * the authors.
 */

import java.awt.*;
import java.applet.*;

public class FamousCurves extends Applet {
  
  Curve curve;
  CurvePanel curvepanel;
  CurveControls curvecontrols;
  String curvename;
  double tmin;
  double tmax;
  int numberofpoints;
  double td;
  boolean numberofpointsb = false;
  boolean tdb = false;
  double dt;
  double xb, xt, yb, yt;
  String supportedparameters;
  double a, b, c, d, e, f, h, k, m, n, p;
  boolean ap = false;
  boolean bp = false;
  boolean cp = false;
  boolean dp = false;
  boolean ep = false;
  boolean fp = false;
  boolean hp = false;
  boolean kp = false;
  boolean mp = false;
  boolean np = false;
  boolean pp = false;
  
  // beginning of initialisation method
  
public void init() {
  
  this.curvename = "Ellipse";
  this.tmin = 0.0;
  this.tmax = 6.824;
  this.numberofpoints = 200;
  this.td = 0.03142;
  this.dt = 0.000001;
  this.xb = -5;
  this.xt = 5;
  this.yb = -5;
  this.yt = 5;  
  this.supportedparameters = "";
  this.a = 1.0;
  this.b = 0.5;
  this.c = 3.0;
  this.d = -4.0;
  this.e = 1;
  this.f = -1;
  this.h = 2;
  this.k = 2;
  this.m = 5;
  this.n = 3;
  this.p = 4/7;
  
  String curvenamestring = getParameter("curvename");
  String tminstring = getParameter("tmin");
  String tmaxstring = getParameter("tmax");
  String numberofpointsstring = getParameter("numberofpoints");
  String tdstring = getParameter("td");
  String dtstring = getParameter("dt");
  String xbstring = getParameter("xb");
  String xtstring = getParameter("xt");
  String ybstring = getParameter("yb");
  String ytstring = getParameter("yt");
  String supportedparametersstring = getParameter("supportedparameters");
  String astring = getParameter("a");
  String bstring = getParameter("b");
  String cstring = getParameter("c");
  String dstring = getParameter("d");
  String estring = getParameter("e");
  String fstring = getParameter("f");
  String hstring = getParameter("h");
  String kstring = getParameter("k");
  String mstring = getParameter("m");
  String nstring = getParameter("n");
  String pstring = getParameter("p");
  
  curvename = curvenamestring;
  if (tminstring != null) {
    try {
      this.tmin = Double.valueOf(tminstring).doubleValue();
    } catch (NumberFormatException e) {
    }
  }
  if (tmaxstring != null) {
    try {
      this.tmax = Double.valueOf(tmaxstring).doubleValue();
    } catch (NumberFormatException e) {
    }
  }
  if (numberofpointsstring != null) {
    try {
      this.numberofpoints = Integer.valueOf(numberofpointsstring).intValue();
      this.numberofpointsb = true;
    } catch (NumberFormatException e) {
    }
  }
  if (tdstring != null) {
    try {
      this.td = Double.valueOf(tdstring).doubleValue();
      this.tdb = true;
    } catch (NumberFormatException e) {
    }
  }
  if (dtstring != null) {
    try {
      this.dt = Double.valueOf(dtstring).doubleValue();
    } catch (NumberFormatException e) {
    }
  }
  if (xbstring != null) {
    try {
      this.xb = Double.valueOf(xbstring).doubleValue();
    } catch (NumberFormatException e) {
    }
  }
  if (xtstring != null) {
    try {
      this.xt = Double.valueOf(xtstring).doubleValue();
    } catch (NumberFormatException e) {
    }
  }
  if (ybstring != null) {
    try {
      this.yb = Double.valueOf(ybstring).doubleValue();
    } catch (NumberFormatException e) {
    }
  }
  if (ytstring != null) {
    try {
      this.yt = Double.valueOf(ytstring).doubleValue();
    } catch (NumberFormatException e) {
    }
  }
  if (supportedparametersstring != null) {
    try {
      this.supportedparameters = supportedparametersstring;
    } catch (NumberFormatException e) {
    }
  }
  if (astring != null) {
    try {
      this.a = Double.valueOf(astring).doubleValue();
      if (supportedparameters.indexOf("a")>=0) { this.ap = true; }
    } catch (NumberFormatException e) {
    }
  }
  if (bstring != null) {
    try {
      this.b = Double.valueOf(bstring).doubleValue();
      if (supportedparameters.indexOf("b")>=0) { this.bp = true; }
    } catch (NumberFormatException e) {
    }
  }
  if (cstring != null) {
    try {
      this.c = Double.valueOf(cstring).doubleValue();
      if (supportedparameters.indexOf("c")>=0) { this.cp = true; }
    } catch (NumberFormatException e) {
    }
  }
  if (dstring != null) {
    try {
      this.d = Double.valueOf(dstring).doubleValue();
      if (supportedparameters.indexOf("d")>=0) { this.dp = true; }
    } catch (NumberFormatException e) {
    }
  }
  if (estring != null) {
    try {
      this.e = Double.valueOf(estring).doubleValue();
      if (supportedparameters.indexOf("e")>=0) { this.ep = true; }
    } catch (NumberFormatException e) {
    }
  }
  if (fstring != null) {
    try {
      this.f = Double.valueOf(fstring).doubleValue();
      if (supportedparameters.indexOf("f")>=0) { this.fp = true; }
    } catch (NumberFormatException e) {
    }
  }
  if (hstring != null) {
    try {
      this.h = Double.valueOf(hstring).doubleValue();
      if (supportedparameters.indexOf("h")>=0) { this.hp = true; }
    } catch (NumberFormatException e) {
    }
  }
  if (kstring != null) {
    try {
      this.k = Double.valueOf(kstring).doubleValue();
      if (supportedparameters.indexOf("k")>=0) { this.kp = true; }
    } catch (NumberFormatException e) {
    }
  }
  if (mstring != null) {
    try {
      this.m = Double.valueOf(mstring).doubleValue();
      if (supportedparameters.indexOf("m")>=0) { this.mp = true; }
    } catch (NumberFormatException e) {
    }
  }
  if (nstring != null) {
    try {
      this.n = Double.valueOf(nstring).doubleValue();
      if (supportedparameters.indexOf("n")>=0) { this.np = true; }
    } catch (NumberFormatException e) {
    }
  }
  if (pstring != null) {
    try {
      this.p = Double.valueOf(pstring).doubleValue();
      if (supportedparameters.indexOf("p")>=0) { this.pp = true; }
    } catch (NumberFormatException e) {
    }
  }
  
  if (tdb) {
    if (ap || bp || cp || dp || ep || fp || hp || kp || mp || np || pp) {
      this.curve = new Curve(this.curvename, this.tmin, this.tmax, this.td, this.dt, this.xb, this.xt, this.yb, this.yt, this.a, this.b, this.c, this.d, this.e, this.f, this.h, this.k, this.m, this.n, this.p);
    } else {
      this.curve = new Curve(this.curvename, this.tmin, this.tmax, this.td);
    }
  } else {
    if (ap || bp || cp || dp || ep || fp || hp || kp || mp || np || pp) {
      this.curve = new Curve(this.curvename, this.tmin, this.tmax, this.numberofpoints, this.dt, this.xb, this.xt, this.yb, this.yt, this.a, this.b, this.c, this.d, this.e, this.f, this.h, this.k, this.m, this.n, this.p);
    } else {
      this.curve = new Curve(this.curvename, this.tmin, this.tmax, this.td);
    }
  }
  setLayout(new BorderLayout());
  this.curvepanel = new CurvePanel(this.curve, 0);
  this.curvepanel.setParameters(this.a, this.b, this.c, this.d, this.e, this.f, this.h, this.k, this.m, this.n, this.p);
  add("Center", this.curvepanel);
  this.curvecontrols = new CurveControls(this.curvepanel, this.ap, this.bp, this.cp, this.dp, this.ep, this.fp, this.hp, this.kp, this.mp, this.np, this.pp);
  add("South", this.curvecontrols);
  
} /* end of initialisation method */
  
} /* end of FamousCurves applet */
