[an error occurred while processing this directive]

Rheinland-Pfalz;  Informatik                                 

Letzte Aktualisierung:  17.7.2009; Claus Schmitt

Zurück zur Startseite Informatik / Rheinland-Pfalz Startseite Informatik-Rheinland-Pfalz

Physik-Applets
Fadenpendel
Fadenpendel (durchgehend schwingend)

Newtons Wiege

Mathematik-Applets
Thales

Pythagoras
Primzahlsieb

Quellen
zurück zur Java Startseite

                                                     


 

Applets von Walter Fendt 
(zur Physik)
Dies Angebot ist noch in der Entwicklung:

I

Fadenpendel
 
           
Um 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).

Jetzt sollte sich ein Applet melden

// 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

zum Anfang der SeiteBegriffe Suchen

 

Fadenpendel (durchgehend schwingend)

Jetzt sollte sich ein Applet melden

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 ).

 zum Anfang der SeiteBegriffe Suchen

 
 
 Newtons Wiege  (Energie- und Impulserhaltung)
Jetzt sollte sich ein Applet melden
	

   

 // 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


Über die Klasse Schaltfläche wird die untere Leiste mit Infos und Auswahlbox organisiert. 
Diese Programmzeilen erhalten Sie über
Java-Quelltexte (dann Applet\WFendt ).

 zum Anfang der SeiteBegriffe Suchen

Mathematik-Applets vgl.

Quellen

         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!

.zum Anfang der SeiteBegriffe Suchen

Ergänzungen und Anregungen bitte an Claus Schmitt
 

Zurück zur Startseite Informatik / Rheinland-Pfalz Startseite Informatik-Rheinland-Pfalz
Impressum · Datenschutz