package lorenz_v01; //import java.io.*; //import java.math.* ; import java.awt.* ; import java.awt.event.* ; import java.applet.* ; /* TTD: 0 ActionListener is the class that is not letting me load in netscape 3.x 0 set the font for Sun to be able to see the input screen. 1 I should be able to figure out using trigenometry, not ask each cup! f(wheelDegree,MyDegree,CupWidth,NumberOfCups) with a max of 3 cups to test! The transfer of water from cup to cup is not right. When one is above the other, the bottom one goes down! 1 draw lines from cup outflow to cup inflow connecting cups that are receiving water (as a debugging aid. 1 Get a better first setting. 2 Draw water flowing from cup to cup and from cup to floor and from spout to cup or floor. 2 Improve performance of cup drawing. Maybe make an array of 100 cup images. (one for each % full) assume < 100 pixels) (also too many loops...) 2 try different display mode 800 x 600 2 text field didn't work in netscape 4.05 3 improve control panel e.g. Tab Folder Control panel - ------ complete: ----- c Scalability - key all calcs off of size dimention c alter the cup width displayed to match the cup-top-opening degrees value c Scalability - Make the wheel scalable by drag-to-resize c Make the size of the cup determine the border size! (make it larger or min (10/20) made it a parameter c Add synchronization to prevent weird cup update situations added sleep in pause methods c try to have the Mass Point dot be traced w/ different colors and make a trail c Add display of velocity/acceleration/position ? how? graph? scroll-like-bar? text as well? c add flow-through to the cup below... (try uncommenting the code I had for it. but more complicated since the cup above may not have and liquid!_The_Wheel) c Put it in an Applet! Make VToys.html major home page. c add description and documentation Web Pages panel... c Spout - Make it brown with blue & white stream flowing down each repaint c Why are some of the cups green and red? c Markers on the full line bar. c force background to white. c reset should reset everything line the color map array indicator too. c Add indicator of instananeous outflow from bottom! Wheel.totalFlowOutBottom c set initial velocity c refresh after reset of parms */ public class Lorenz extends Applet implements Runnable , ActionListener { LorenzWheel myWheel ; Thread myThread ; Thread myWheelThread ; Frame myWheelFrame ; TextField numberOfCups ; // number of cups on the wheel TextField gravityForce ; // ft per second per second TextField pixelsPerFt ; // scale of the diagram TextField drawBorder ; // scale of the diagram TextField frictionFactor ; // TextField spoutFlowRate ; // gallons per hour TextField cupTopOpeningDegrees ; // How big (in degrees) is the top opening of the cup? TextField cupHoleOutFlowRate ; // What is the flow rate out fo the cups in gallons per hour TextField wheelEmptyMass ; // Initial mass of wheel in pounds TextField waterDensity ; // lbs per Gallon TextField ozInCupMax ; // When does the cup overflow (10 oz cup) (16.0d/8.0d for gallons) TextField initialOffsetDegrees ; TextField initialVelocity ; TextField milliSecsPerStep ; TextField stepsPerDisplayUpdate ; Checkbox traceMass ; TextField traceMassSize ; TextField colorChangeCount ; Checkbox fillsBelow ; Button action_For_Wheel ;// Button apply_These_Values ;// Button reset_The_Wheel ;// Button clear_Background ;// Button exit_The_Wheel ;// Panel fieldLabels ; Panel fieldValues ; Panel fieldButtons ; // This permits a stand-alone execution // public static void main(String[] args) { // //System.out.println("I: "+Thread.currentThread()+" Lorenz.main() called."); // Frame f = new Frame("Lorenz"); // Lorenz aLorenz = new Lorenz(); // f.setSize(400, 500); // f.add("Center", aLorenz); // f.show(); // actually puts the Lorenz frame on the screen // aLorenz.init() ; // aLorenz.repaint() ; // aLorenz.start() ; // } public Lorenz() { super(); //System.out.println("I: "+Thread.currentThread()+" Lorenz.Lorenz() called."); } /** * */ @Override public void init() { //System.out.println("I: "+Thread.currentThread()+" Lorenz.init() called."); // Set up the Lorenz Wheel separate Window myWheelFrame = new Frame("Lorenz Wheel"); myWheelFrame.setVisible(true); // was show() myWheelFrame.setBackground(Color.white); // was show() myWheel = new LorenzWheel(this); myWheelFrame.setLayout(new BorderLayout()); myWheelFrame.add("Center", myWheel); myWheelFrame.setSize(500, 500); setBackground(Color.white); // Set up the Control panel on this applet setupLorenzControls(); this.repaint(); // Set the wheel parameters and init() the wheel myWheel.init(); setWheelToControlValues(); //repaint(); } @Override public void start() { // GOOD! //System.out.println("I: "+Thread.currentThread()+" Lorenz.start() called."); // if ( myThread == null ) { // myThread = new Thread(this); // myThread.start() ; // } else { // System.out.println("W: Lorenz.start() called when myThread is already running."); // } if ( myWheelThread == null ) { myWheel.repaint() ; myWheelThread = new Thread(myWheel); //myWheelFrame.setVisible(true); myWheel.setPaused(true); myWheelFrame.setVisible(true); myWheelThread.start() ; } else { System.out.println("W: Lorenz.start() called when myWheelThread is already running."); } } @Override public void stop() { // GOOD! //System.out.println("I: "+Thread.currentThread()+" Lorenz.stop() called."); // if ( myThread != null ) { // myThread.stop() ; // myThread = null ; // de-allocate the thread reference // } else { // System.out.println("W: Lorenz.stop() called when myThread is already stopped."); // } if ( myWheelThread != null ) { myWheel.setPaused(true); //FUTURE: Synchronize this call so that we are guaranteed it has really stopped. myWheelThread.stop() ; myWheelFrame.setVisible(false); myWheelThread = null ; // de-allocate the thread reference } else { System.out.println("W: Lorenz.stop() called when myWheelThread is already stopped."); } } @Override public void run() { //System.out.println("I: "+Thread.currentThread()+" Lorenz.run() called."); } @Override public void update( Graphics g) { //System.out.println("I: "+Thread.currentThread()+" Lorenz.update() called."); super.update(g) ; } @Override public void paint( Graphics g) { //System.out.println("I: "+Thread.currentThread()+" Lorenz.paint() called."); super.paint(g) ; } public void repaint( Graphics g) { super.repaint() ; //System.out.println("I: "+Thread.currentThread()+" Lorenz.repaint() called."); } public void setupLorenzControls() { //System.out.println("I: "+Thread.currentThread()+" Lorenz.setupLorenzControls() called."); setLayout( new BorderLayout()); // Layout of the entire applet window fieldLabels = new Panel(); fieldLabels.setLayout( new GridLayout(27,1)); // Physical Constants fieldLabels.add(new Label(" ",Label.RIGHT)); fieldLabels.add(new Label("--- Popular Parameters -----",Label.RIGHT)); fieldLabels.add(new Label("Spout Flow Rate (Gal/Hr)",Label.RIGHT)); fieldLabels.add(new Label("Cup Out-Flow Rate (Gal/Hr)",Label.RIGHT)); fieldLabels.add(new Label("Number of Cups",Label.RIGHT)); fieldLabels.add(new Label("Cup Top Opening Size (Degrees)",Label.RIGHT)); fieldLabels.add(new Label(" ",Label.RIGHT)); fieldLabels.add(new Label("--- Timing & Display parameters -----",Label.RIGHT)); fieldLabels.add(new Label("Milliseconds per Step (ms):",Label.RIGHT)); fieldLabels.add(new Label("Steps per Re-Display:",Label.RIGHT)); fieldLabels.add(new Label("Trace Center of Mass:",Label.RIGHT)); fieldLabels.add(new Label("Trace Dot Size (pixels):",Label.RIGHT)); fieldLabels.add(new Label("Steps with Each Trace Color:",Label.RIGHT)); fieldLabels.add(new Label(" ",Label.RIGHT)); fieldLabels.add(new Label("--- Physical Constants ------",Label.RIGHT)); fieldLabels.add(new Label("Gravity (ft/sec/sec):",Label.RIGHT)); fieldLabels.add(new Label("Water Density (lb/Gal):",Label.RIGHT)); fieldLabels.add(new Label("Scale (pixels/ft):",Label.RIGHT)); fieldLabels.add(new Label("Border Size (pixels):",Label.RIGHT)); fieldLabels.add(new Label(" ",Label.RIGHT)); fieldLabels.add(new Label("--- Wheel Parameters -------",Label.RIGHT)); fieldLabels.add(new Label("Initial Wheel Offset (Degrees):",Label.RIGHT)); fieldLabels.add(new Label("Initial Velocity (ft/sec):",Label.RIGHT)); fieldLabels.add(new Label("Wheel Friction Factor:",Label.RIGHT)); fieldLabels.add(new Label("Wheel Mass Empty (lbs)",Label.RIGHT)); fieldLabels.add(new Label("Max Oz in a Cup (Oz):",Label.RIGHT)); fieldLabels.add(new Label("Water goes into cups underneath:",Label.RIGHT)); add(fieldLabels,"Center"); fieldValues = new Panel(); fieldValues.setLayout( new GridLayout(27,1)); fieldValues.add(new Label(" ",Label.LEFT)); fieldValues.add(new Label("------------------",Label.LEFT)); fieldValues.add(spoutFlowRate = new TextField("20.0",6)); fieldValues.add(cupHoleOutFlowRate = new TextField("3.0",6)); fieldValues.add(numberOfCups = new TextField("16",6)); fieldValues.add(cupTopOpeningDegrees = new TextField("22.5",6)); fieldValues.add(new Label(" ",Label.LEFT)); fieldValues.add(new Label("------------------",Label.LEFT)); fieldValues.add(milliSecsPerStep = new TextField("4",6)); fieldValues.add(stepsPerDisplayUpdate = new TextField("20",6)); fieldValues.add(traceMass = new Checkbox()); traceMass.setState(false) ; fieldValues.add(traceMassSize = new TextField("2",6)); fieldValues.add(colorChangeCount = new TextField("200",6)); fieldValues.add(new Label(" ",Label.LEFT)); fieldValues.add(new Label("------------------",Label.LEFT)); fieldValues.add(gravityForce = new TextField("32.0",6)); fieldValues.add(waterDensity = new TextField("8.0",6)); fieldValues.add(pixelsPerFt = new TextField("100",6)); fieldValues.add(drawBorder = new TextField("100",6)); fieldValues.add(new Label(" ",Label.LEFT)); fieldValues.add(new Label("------------------",Label.LEFT)); fieldValues.add(initialOffsetDegrees = new TextField("8",6)); fieldValues.add(initialVelocity = new TextField("0",6)); fieldValues.add(frictionFactor = new TextField("0.995",6)); fieldValues.add(wheelEmptyMass = new TextField("1.0",6)); fieldValues.add(ozInCupMax = new TextField("10.0",6)); fieldValues.add(fillsBelow = new Checkbox()); fillsBelow.setState(true) ; add(fieldValues,"East"); fieldButtons = new Panel(); action_For_Wheel = new Button("Start Wheel"); action_For_Wheel.addActionListener(this); fieldButtons.add(action_For_Wheel); apply_These_Values = new Button("Apply Values"); apply_These_Values.addActionListener(this); fieldButtons.add(apply_These_Values); clear_Background = new Button("Clear Background"); clear_Background.addActionListener(this); fieldButtons.add(clear_Background); reset_The_Wheel = new Button("Reset"); reset_The_Wheel.addActionListener(this); fieldButtons.add(reset_The_Wheel); exit_The_Wheel = new Button("Done"); exit_The_Wheel.addActionListener(this); fieldButtons.add(exit_The_Wheel); add(fieldButtons,"North"); } @Override public void processEvent(AWTEvent e) { System.out.println("I: "+Thread.currentThread()+" Lorenz.processEvent() called. event=" + e.getID() ); if (e.getID() == Event.WINDOW_DESTROY) { System.out.println("I: "+Thread.currentThread()+" Lorenz.java: System.exit(0) called" ); stop(); myWheelFrame.setVisible(false); setVisible(false); myWheel = null; myWheelFrame = null; System.exit(0); } } /** * * @param ev */ @Override public void actionPerformed(ActionEvent ev) { //System.out.println("I: "+Thread.currentThread()+" Lorenz.actionPerformed() called. getActionCommand=" + ev.getActionCommand() ); String label = ev.getActionCommand(); if (null == label) { System.out.println("E: ERROR ERROR !!!! Unexpected label: " + label); }else switch (label) { case "Pause Wheel": myWheel.setPaused(true); action_For_Wheel.setLabel("Resume"); break; case "Resume": myWheel.setPaused(false); action_For_Wheel.setLabel("Pause Wheel"); break; case "Start Wheel": myWheel.setPaused(true); setWheelToControlValues(); myWheel.setPaused(false); action_For_Wheel.setLabel("Pause Wheel"); break; case "Clear Background": myWheel.clearBackground(); myWheel.repaint(); break; case "Reset": myWheel.setPaused(true); myWheel.stopAndEmptyWheel(); myWheel.createNewCups(); myWheel.setCupsDisplayParameters(); myWheel.repaint(); action_For_Wheel.setLabel("Start Wheel"); break; case "Apply Values": setWheelToControlValues(); myWheel.repaint(); break; case "Done": stop(); //System.exit(0) ; break; default: System.out.println("E: ERROR ERROR !!!! Unexpected label: " + label); break; } } void setWheelToControlValues() { //System.out.println("I: "+Thread.currentThread()+" Lorenz.setWheelToControlValues() called. "); boolean pauseStatus ; pauseStatus = myWheel.isPaused(); myWheel.setPaused(true); int oldnumberOfCups = myWheel.numberOfCups ; myWheel.numberOfCups = Integer.parseInt( numberOfCups.getText().trim() ); myWheel.gravityForce = Double.parseDouble( gravityForce.getText().trim()) ; myWheel.pixelsPerFt = Double.parseDouble( pixelsPerFt.getText().trim()) ; myWheel.drawBorder = Integer.parseInt( drawBorder.getText().trim() ); myWheel.frictionFactor = Double.parseDouble( frictionFactor.getText().trim()) ; myWheel.spoutFlowRate = Double.parseDouble( spoutFlowRate.getText().trim()) ; myWheel.cupTopOpeningDegrees = Double.parseDouble( cupTopOpeningDegrees.getText().trim()) ; myWheel.cupHoleOutFlowRate = Double.parseDouble( cupHoleOutFlowRate.getText().trim()) ; myWheel.wheelEmptyMass = Double.parseDouble( wheelEmptyMass.getText().trim()) ; myWheel.waterDensity = Double.parseDouble( waterDensity.getText().trim()) ; myWheel.gallonsInCupMax = Double.parseDouble( ozInCupMax.getText().trim())/16.0d/8.0d ; myWheel.initialOffsetDegrees = Double.parseDouble( initialOffsetDegrees.getText().trim()) ; myWheel.initialVelocity = Double.parseDouble( initialVelocity.getText().trim()) ; myWheel.milliSecsPerStep = Integer.parseInt( milliSecsPerStep.getText().trim() ) ; myWheel.stepsPerDisplayUpdate = Integer.parseInt( stepsPerDisplayUpdate.getText().trim() ); myWheel.traceMass = traceMass.getState(); myWheel.traceMassSize = Integer.parseInt( traceMassSize.getText().trim() ); myWheel.colorChangeCount = Integer.parseInt( colorChangeCount.getText().trim() ); myWheel.fillsBelow = fillsBelow.getState(); if ( myWheel.numberOfCups != oldnumberOfCups ) { // must reset the cups if we change it! myWheel.stopAndEmptyWheel(); myWheel.createNewCups(); myWheel.setCupsDisplayParameters(); myWheel.clearBackground(); } else { } myWheel.setPaused(pauseStatus); } /** * * @return */ @Override public String getAppletInfo() { //System.out.println("I: "+Thread.currentThread()+" Lorenz.getAppletInfo() called. "); return "This is an example of \na lorenz water wheel."; } }