[an error occurred while processing this directive]
Rheinland-Pfalz;
Informatik
Letzte Aktualisierung: 17.7.2009; Claus Schmitt
![]() |
Startseite Informatik-Rheinland-Pfalz |
Physik-Applets
Fadenpendel
Fadenpendel
(durchgehend schwingend)
Newtons Wiege
Mathematik-Applets
Thales
Pythagoras
Primzahlsieb
Quellen
zurück
zur Java Startseite
I FadenpendelUm das Verständnis zu Newtons Wiege (Energie- und Impulserhaltung) zu erleichtern, haben wir ein Applet vorgeschaltet, in dem ein einfaches Fadenpendel realisiert wird. (Browser aktualisieren für eine erneute Schwingung).
// Java-Applet Fadenpendel (Beispiel für eine einfache Animation)
// Kompilierung mit J2SDK 1.6.0
// Walter Fendt,
// Vorschläge zur didaktischen Reduzierung
// Claus Jürgen Schmitt
// 04.04.2009
import java.awt.*; import javax.swing.*; public class Fadenpedel extends JApplet implements Runnable { //----------------------------------------------------------------------------- // Konstanten //----------------------------------------------------------------------------- final int R = 20; // Radius Pendelkörper (Pixel) final int R2 = 2*R; // Durchmesser Pendelkörper (Pixel) final int L = 200; // Pendellänge (Pixel) final double A = 0.4; // Amplitude (Bogenmaß); // entspricht etwa 23° final double T = 2; // Schwingungsdauer (s) final double OMEGA = 2*Math.PI/T; // Kreisfrequenz (1/s) final Color FZF = Color.yellow; // Hintergrundfarbe Zeichenfläche //----------------------------------------------------------------------------- // Attribute //----------------------------------------------------------------------------- Container cp; // Container für Komponenten int breite, höhe; // Abmessungen (Pixel) Zeichenfläche zf; // Zeichenfläche int ax, ay; // Aufhängung des Pendels (Pixel) double phi; // Phase (Bogenmaß) Thread thr; // Prozess für Animation double t; // Zeit (s) //-----------------------------------------------------------------------------
// Weitere Methoden
//-----------------------------------------------------------------------------
// Start-Methode:
public void start () { cp = getContentPane(); // Container für Komponenten cp.setLayout(null); // Hartes Layout (Pixelangaben) Dimension dim = getSize(); // Abmessungen (aus HTML-Datei) breite = dim.width; // Breite (Pixel) höhe = dim.height; // Höhe (Pixel) ax = breite/2; // x-Koordinate Aufhängung (Pixel) ay = 40; // y-Koordinate Aufhängung (Pixel) zf = new Zeichenfläche(); // Zeichenfläche (innere Klasse) zf.setBackground(FZF); // Hintergrundfarbe Zeichenfläche zf.setBounds(0,0,breite,höhe); // Position/Abmessungen Zeichenfläche cp.add(zf); // Zeichenfläche zum Container hinzufügen thr = new Thread(this); // Prozess für Animation thr.start(); // Prozess starten } // Stopp-Methode:
public void stop () { thr = null; // Prozess für Garbage Collection freigeben cp.removeAll(); // Komponenten entfernen } // Methode für Animation // (Schleife über eine Schwingung): public void run () { long t0, t1; t0 = System.currentTimeMillis(); // Zeit in ms while (thr == Thread.currentThread()) { // Solange Prozess thr aktiv ... if (t <= T) // ... Falls erste Periode ... zf.repaint(); // ... Zeichenfläche neu zeichnen try {Thread.sleep(50);} // ... 50 ms Unterbrechung catch (InterruptedException ie) {} t1 = System.currentTimeMillis(); // ... Zeit in ms t += (t1-t0)/1000.0; // ... Zeit-Variable aktualisieren (in s) t0 = t1; // ... Zeit in ms } } // Pendel zeichnen: // g ... Grafik-Kontext void pendel (Graphics g) { // Zur Zeit t = 0 ist das Pendel // nach links maximal ausgelenkt. phi = A*Math.cos(OMEGA*t); // Phase (Bogenmaß) // Im Gradmaß Auslenkung // etwa von 23° bis -23° int px, py; // Mittelpunktskoordinaten Pendelkörper px = (int)Math.round(ax-L*Math.sin(phi)); // x-Koordinate Kugelmittelpunkt py = (int)Math.round(ay+L*Math.cos(phi)); // y-Koordinate Kugelmittelpunkt g.setColor(Color.black); // Faden g.drawLine(ax,ay,px,py); g.setColor(Color.blue); // Pendelkörper (Kreisfläche) g.fillOval(px-R,py-R,R2,R2); g.setColor(Color.black); // Pendelkörper (Kreisrand) g.drawOval(px-R,py-R,R2,R2); } // --------------------------------------------------------------------------
// Innere Klasse Zeichenfläche:
class Zeichenfläche extends JPanel { // Grafik-Ausgabe: // g ... Grafik-Kontext public void paint (Graphics g) { super.paint(g); // Hintergrund zeichnen g.setColor(Color.black); // Aufhängung zeichnen g.fillRect(40,ay-4,breite-80,4); pendel(g); // Pendel zeichnen } } // Ende Zeichenfläche
} // Ende Fadenpendel
|
Fadenpendel
(durchgehend schwingend)
Soll das Pendel kontinuierlich schwingen, genügt es, in der inneren Klasse Zeichenfläche in der Methode paint()vor dem Pendelaufruf folgende Schleife einzufügen: while (t >= T) t -= T; (vgl. Fadenpendel1.java in Java-Quelltexte dann Applet\WFendt ). |
Newtons
Wiege
(Energie- und Impulserhaltung)
// Java-Applet NWiege
// Newtons Wiege (Demonstration von Impuls- und Energieerhaltungssatz)
// Kompilierung mit J2SDK 1.6.0
// Walter Fendt
// 03.11.1997 - 24.03.2009
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class NWiege extends JApplet implements Runnable { //-----------------------------------------------------------------------------
// Konstanten
//-----------------------------------------------------------------------------
final int N = 5; // Zahl der Pendel final int R = 20; // Radius Pendelkörper (Pixel) final int R2 = 2*R; // Durchmesser Pendelkörper (Pixel) final int L = 200; // Pendellänge (Pixel) final double A = 0.4; // Amplitude (Bogenmaß) final double T = 2; // Schwingungsdauer (s) final double OMEGA = 2*Math.PI/T; // Kreisfrequenz (1/s) final Color FZF = Color.yellow; // Hintergrundfarbe Zeichenfläche final Color FSF = Color.green; // Hintergrundfarbe Schaltfläche0 final Font SANSSERIF // Logischer Font = new Font("SansSerif",Font.BOLD,12); //-----------------------------------------------------------------------------
// Attribute
//-----------------------------------------------------------------------------
Container cp; // Content Pane int breite, höhe, höhe0; // Abmessungen (Pixel) Zeichenfläche zf; // Zeichenfläche Schaltfläche0 sf; // Schaltfläche0 JComboBox ch; // Auswahlfeld int ax, ay; // Aufhängung des linken Pendels double phi; // Phase (Bogenmaß) Thread thr; // Prozess für Animation double t; // Zeit (s) //-----------------------------------------------------------------------------
// Weitere Methoden
//-----------------------------------------------------------------------------
// Start-Methode:
public void start () { cp = getContentPane(); // Container für Komponenten cp.setLayout(null); // Hartes Layout (Pixelangaben) Dimension dim = getSize(); // Abmessungen (aus HTML-Datei) breite = dim.width; // Breite (Pixel) höhe = dim.height; // Gesamthöhe (Pixel) höhe0 = 280; // Höhe der Zeichenfläche (Pixel) ay = 40; // Aufhängung, unterer Rand ax = breite/2-(N-1)*R; // Aufhängung (linkes Pendel) zf = new Zeichenfläche(); // Zeichenfläche (innere Klasse) zf.setBackground(FZF); // Hintergrundfarbe Zeichenfläche zf.setBounds(0,0,breite,höhe0); // Position/Abmessungen Zeichenfläche cp.add(zf); // Zeichenfläche hinzufügen sf = new Schaltfläche0(FSF,SANSSERIF); // Zur Klasse Schaltfläche0 siehe unten sf.setBounds(0,höhe0,breite,höhe-höhe0);// Position/Abmessungen Schaltfläche0 String text // Zeichenkette für Label = "Zahl der ausgelenkten Kugeln:"; sf.hinzufügen(new JLabel(text), // Label hinzufügen FSF,0,0,1,10,10,10,0); ch = new JComboBox(); // Auswahlfeld for (int i=1; i<=N; i++) // Felder für die Zahl ... ch.addItem(" "+i+" "); // ... der ausgelenkten Kugeln ch.setSelectedIndex(1); // Voreinstellung: Zwei Kugeln ausgelenkt sf.hinzufügen(ch, // Auswahlfeld hinzufügen Color.white,1,0,1,10,10,10,10); text = "© W. Fendt 1997"; // Zeichenkette für Label sf.hinzufügen(new JLabel(text), // Label hinzufügen FSF,2,0,1,10,30,10,10); cp.add(sf); // Schaltfläche0 hinzufügen thr = new Thread(this); // Prozess für Animation thr.start(); // Prozess starten } // Stopp-Methode:
public void stop () { thr = null; // Prozess für Garbage Collection freigeben cp.removeAll(); // Komponenten entfernen } // Methode für Animation (Endlosschleife):
public void run () { long t0, t1; t0 = System.currentTimeMillis(); // Zeit in ms sf.repaint(); // Schaltfläche0 neu zeichnen while (thr == Thread.currentThread()) { // Solange Prozess thr aktiv ... zf.repaint(); // ... Zeichenfläche neu zeichnen try {Thread.sleep(50);} // ... 50 ms Unterbrechung catch (InterruptedException ie) {} t1 = System.currentTimeMillis(); // ... Zeit in ms t += (t1-t0)/1000.0; // ... Zeit seit der letzten Ablesung in s t0 = t1; // ... Zeit in ms } } // Einzelnes Pendel: // g ... Grafik-Kontext // i ... Nummer (0 bis N-1) void pendel (Graphics g, int i) { while (t >= T) t -= T; // Bedingung 0 <= t < T erzwingen phi = A*Math.cos(OMEGA*t); // Phase (Bogenmaß) int k = ch.getSelectedIndex()+1; // Zahl der ausgelenkten Kugeln int px, py; // Mittelpunktskoordinaten der Kugel boolean links = (t < T/4 || t >= 3*T/4);// Auslenkung nach links if ((links && i < k) // Kugel nach links ausgelenkt || (!links && i >= N-k)) { // Kugel nach rechts ausgelenkt px = (int)Math.round(ax+i*R2-L*Math.sin(phi)); // x-Koordinate Kugelmittelpunkt py = (int)Math.round(ay+L*Math.cos(phi)); // y-Koordinate Kugelmittelpunkt } else {px = ax+i*R2; py = ay+L;} // Kugel in Ruhe g.setColor(Color.black); // Faden g.drawLine(ax+i*R2,ay,px,py); g.setColor(Color.blue); // Pendelkörper (Kreisfläche) g.fillOval(px-R,py-R,R2,R2); g.setColor(Color.black); // Pendelkörper (Kreisrand) g.drawOval(px-R,py-R,R2,R2); } // --------------------------------------------------------------------------
// Innere Klasse Zeichenfläche:
class Zeichenfläche extends JPanel { // Grafik-Ausgabe:
// g ... Grafik-Kontext
public void paint (Graphics g) { super.paint(g); // Hintergrund zeichnen g.setColor(Color.black); // Aufhängung zeichnen g.fillRect(breite/2-(N+1)*R,ay-4,(N+1)*R2,4); for (int i=0; i<N; i++) pendel(g,i); // Einzelne Pendel zeichnen } } // Ende Zeichenfläche
}
// Ende NWiege |
Mathematik-Applets vgl. |
Herrn
Walter
Fendt /
Paul-Klee-Gymnasium
Gersthofen / Fachlehrer für Mathematik / Physik / Informatik bin ich für hilfreichen Anregungen und die Überarbeitung der Applet-Quelltexte sehr dankbar. Außerdem danke ich für den kommentierten Quelltext der beiden Applets, welche er extra für diese ZUM-Seite neu überarbeitet hat! |
![]() |
Startseite Informatik-Rheinland-Pfalz |