import java.applet.*; import java.awt.*; import java.awt.event.*; public class welle2 extends Applet { Button f1 = new Button(" Stop "); double omega=5.7; //Gibt Frequenz an double laenge=7; //Gibt Wellenlaenge an boolean anhalten; painter canvas; //initialisiert Zeichenflaeche wellen wellen1; Zeiger zeiger1; Animation ani; double t=0.0; double t_neu=0.0; int[] x = new int[8]; int[] y = new int[8]; final double pi=3.14; public welle2() { canvas = new painter(); canvas.setForeground(Color.black); canvas.setBackground(Color.white); canvas.setSize(630,300); setLayout(new FlowLayout()); add(canvas); add(f1); f1.addActionListener(new Akt()); } public static void main(String[] args) { Frame fenster = new Frame("Zur Wellenfunktion");; class adapt extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } fenster.addWindowListener(new adapt()); welle2 test = new welle2(); test.init(); test.start(); fenster.add(test); fenster.setBackground(Color.white); fenster.setForeground(Color.black); fenster.setBounds(100,80,670,450); fenster.setResizable(false); fenster.show(); } //Ende von main public void init() { wellen1 = new wellen(canvas,0); zeiger1 = new Zeiger(canvas,130,150); ani= new Animation(canvas,0); wellen1.beenden = false; ani.beenden=false; zeiger1.beenden = false; wellen1.anhalten = true; ani.anhalten = true; zeiger1.anhalten = true; wellen1.start(); ani.start(); zeiger1.start(); } // Ende von init public void start() { synchronized(wellen1) { wellen1.anhalten = false; try { wellen1.notify(); } catch(Exception e){} } synchronized(zeiger1) { zeiger1.anhalten = false; try { zeiger1.notify(); } catch(Exception e){} } synchronized(ani) { ani.anhalten = false; try { ani.notify(); } catch(Exception e){} } } // Ende von Start public void stop() { if(wellen1 != null && zeiger1 != null && ani!= null) { wellen1.anhalten = true; ani.anhalten = true; zeiger1.anhalten = true; } } public void destroy() { if(wellen1 != null && zeiger1 != null && ani != null) { wellen1.anhalten = true; ani.anhalten = true; zeiger1.anhalten = true; } } class Akt implements ActionListener { public void actionPerformed(ActionEvent e) { String Label; Label = e.getActionCommand(); if(Label.equals(" Start ")) { f1.setLabel(" Stop "); wellen1.resume(); zeiger1.resume(); ani.resume(); } if(Label.equals(" Stop ")) { f1.setLabel(" Start "); wellen1.suspend(); zeiger1.suspend(); ani.suspend(); } } } //Ende von Actionlistener class wellen extends Thread { boolean anhalten,beenden; //Statusvariablen painter bild; double dt = 0.002; int i=0; wellen(painter c, int k) //Konstruktor anlegen { bild=c; i=k; } public void run() //run Methode fuer die Threads { while(beenden==false) { Bewegen(); //Ein Stueckchen drehen synchronized(this) { try { sleep(20); if(anhalten==true) { wait(); } } catch(InterruptedException e) {return;} } } } void Bewegen() { //double t_neu; Graphics g = bild.getGraphics(); g.setColor(Color.white); g.drawLine(420+(i+1)*20,252,420+(i+1)*20+x[i],252+y[i]); g.drawLine(420+(i+2)*20,252,420+(i+2)*20+x[i+1],252+y[i+1]); g.drawLine(420+(i+3)*20,252,420+(i+3)*20+x[i+2],252+y[i+2]); g.drawLine(420+(i+4)*20,252,420+(i+4)*20+x[i+3],252+y[i+3]); g.drawLine(420+(i+5)*20,252,420+(i+5)*20+x[i+4],252+y[i+4]); g.drawLine(420+(i+6)*20,252,420+(i+6)*20+x[i+5],252+y[i+5]); g.drawLine(420+(i+7)*20,252,420+(i+7)*20+x[i+6],252+y[i+6]); g.drawLine(420+(i+8)*20,252,420+(i+8)*20+x[i+7],252+y[i+7]); g.setColor(Color.black); g.fillOval(418+(i+1)*20,250,5,5); g.fillOval(418+(i+2)*20,250,5,5); g.fillOval(418+(i+3)*20,250,5,5); g.fillOval(418+(i+4)*20,250,5,5); g.fillOval(418+(i+5)*20,250,5,5); g.fillOval(418+(i+6)*20,250,5,5); g.fillOval(418+(i+7)*20,250,5,5); g.fillOval(418+(i+8)*20,250,5,5); g.drawLine(440,220,440,285); g.drawLine(580,220,580,285); t_neu=t+dt; x[i]=(int) (15*(Math.cos((t_neu*2*pi*omega)+(7-i)/laenge*2*pi))); y[i]=(int) (-15*(Math.sin((t_neu*2*pi*omega)+(7-i)/laenge*2*pi))); x[i+1]=(int) (15*(Math.cos((t_neu*2*pi*omega)+(7-(i+1))/laenge*2*pi))); y[i+1]=(int) (-15*(Math.sin((t_neu*2*pi*omega)+(7-(i+1))/laenge*2*pi))); x[i+2]=(int) (15*(Math.cos((t_neu*2*pi*omega)+(7-(i+2))/laenge*2*pi))); y[i+2]=(int) (-15*(Math.sin((t_neu*2*pi*omega)+(7-(i+2))/laenge*2*pi))); x[i+3]=(int) (15*(Math.cos((t_neu*2*pi*omega)+(7-(i+3))/laenge*2*pi))); y[i+3]=(int) (-15*(Math.sin((t_neu*2*pi*omega)+(7-(i+3))/laenge*2*pi))); x[i+4]=(int) (15*(Math.cos((t_neu*2*pi*omega)+(7-(i+4))/laenge*2*pi))); y[i+4]=(int) (-15*(Math.sin((t_neu*2*pi*omega)+(7-(i+4))/laenge*2*pi))); x[i+5]=(int) (15*(Math.cos((t_neu*2*pi*omega)+(7-(i+5))/laenge*2*pi))); y[i+5]=(int) (-15*(Math.sin((t_neu*2*pi*omega)+(7-(i+5))/laenge*2*pi))); x[i+6]=(int) (15*(Math.cos((t_neu*2*pi*omega)+(7-(i+6))/laenge*2*pi))); y[i+6]=(int) (-15*(Math.sin((t_neu*2*pi*omega)+(7-(i+6))/laenge*2*pi))); x[i+7]=(int) (15*(Math.cos((t_neu*2*pi*omega)+(7-(i+7))/laenge*2*pi))); y[i+7]=(int) (-15*(Math.sin((t_neu*2*pi*omega)+(7-(i+7))/laenge*2*pi))); g.setColor(Color.red); g.drawLine(420+(i+1)*20,252,420+(i+1)*20+x[i],252+y[i]); g.setColor(Color.black); g.drawLine(420+(i+2)*20,252,420+(i+2)*20+x[i+1],252+y[i+1]); g.drawLine(420+(i+3)*20,252,420+(i+3)*20+x[i+2],252+y[i+2]); g.drawLine(420+(i+4)*20,252,420+(i+4)*20+x[i+3],252+y[i+3]); g.drawLine(420+(i+5)*20,252,420+(i+5)*20+x[i+4],252+y[i+4]); g.drawLine(420+(i+6)*20,252,420+(i+6)*20+x[i+5],252+y[i+5]); g.drawLine(420+(i+7)*20,252,420+(i+7)*20+x[i+6],252+y[i+6]); g.setColor(Color.red); g.drawLine(420+(i+8)*20,252,420+(i+8)*20+x[i+7],252+y[i+7]); t=t_neu; g.dispose(); } //Ende von draw } //Ende der Klasse wellen class painter extends Canvas { public void paint(Graphics g) { g.setColor(Color.black); g.drawLine(0,0,629,0); g.drawLine(629,0,629,299); g.drawLine(629,299,0,299); g.drawLine(0,299,0,0); g.drawRect(415,215,190,75); //Für Vergroesserung g.fillOval(10,145,10,10); double k; for(k=-pi/2; k<=pi/2; k+=0.006) { g.setColor(Color.black); g.fillOval(10+ (int) (30*Math.cos(k)),150+ (int) (30*Math.sin(k)),1,1); g.fillOval(10+ (int) (60*Math.cos(k)),150+ (int) (60*Math.sin(k)),1,1); g.fillOval(10+ (int) (90*Math.cos(k)),150+ (int) (90*Math.sin(k)),1,1); g.fillOval(10+ (int) (120*Math.cos(k)),150+ (int) (120*Math.sin(k)),1,1); g.fillOval(10+ (int) (150*Math.cos(k)),150+ (int) (150*Math.sin(k)),1,1); g.fillOval(10+ (int) (180*Math.cos(k)),150+ (int) (180*Math.sin(k)),1,1); g.fillOval(10+ (int) (210*Math.cos(k)),150+ (int) (210*Math.sin(k)),1,1); g.fillOval(10+ (int) (240*Math.cos(k)),150+ (int) (240*Math.sin(k)),1,1); g.fillOval(10+ (int) (270*Math.cos(k)),150+ (int) (270*Math.sin(k)),1,1); g.fillOval(10+ (int) (300*Math.cos(k)),150+ (int) (300*Math.sin(k)),1,1); g.fillOval(10+ (int) (330*Math.cos(k)),150+ (int) (330*Math.sin(k)),1,1); } g.setColor(Color.white); g.fillRect(10,115,100,20); g.setColor(Color.black); Font zwei = new Font("Times",0,12); g.setFont(zwei); g.drawString("Erreger der Welle",10,130); g.drawString("Der Abstand zweier schwarzer Kreis-",390,15); g.drawString("linien beträgt eine Wellenlänge.",390,30); g.drawString("Alle auf einer Kreislinie liegenden Phasen-",390,45); g.drawString("zeiger haben gleiche Phasenlage.",390,60); g.setColor(Color.blue); g.drawString("Mit der roten Kreislinie wird angedeutet,",390,90); g.drawString("dass die Phasenzeiger den momentanen",390,105); g.drawString("Zustand einer sich bewegenden Welle",390,120); g.drawString("anzeigen.",390,135); g.setColor(Color.blue); Font eins = new Font("Times",0,9); g.setFont(eins); g.drawString("\u00a9 1999 by Jörg Bogendörfer; Didaktik der Physik, Uni Erlangen",350,298); } //Ende von Paint } // Ende von painter class Animation extends Thread { boolean anhalten,beenden; //Statusvariablen painter bild; double dt = 0.002; int i=22; Animation(painter c, int k) //Konstruktor anlegen { bild=c; i=k; } public void run() //run Methode fuer die Threads { while(beenden==false) { Bewegen(); //Ein Stueckchen drehen synchronized(this) { try { sleep(20); if(anhalten==true) { wait(); } } catch(InterruptedException e) {return;} } } } void Bewegen() { int x,y; Graphics g = bild.getGraphics(); double l; for(l=-pi/2; l<=pi/2; l+=0.006) { if(i != 30 && i != 60 && i != 90 && i != 120 && i != 150 && i != 180 && i!= 210 && i != 240 && i != 270 && i != 300 && i != 330) { g.setColor(Color.white); } else { g.setColor(Color.black); } g.fillOval(10+ (int) (i*Math.cos(l)),150+ (int) (i*Math.sin(l)),1,1); } i+=2; if(i>340) //Zeichnen von vorne beginnen { i=22; } g.setColor(new Color(185,185,185)); g.drawLine(180,130,605,215); g.drawLine(110,170,415,290); g.setColor(Color.white); g.fillRect(10,115,100,20); g.fillRect(415,180,200,25); g.setColor(Color.black); g.drawString("Erreger der Welle",10,130); g.drawString("Vergrößerung des linken Kastens:",415,200); g.drawLine(0,0,629,0); g.drawLine(629,299,0,299); g.drawLine(10,150,350,150); g.fillOval(10,145,10,10); g.drawRect(110,130,70,40); //Für Ausschnitt double k; for(k=-pi/2; k<=pi/2; k+=0.006) { g.setColor(Color.red); g.fillOval(10+ (int) (i*Math.cos(k)),150+ (int) (i*Math.sin(k)),1,1); } g.dispose(); } //Ende von draw } //Ende der Klasse Animation class Zeiger extends Thread { boolean anhalten,beenden; //Statusvariablen painter bild; double dt = 0.002; int x1,y1; int x=0; int y=0; Zeiger(painter c, int m, int n) //Konstruktor anlegen { bild=c; x1=m; y1=n; } public void run() //run Methode fuer die Threads { while(beenden==false) { Bewegen(); //Ein Stueckchen drehen synchronized(this) { try { sleep(20); if(anhalten==true) { wait(); } } catch(InterruptedException e) {return;} } } } void Bewegen() { Graphics g = bild.getGraphics(); g.setColor(Color.white); g.drawLine(x1,y1,x1+x,y1+y); g.drawLine(x1+30,y1,x1+x+30,y1+y); g.drawLine(x1+60,y1,x1+x+60,y1+y); g.drawLine(x1+90,y1,x1+x+90,y1+y); g.drawLine(x1+120,y1,x1+x+120,y1+y); g.drawLine(x1+150,y1,x1+x+150,y1+y); g.drawLine(x1+180,y1,x1+x+180,y1+y); g.drawLine(x1+210,y1,x1+x+210,y1+y); g.drawLine(x1-30,y1,x1+x-30,y1+y); g.drawLine(x1-60,y1,x1+x-60,y1+y); g.drawLine(x1-90,y1,x1+x-90,y1+y); g.drawLine(x1+148,y1+30,x1+x+148,y1+y+30); // Kreisbogen löschen g.drawLine(x1+143,y1+60,x1+x+143,y1+y+60); g.drawLine(x1+134,y1+90,x1+x+134,y1+y+90); g.drawLine(x1+121,y1+120,x1+x+121,y1+y+120); g.drawLine(x1+148,y1-30,x1+x+148,y1+y-30); g.drawLine(x1+143,y1-60,x1+x+143,y1+y-60); g.drawLine(x1+134,y1-90,x1+x+134,y1+y-90); g.drawLine(x1+121,y1-120,x1+x+121,y1+y-120); t_neu = t+dt; x=(int) (15*(Math.cos((t_neu*2*pi*omega)+(7)/laenge*2*pi))); y=(int) (-15*(Math.sin((t_neu*2*pi*omega)+(7)/laenge*2*pi))); g.setColor(Color.black); g.fillOval(x1-2,y1-2,5,5); g.fillOval(x1-2+30,y1-2,5,5); g.fillOval(x1-2-30,y1-2,5,5); g.fillOval(x1-2-60,y1-2,5,5); g.fillOval(x1-2-90,y1-2,5,5); g.fillOval(x1-2+60,y1-2,5,5); g.fillOval(x1-2+90,y1-2,5,5); g.fillOval(x1-2+120,y1-2,5,5); g.fillOval(x1-2+150,y1-2,5,5); g.fillOval(x1-2+180,y1-2,5,5); g.fillOval(x1-2+210,y1-2,5,5); g.fillOval(x1-2+148,y1-2+30,5,5); g.fillOval(x1-2+143,y1-2+60,5,5); g.fillOval(x1-2+134,y1-2+90,5,5); g.fillOval(x1-2+121,y1-2+120,5,5); g.fillOval(x1-2+148,y1-2-30,5,5); g.fillOval(x1-2+143,y1-2-60,5,5); g.fillOval(x1-2+134,y1-2-90,5,5); g.fillOval(x1-2+121,y1-2-120,5,5); g.drawLine(x1+60,y1,x1+x+60,y1+y); g.drawLine(x1+90,y1,x1+x+90,y1+y); g.drawLine(x1+120,y1,x1+x+120,y1+y); g.drawLine(x1+150,y1,x1+x+150,y1+y); g.drawLine(x1+180,y1,x1+x+180,y1+y); g.drawLine(x1+210,y1,x1+x+210,y1+y); g.drawLine(x1-30,y1,x1+x-30,y1+y); g.drawLine(x1-60,y1,x1+x-60,y1+y); g.drawLine(x1-90,y1,x1+x-90,y1+y); g.drawLine(x1+148,y1+30,x1+x+148,y1+y+30); // Kreisbogen zeichnen g.drawLine(x1+143,y1+60,x1+x+143,y1+y+60); g.drawLine(x1+134,y1+90,x1+x+134,y1+y+90); g.drawLine(x1+121,y1+120,x1+x+121,y1+y+120); g.drawLine(x1+148,y1-30,x1+x+148,y1+y-30); g.drawLine(x1+143,y1-60,x1+x+143,y1+y-60); g.drawLine(x1+134,y1-90,x1+x+134,y1+y-90); g.drawLine(x1+121,y1-120,x1+x+121,y1+y-120); g.setColor(Color.red); g.drawLine(x1,y1,x1+x,y1+y); g.drawLine(x1+30,y1,x1+x+30,y1+y); t = t_neu; g.dispose(); } //Ende von draw } //Ende der Klasse Zeiger } //Ende von welle1