import java.awt.*; import java.applet.*; public class osc extends Applet implements Runnable{ Thread moveThread; private static final int MOVEPAUSE = 40; public boolean myGo=false; public boolean myReset=true; mycan c; public Image offScreenImage; double kSpring = 16.0; double mSpring = 1.0; public void start() { // Start up a thread if(myGo) { if(moveThread == null){ moveThread = new Thread(this); moveThread.start(); } } } public void stop() { // Stop the thread we started if(moveThread != null){ moveThread.stop(); try { moveThread.join(); } catch (InterruptedException e) { } } moveThread=null; } public void run() { while (true){ try { moveThread.sleep(MOVEPAUSE); }catch(InterruptedException e) { } c.repaint(); } } public void setMyLogicals(boolean goButton,boolean reset){ myGo=goButton; myReset=reset; if(myGo){ if(moveThread == null) { moveThread = new Thread(this); moveThread.start(); } } else { if(moveThread != null) { moveThread.stop(); try { moveThread.join(); } catch (InterruptedException e) { } } moveThread = null; } if(myReset){ c.repaint(); } } public void init() { super.init(); int i,j,x; setBackground(Color.white); offScreenImage = createImage(500,300); c = new mycan(this,offScreenImage); //{{INIT_CONTROLS setLayout(new BorderLayout(0,0)); resize(500,350); p1 = new java.awt.Panel(); p1.setLayout(new GridLayout(0,5,3,3)); p1.reshape(0,0,500,50); p1.setBackground(new Color(16777215)); add("North", p1); goButton = new java.awt.Button("Start"); goButton.setFont(new Font("TimesRoman", Font.BOLD, 14)); goButton.setBackground(new Color(65280)); p1.add(goButton); stopButton = new java.awt.Button("Stop"); stopButton.setFont(new Font("TimesRoman", Font.BOLD, 14)); stopButton.setBackground(new Color(16711680)); p1.add(stopButton); resetButton = new java.awt.Button("Reset"); resetButton.setFont(new Font("TimesRoman", Font.BOLD, 14)); resetButton.setBackground(new Color(16762880)); p1.add(resetButton); kLabel = new java.awt.Label("k=16 N/m",Label.CENTER); kLabel.setFont(new Font("TimesRoman", Font.PLAIN, 12)); p1.add(kLabel); mLabel = new java.awt.Label("m=1 kg",Label.CENTER); mLabel.setFont(new Font("TimesRoman", Font.PLAIN, 12)); p1.add(mLabel); label1 = new java.awt.Label(""); p1.add(label1); label2 = new java.awt.Label(""); p1.add(label2); label3 = new java.awt.Label(""); p1.add(label3); kScroll = new java.awt.Scrollbar(Scrollbar.HORIZONTAL,16,16,1,100); p1.add(kScroll); mScroll = new java.awt.Scrollbar(Scrollbar.HORIZONTAL,10,10,1,100); p1.add(mScroll); add("Center",c); //} } public boolean handleEvent(Event evt){ String label; // Scrollbar if(evt.target == kScroll){ kSpring = Math.round(kScroll.getValue()); kLabel.setText("k="+kSpring+" N/m"); c.omega = (double)Math.sqrt(kSpring/mSpring); c.it = 0; return true; } else if (evt.target == mScroll){ mSpring = 0.1*Math.round(mScroll.getValue()); mLabel.setText("m="+mSpring+" kg"); c.omega = (double)Math.sqrt(kSpring/mSpring); c.it = 0; return true; // Read the four buttons and set the scenario } else if ((evt.target instanceof Button) && (evt.id == Event.ACTION_EVENT)){ label=((Button) evt.target).getLabel(); // Buttons if(label.equals("Start")){ c.theColor++; if (c.theColor == 6) c.theColor = 1; setMyLogicals(true,false); } if(label.equals("Stop")){ setMyLogicals(false,false); } if(label.equals("Reset")){ setMyLogicals(false,true); } return true; } return false; } //{{DECLARE_CONTROLS java.awt.Panel p1; java.awt.Label label1; java.awt.Label label2; java.awt.Label label3; java.awt.Label kLabel; java.awt.Label mLabel; java.awt.Scrollbar kScroll; java.awt.Scrollbar mScroll; java.awt.Button goButton; java.awt.Button stopButton; java.awt.Button resetButton; //}} } class mycan extends java.awt.Canvas { boolean inTow=false; public int yMass = 250; public int xMass = 250; public int ytop = 240; public int y0 = 250; public int dy; public int it = 0; public int xMold, yMold; public double omega = 4.0; public int theColor = 1; Image offScreenImage; osc a; public mycan(osc myApplet, Image myImage) { offScreenImage = myImage; a = myApplet; resize(500,300); repaint(); } public void update(Graphics g){ Graphics offg = offScreenImage.getGraphics(); //offg.setColor(getBackground()); //offg.fillRect(0, 0, 500, 300); //offg.setColor(Color.white); paint(offg); g.drawImage(offScreenImage, 0, 0, this); } public void drawMass(Graphics g){ g.setColor(Color.white); g.fillRect(0,0,50,300); g.setColor(Color.red); g.fillRect(2,ytop,46,20); g.setColor(Color.darkGray); g.fillRect(4,ytop+2,42,16); g.setColor(Color.black); g.fillOval(24,ytop+9,3,3); g.fillRect(0,0,50,10); } public void drawCoordinates(Graphics g){ g.setColor(Color.white); // white later g.fillRect(50,0,450,300); g.setColor(Color.black); g.drawLine(100,150,490,150); // x-axis g.drawLine(200,148,200,152); g.drawLine(300,148,300,152); g.drawLine(400,148,400,152); g.drawString(" 5 s",190,165); g.drawString("10 s",290,165); g.drawString("15 s",390,165); g.drawString("t",490,145); g.drawLine(100,10,100,290); // y-axis g.drawLine(98,50,102,50); g.drawLine(98,250,102,250); g.drawString(" 5 cm",55,50); g.drawString("-5 cm",55,250); g.drawString("x",105,10); } public void drawSpring(int nt, int yhigh, int ylow, Graphics g){ double denom = 2.0*nt + 1.0; g.drawLine(25,ylow,45,(int)(ylow+0.5*(yhigh-ylow)/denom)); for (int i = 1; i < 2*nt; i=i+2){ g.drawLine(45,(int)(ylow+(i-0.5)*(yhigh-ylow)/denom), 5,(int)(ylow+(i+0.5)*(yhigh-ylow)/denom)); g.drawLine(45,(int)(ylow+(i+1.5)*(yhigh-ylow)/denom), 5,(int)(ylow+(i+0.5)*(yhigh-ylow)/denom)); } g.drawLine(45,(int)(ylow+(2.*nt+0.5)*(yhigh-ylow)/denom),25,ytop); } public void paint(Graphics g){ // Draw everything if (a.myReset) { g.setColor(Color.white); g.fillRect(0, 0, 500, 300); drawCoordinates(g); // makes new coordinate system it = 0; theColor = 1; a.myReset = false; } if (a.myGo && it < 400) { // moving mass and plotting double t = (double)it/20.0; xMass = it + 100; yMass = 150 + (int)((y0-150)*Math.cos((double)(omega*t))); if (theColor == 1) g.setColor(Color.red); if (theColor == 2) g.setColor(Color.blue); if (theColor == 3) g.setColor(Color.green); if (theColor == 4) g.setColor(Color.cyan); if (theColor == 5) g.setColor(Color.magenta); if (it > 0) g.drawLine(xMass,yMass,xMold,yMold); xMold = xMass; yMold = yMass; ytop = yMass - 10; it++; } if (it == 400) a.myGo = false; drawMass(g); drawSpring(9,ytop-1,10,g); drawSpring(9,ytop,11,g); } public boolean handleEvent(Event evt){ if (evt.target == this && evt.id == Event.MOUSE_DOWN) { osc_MouseDown(evt); return true; } if (evt.target == this && evt.id == Event.MOUSE_DRAG) { osc_MouseDrag(evt); return true; } if (evt.target == this && evt.id == Event.MOUSE_UP) { osc_MouseUp(evt); return true; } return false; } void osc_MouseDrag(Event event) { if (inTow) { yMass = event.y - dy; y0 = yMass; ytop = yMass - 10; repaint(); it = 0; } } void osc_MouseDown(Event event) { dy = event.y - yMass; if (event.x < 50 && (int)Math.abs(dy) < 15) { inTow = true; a.myGo = false; } } void osc_MouseUp(Event event) { inTow = false; } }