import java.awt.*; import java.awt.event.*; import java.lang.*; import java.lang.Math; public class Rotation1 extends java.applet.Applet implements Runnable { Canvas oscillators; Label massRedLabel, massBlueLabel, massPulleyLabel, massRedS, massBlueS, massPulleyS; Button Start; Thread runner; Scrollbar redMscroll, blueMscroll, redVscroll, blueVscroll; int redMass, blueMass, pulleyMass; double redM, blueM, pulleyM, accel, redTension, blueTension, theta, alpha, pulleyRadius; int[] xpos = new int[2]; double[] x = new double[2]; Image offscreenImg; Graphics offscreenG; boolean startFlag = false; void buildConstraints(GridBagConstraints gbc, int gx, int gy, int gw, int gh, int wx, int wy) { gbc.gridx = gx; gbc.gridy = gy; gbc.gridwidth = gw; gbc.gridheight = gh; gbc.weightx = wx; gbc.weighty = wy; } public void init() { GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints constraints = new GridBagConstraints(); setLayout(gridbag); xpos[0] = 300; xpos[1] = 300; // Red mass text buildConstraints(constraints, 0, 0, 1, 1, 20, 5); constraints.fill = GridBagConstraints.NONE; constraints.anchor = GridBagConstraints.EAST; Label massRedLabel = new Label("Mass of red block (kg):", Label.CENTER); gridbag.setConstraints (massRedLabel, constraints); add(massRedLabel); // Red mass scrollbar label buildConstraints(constraints, 2, 0, 1, 1, 20, 0); constraints.fill = GridBagConstraints.HORIZONTAL; massRedS = new Label("4", Label.LEFT); redMass = 4; gridbag.setConstraints (massRedS, constraints); add(massRedS); // Red mass scrollbar buildConstraints(constraints, 1, 0, 1, 1, 20, 0); constraints.fill = GridBagConstraints.HORIZONTAL; constraints.anchor = GridBagConstraints.WEST; redMscroll = new Scrollbar(Scrollbar.HORIZONTAL, 4, 1, 1, 10); gridbag.setConstraints (redMscroll, constraints); add(redMscroll); // Blue mass text buildConstraints(constraints, 0, 1, 1, 1, 20, 5); constraints.fill = GridBagConstraints.NONE; constraints.anchor = GridBagConstraints.EAST; Label massBlueLabel = new Label("Mass of blue block (kg):", Label.CENTER); gridbag.setConstraints (massBlueLabel, constraints); add(massBlueLabel); // Blue mass scrollbar label buildConstraints(constraints, 2, 1, 1, 1, 20, 0); constraints.fill = GridBagConstraints.HORIZONTAL; massBlueS = new Label("5", Label.LEFT); blueMass = 5; gridbag.setConstraints (massBlueS, constraints); add(massBlueS); // Blue mass scrollbar buildConstraints(constraints, 1, 1, 1, 1, 20, 0); constraints.fill = GridBagConstraints.HORIZONTAL; constraints.anchor = GridBagConstraints.WEST; blueMscroll = new Scrollbar(Scrollbar.HORIZONTAL, 5, 1, 0, 10); gridbag.setConstraints (blueMscroll, constraints); add(blueMscroll); // Red speed text buildConstraints(constraints, 0, 2, 1, 1, 20, 5); constraints.fill = GridBagConstraints.NONE; constraints.anchor = GridBagConstraints.EAST; Label massPulleyLabel = new Label("Mass of the pulley (kg):", Label.CENTER); gridbag.setConstraints (massPulleyLabel, constraints); add(massPulleyLabel); // Red speed scrollbar label buildConstraints(constraints, 2, 2, 1, 1, 20, 0); constraints.fill = GridBagConstraints.HORIZONTAL; massPulleyS = new Label("0", Label.LEFT); pulleyMass = 0; gridbag.setConstraints (massPulleyS, constraints); add(massPulleyS); // Red speed scrollbar buildConstraints(constraints, 1, 2, 1, 1, 20, 0); constraints.fill = GridBagConstraints.HORIZONTAL; constraints.anchor = GridBagConstraints.WEST; redVscroll = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 25); gridbag.setConstraints (redVscroll, constraints); add(redVscroll); // Start button buildConstraints(constraints, 1, 3 , 1, 1, 0, 10); constraints.fill = GridBagConstraints.HORIZONTAL; constraints.anchor = GridBagConstraints.WEST; Start = new Button("Start"); gridbag.setConstraints (Start, constraints); add(Start); // canvas buildConstraints(constraints, 0, 4, 3, 1, 0, 80); constraints.fill = GridBagConstraints.HORIZONTAL; oscillators = new Canvas(); gridbag.setConstraints (oscillators, constraints); add(oscillators); offscreenImg = createImage(this.size().width, this.size().height); offscreenG = offscreenImg.getGraphics(); } public void start() { if (runner == null); { runner = new Thread(this); runner.start(); } } public void stop() { if (runner != null) { runner.stop(); runner = null; } } public void run() { int index; double g, scale, t, deltat, dist; deltat=0.5; boolean beforeFlag; beforeFlag = true; startFlag = false; g = 9.8; scale = 0.01; pulleyRadius = 0.1; while (true) { beforeFlag = true; redM = (int)(redMass); blueM = (int)(blueMass); pulleyM = pulleyMass; t = 0.0; x[0] = 300.0; xpos[0] = (int)(x[0]); x[1] = 300.0; xpos[1] = (int)(x[1]); accel = g*(blueM-redM)/(blueM+redM+0.5*pulleyM); redTension = redM*(g+accel); blueTension = blueM*(g-accel); theta = 0.0; alpha = accel/pulleyRadius; while (startFlag) { while (startFlag) { t = t + deltat; dist = 0.5*accel*t*t; if (dist>74.0) dist = 74.0; if (dist<-74.0) dist = -74.0; theta = scale*dist/pulleyRadius; x[0] = 300.0-dist; xpos[0] = (int)(x[0]); x[1] = 300.0+dist; xpos[1] = (int)(x[1]); repaint(); try { Thread.sleep(100); } catch (InterruptedException e) { } } } repaint(); try { Thread.sleep(1); } catch (InterruptedException e) { } } } public void update(Graphics g) { paint(g); } public void paint(Graphics g) { int i, yVal; // Draw background offscreenG.setColor(Color.lightGray); offscreenG.fillRect(0,0,400,199); offscreenG.setColor(Color.white); offscreenG.fillRect(0,200,400,200); // Draw mass offscreenG.setColor(Color.red); offscreenG.fillRect(52,xpos[0],16,16); offscreenG.drawLine(60,xpos[0],60,215); offscreenG.drawString("Tension in red string = " + redTension + " N", 130, 320); offscreenG.setColor(Color.blue); offscreenG.fillRect(72,xpos[1],16,16); offscreenG.drawLine(80,xpos[1],80,215); offscreenG.drawString("Tension in blue string = " + blueTension + " N", 130, 340); offscreenG.setColor(Color.darkGray); offscreenG.fillOval(60,205,20,20); offscreenG.drawString("Acceleration of the blocks = " + accel + " m/s^2", 130, 220); offscreenG.drawString("Angular acceleration of the pulley = " + alpha + " rad/s^2", 130, 240); offscreenG.drawString("Pulley radius = " + pulleyRadius + " m", 130, 260); offscreenG.drawString("Pulley moment of inertia = " + 0.005*pulleyM + " kg m^2", 130, 280); offscreenG.drawString("Net torque on the pulley = " + (blueTension-redTension)*pulleyRadius + " N m", 130, 300); offscreenG.setColor(Color.white); offscreenG.drawLine(70,215,70+(int)(10.0*Math.cos(theta)),215+(int)(10.0*Math.sin(theta))); offscreenG.setColor(Color.black); offscreenG.drawLine(50,390,90,390); g.drawImage(offscreenImg,0,0,this); } public void destroy() { offscreenG.dispose(); } public boolean action (Event evt, Object arg) { if (evt.target instanceof Button) { if (Start.getLabel().equals("Start")) { startFlag = true; Start.setLabel("Reset"); } else { startFlag = false; Start.setLabel("Start"); } } else return super.action(evt, arg); return true; } public boolean handleEvent(Event evt) { if (evt.target instanceof Scrollbar) { if ((Scrollbar)evt.target == redMscroll) { redMass = ((Scrollbar)evt.target).getValue(); massRedS.setText(String.valueOf(redMass)); } else if ((Scrollbar)evt.target == blueMscroll) { blueMass = ((Scrollbar)evt.target).getValue(); massBlueS.setText(String.valueOf(blueMass)); } else if ((Scrollbar)evt.target == redVscroll) { pulleyMass = ((Scrollbar)evt.target).getValue(); massPulleyS.setText(String.valueOf(pulleyMass)); } repaint(); } else return super.handleEvent(evt); return true; } }