any interest to create a newton's cradle for learning objective:

conservation of momentum

conservation of kinetic energy


The current well reference applet is this one by walter but it is still can be modified to a learner centered exploration simulation instead of a show and tell"see".

good idea?

reference:
http://www.walter-fendt.de/ph11e/ncradle.htm


found the source code in german from http://duepublico.uni-duisburg-essen.de/servlets/DerivateServlet/Derivate-81/Pendel5.java
[code]// Applet zur Simulation von fünf Pendeln
// (Demonstration von Impuls- und Energieerhaltungssatz
// 03.11.1997 - 22.05.1998

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

public class Pendel5 extends Applet implements Runnable {

  int width, height;
  Graphics g1, g2;
  Image offscreen;
  Thread animatorThread;
  Choice ch;                        // Auswahlbox für Zahl der ausgelenkten Pendel
  final int n = 5;                  // Zahl der Pendel
  int k = 2;                        // Zahl der ausgelenkten Pendel
  final int r = 20;                  // Radius der Pendelkörper
  final int ax = 120, ay = 50;      // Aufhängung des linken Pendels
  final int l = 200;                // Pendellänge
  final double A = 0.4;              // Amplitude (Bogenmaß)
  final double T = 2;                // Schwingungsdauer (s)
  final double omega = 2*Math.PI/T;  // Kreisfrequenz (1/s)
  double phi;                        // Phase (Bogenmaß)
  Date d;
  long t0 = 0, t1 = 0;              // Zeit (ms)
  double t = 0;                      // Zeit (s)
  int px, py;                        // Mittelpunkt der Pendelkörper

  public void init() {
    width = bounds().width; height = bounds().height;
    g1 = getGraphics();
    offscreen = createImage(width,height); g2 = offscreen.getGraphics();
    animatorThread = null;
    ch = new Choice();
    ch.addItem("  1  "); ch.addItem("  2  "); ch.addItem("  3  "); ch.addItem("  4  ");
    add(ch); ch.select(1);
    }

  public void drawPendulum (int i) {
    while (t >= T) t -= T;
    phi = A*Math.cos(omega*t);
    if (((t<0.25*T || t>=0.75*T) && i=0.25*T && t<0.75*T && i>=n-k)) {
      px = (int)(ax+i*2*r-l*Math.sin(phi)+0.5);
      py = (int)(ay+l*Math.cos(phi)+0.5);
      g2.setColor(Color.black); g2.drawLine(ax+i*2*r,ay,px,py);
      g2.setColor(Color.blue); g2.fillOval(px-r,py-r,2*r,2*r);
      }
    else {
      g2.setColor(Color.black); g2.drawLine(ax+i*2*r,ay,ax+i*2*r,ay+l);
      g2.setColor(Color.blue); g2.fillOval(ax+i*2*r-r,ay+l-r,2*r,2*r);
      }
    }

  public void paint (Graphics g) {
    int i;
    g.setColor(Color.yellow); g.fillRect(0,0,width,height);
    g.setColor(Color.black); g.fillRect(50,ay-2,300,4);
    for (i=0;i<5;i++) drawPendulum(i);
    }

  public boolean action (Event e, Object o) {
    if (e.target==ch) k = ch.getSelectedIndex()+1;
    paint(g2); g1.drawImage(offscreen,0,0,this);
    return true;
    }

  public void start () {
    if (animatorThread == null) {
      animatorThread = new Thread(this);
      animatorThread.start();
      }
    }

  public void stop () {
    if (animatorThread != null && animatorThread.isAlive())
      animatorThread.stop();
    animatorThread = null;
    }

  // Laufen des Programms (Endlosschleife):

  public void run () {
    d = new Date(); t0 = d.getTime();
    while (true) {
      paint(g2); g1.drawImage(offscreen,0,0,this);   
      d = new Date();
      t1 = d.getTime(); t += (t1-t0)/1000.0;
      t0 = t1;
      }
    }

  }[/code]