import ChaosDemos.*; import java.awt.*; import java.util.*; import java.net.URL; import graph.*; /** * Iterates and plots one dimensional chaotic maps.
*
*
  • Shift Map * Shows the map iteration, and calculates power spectrum and histogram.
    * Uses the "Java Graph Class Library" by Leigh Brookshaw * @version 10 October 1997 * @author Michael Cross */ public class Map1D extends dynamicGraph { /** for location of marker.txt */ private URL markerURL; /** location of marker.txt */ private URL documentBase; /** functions */ private static final int QUADRATIC=0; private static final int SINE=1; private static final int TENT=2; private static final int POWER=3; private static final int CIRCLE=4; private static final int SHIFT=5; private static final int CUBIC=6; private static final int MYFUNCTION=7; /** plot types */ private static final int TIMESERIES=0; private static final int FOURIER=1; private static final int BIN=2; private static final int BIFURCATION=3; private static final int LYAPUNOV=4; /* classes used */ private startMap1D outerparent; public superGraph2D graph; private movie theMovie; private Thread aThread=null; private Map1DDiagnostics diagnostics; public Map1DFunction mapFunction; /* GUI classes */ public textControls variables; public buttonControls buttons; public choiceControls choices; private Panel topRightPanel; public Choice plotChoice; public Choice functionChoice; public Label status; /* flags */ /** true if user has chosen range with mouse */ private boolean setAxesRange=false; /** true if iteration number to be shown. Set by choices */ public boolean showTime; /** true after one mouse click */ boolean clicked=false; /** xcoord of first mouse click */ private double xmouse; /** ycoord of first mouse click */ private double ymouse; private boolean showa; /** delay in graph update */ private int delay=100; /** plot number selected */ private int plot=0; /** function number selected */ private int function=0; /** parameter of map equations */ private double a=3.5; /** Maximum value allowed for a */ private double aMaxLimit; /** Minimum value allowed for a */ private double aMinLimit; /** parameter of map equations */ private double b=0.; /** array containing the map parameters a,b */ public double[] parameters; /** Number of parameters for the map function */ public int nParameters; /** iteration variable */ private double x=0.; /** Range of plot */ private double xmin=0,xmax=1,ymin=0,ymax=1; /** x-axis label for each plot type */ private String[] xTitleArray={"X_n","Frequency","X","a","a"} ; /** y-axis label for each plot type */ private String[] yTitleArray={"X_n+1","log(Power)","Number","X","Exponent"}; /** * @param target starting class * @see startMap1D */ Map1D(startMap1D target, URL in_documentBase) { documentBase=in_documentBase; graph = new superGraph2D(this); graph.borderRight=35; try { markerURL = new URL(documentBase,"marker.txt"); graph.setMarkers(new Markers(markerURL)); } catch(Exception e) { System.out.println("Failed to create Marker URL!"); } theMovie = new movie(this); this.outerparent = target; GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints constraints = new GridBagConstraints(); setLayout(gridbag); constraints.fill=GridBagConstraints.BOTH; constraints.gridheight = 1; constraints.gridwidth=1; constraints.weighty = 1.0; constraints.weightx=0.75; constraints.insets = new Insets(0,0,0,10); Panel leftPanel = new Panel(); leftPanel.setLayout(new BorderLayout()); leftPanel.add("Center",graph); Panel bottomLeftPanel = new Panel(); bottomLeftPanel.setLayout( new GridLayout(1,1)); bottomLeftPanel.add(theMovie); /* String[] buttonLabels={"Reset","Clear", "Start"," Step"," Stop"}; buttons = new buttonControls((dynamicGraph) this, buttonLabels,buttonLabels.length,true); buttons.b_init[0] = true; buttons.b_stopped[4] = false; buttons.b_started[1] = true; buttons.b_started[4] = true; buttons.setup(); bottomLeftPanel.add(buttons); */ leftPanel.add("South",bottomLeftPanel); constraints.insets = new Insets(0,0,10,0); gridbag.setConstraints(leftPanel, constraints); add(leftPanel); Panel rightPanel = new Panel(); rightPanel.setLayout(new BorderLayout()); constraints.weightx=0.25; constraints.insets = new Insets(0,0,15,10); gridbag.setConstraints(rightPanel, constraints); add(rightPanel); topRightPanel = new Panel(); topRightPanel.setLayout(gridbag); constraints.gridheight = 3; constraints.gridwidth=1; constraints.weightx=1.; constraints.weighty = 0.75; constraints.insets = new Insets(30,0,0,10); constraints.fill=GridBagConstraints.NONE; String[] buttonLabels={"Reset","Clear", "Start"," Step"," Stop"}; buttons = new buttonControls((dynamicGraph) this, buttonLabels,buttonLabels.length,false); buttons.b_init[0] = true; buttons.b_stopped[4] = false; buttons.b_started[1] = true; buttons.b_started[4] = true; buttons.setup(); gridbag.setConstraints(buttons, constraints); topRightPanel.add(buttons); String[] textboxes1 = {"3.5","0.","1","0","0.","0.2","0"}; String[] labels1 = {" a "," b ","Compose", "Transient","Delta-x","Start x","Window"}; variables = new textControls((dynamicGraph) this,textboxes1,labels1,textboxes1.length,5); constraints.gridwidth = GridBagConstraints.REMAINDER; constraints.insets = new Insets(30,0,0,10); gridbag.setConstraints(variables, constraints); topRightPanel.add(variables); functionChoice = new Choice(); functionChoice.addItem("Quadratic"); functionChoice.addItem("Sine"); functionChoice.addItem("Tent"); functionChoice.addItem("Power law"); functionChoice.addItem("Circle"); functionChoice.addItem("Shift"); functionChoice.addItem("Cubic"); functionChoice.addItem("My Function"); constraints.gridwidth=1; constraints.weighty = 0.2; constraints.gridheight=1; constraints.gridwidth=GridBagConstraints.REMAINDER; constraints.insets = new Insets(0,0,0,0); gridbag.setConstraints(functionChoice, constraints); topRightPanel.add(functionChoice); plotChoice = new Choice(); plotChoice.addItem("Time Series"); plotChoice.addItem("Spectrum"); plotChoice.addItem("Histogram"); plotChoice.addItem("Bifurcation"); plotChoice.addItem("Lyapunov"); constraints.gridwidth=1; constraints.weighty = 0.2; constraints.gridheight=1; constraints.gridwidth=GridBagConstraints.REMAINDER; constraints.insets = new Insets(0,0,0,0); gridbag.setConstraints(plotChoice, constraints); topRightPanel.add(plotChoice); String[] choiceLabels={"Show Time:"}; choices = new choiceControls((dynamicGraph) this, choiceLabels); constraints.weighty = 0.25; constraints.gridheight = 1; gridbag.setConstraints(choices, constraints); topRightPanel.add(choices); choices.setState(0,true); showTime=true; theMovie.toSleep=true; rightPanel.add("Center",topRightPanel); status=new Label(" "); rightPanel.add("South",status); graph.clearAll=true; repaint(); /* Setup run */ buttons.enableGo(); if(target.inputParameters) { function=target.function; functionChoice.select(function); plot=target.plot ; plotChoice.select(plot); setFunctionDefaults(); setPlotDefaults(); for(int i=0;i * (May fail under Windows95) */ //************************************************************************ public boolean handleEvent(Event evt) { switch (evt.id) { case Event.WINDOW_DESTROY: movieStop(); outerparent.hideWindow(); return super.handleEvent(evt); case Event.WINDOW_ICONIFY: movieStop(); buttons.enableGo(); enableAll(); return super.handleEvent(evt); case Event.ACTION_EVENT: if(evt.target == functionChoice || evt.target == plotChoice) { function = functionChoice.getSelectedIndex(); if(evt.target == functionChoice) { setFunctionDefaults(); setPlotDefaults(); } plot = plotChoice.getSelectedIndex(); if(evt.target == plotChoice) { setPlotDefaults(); } topRightPanel.validate(); updateParameters(); resetRange(); restart(); } return super.handleEvent(evt); default: return super.handleEvent(evt); } } //************************************************************************ /** * Disables text input and choice controls */ //************************************************************************ public void disableAll() { int i; for(i=0;i1) parameters[1]=b; mapFunction.setParameters(parameters); diagnostics.updateParameters(); } //********************************************************************* /** * Resets plot */ //********************************************************************* public void restart() { status.setText(""); diagnostics.restart(); } //********************************************************************* /** * Deletes all curves from graph * @return -1 for no curves */ //********************************************************************* public int resetGraph() { return graph.deleteAllCurves(); } //********************************************************************* /** * Iterates Map equations and updates graph according to value of plot */ //********************************************************************* public boolean iterate() { return diagnostics.iterate(); } //********************************************************************** /** * Stop movie thread */ //********************************************************************** public void stop() { movieStop(); enableAll(); } /**********************************************************************/ public void updateSpeed(int in_delay) { delay=in_delay; if(diagnostics != null) diagnostics.setDelay(delay); } //********************************************************************** /** * Sets default values of parameters depending on function number */ //********************************************************************** private void setFunctionDefaults() { switch (function) { case QUADRATIC: mapFunction = new QuadraticFunction(); break; case SINE: mapFunction = new SineFunction(); break; case TENT: mapFunction = new TentFunction(); break; case POWER: mapFunction = new PowerFunction(); break; case CIRCLE: mapFunction = new CircleFunction(); break; case SHIFT: mapFunction = new ShiftFunction(); break; case CUBIC: mapFunction = new CubicFunction(); break; case MYFUNCTION: mapFunction = new Map1DMyFunction(); break; } nParameters=mapFunction.getNParameters(); parameters = new double[nParameters]; if(nParameters==2) variables.show(1); else variables.hide(1); variables.setText(0, String.valueOf(mapFunction.aDefault[0])); if(nParameters==2) variables.setText(1, String.valueOf(mapFunction.aDefault[1])); variables.setText(5, String.valueOf(mapFunction.x0Default)); topRightPanel.validate(); } //********************************************************************** /** * Sets default values of parameters depending on plot type */ //********************************************************************** private void setPlotDefaults() { switch (plot) { case TIMESERIES: diagnostics = new Map1DTimeSeries(this); break; case FOURIER: diagnostics = new Map1DFourier(this); break; case BIN: diagnostics = new Map1DBin(this); diagnostics.setDelay(delay); break; case BIFURCATION: diagnostics = new Map1DBifurcation(this); break; case LYAPUNOV: diagnostics = new Map1DLyapunov(this); break; default: diagnostics = new Map1DTimeSeries(this); break; } diagnostics.setPlotDefaults(); if(diagnostics.hideab) { variables.hide(0); } else variables.show(0); topRightPanel.validate(); } //********************************************************************** //********************************************************************** /** * Resets x-range to 0 < x < 1 */ //********************************************************************** private void resetRange() { diagnostics.resetRange(); } //********************************************************************** //********************************************************************** /** * Responds to mouse events * @param xcoord x-coordinate of mouse click * @param xcoordValid true if x-coordinate of mouse click within graph * @param ycoord y-coordinate of mouse click * @param ycoordValid true if y-coordinate of mouse click within graph */ //********************************************************************** public void respondToMouse(double xcoord, boolean xcoordValid, double ycoord, boolean ycoordValid){ double exchange; if(aThread != null) { // if(!clicked) { // clicked=true; // Need to eliminate mouseup event in jdk1.0 if(xcoordValid && ycoordValid && (xcoord != xmouse) && (ycoord !=ymouse)) { xmouse=xcoord; ymouse=ycoord; diagnostics.respondToClick(xcoord,ycoord); } // } // else clicked=false; } else { if(xcoordValid && ycoordValid) { if(!clicked) { xmouse=xcoord; ymouse=ycoord; clicked=true; } else { clicked=false; if(xmouse != xcoord) { xmax=xcoord; xmin=xmouse; if(xmin > xmax) { exchange=xmin; xmin=xmax; xmax=exchange; } setAxesRange=true; } if(ymouse != ycoord) { ymax=ycoord; ymin=ymouse; if(ymin > ymax) { exchange=ymin; ymin=ymax; ymax=exchange; } setAxesRange=true; } if(setAxesRange) diagnostics.respondToDrag(xmin,xmax,ymin,ymax); } } else { clicked=false; buttons.enableGo(); resetRange(); updateParameters(); restart(); graph.paintAll=true; graph.repaint(); } } } //********************************************************************** /** * Sets visibility and content of variables textboxes 3,4 ... * @param label text for label of each box ("" makes invisible) */ //********************************************************************** public void setPlotTextBoxes(String[] label, String[] text) { for(int i=0;i