Abrollen eines Kreises

Abrollen



I.Erklärung des Progamms:

Das vorliegende Programm soll das Abrollen eines Kreises bei einem anderen darstellen, wobei ein Punkt immer genau beobachtet wird und so ein bestimmtes Muster gewonnen werden kann, indem man die Punkte in kleinen Abständen annimmt. Diese kleinen Abstände, die so eine zusammenhängende Linie ergeben, werden dadurch erreicht indem man die Schrittweiten zwischen den einzelnen Berechnungen für die Punkte klein genug annimmt. Im vorliegenden Fall ist eine Schrittweite von 1/10 Sekunde angenommen. Diese Schrittweite wird in der Variablen- Deklaration angegeben.

II.Variablen:

Ein weiteres wichtiges Element für dieses Programm sind die unterschiedlichen Kreisradien. Der erste Radius gibt den äußeren Kreis an, an dem ein anderer Kreis abrollen soll. Natürlich kann man hierbei immer nur einzelne Punkte annehmen und nicht gleich eine durchgehende Linie erhalten.

Die Variablen x und y sind für den neu berechneten Punkt des Kreises zuständig. Eine weitere wichtige Variable ist für die verschiedenen Fälle zuständig, die man in der Methode Paint angeben kann.
// Anfang Variablen
  int fall=5;              //verschiedene Fälle für die Radien
  int breit=900;           //Fensterbreite
  int hoch=700;            //Fensterhöhe
  boolean neu=true;
  double t=0;              //Beginn der Zeit
  double dt=0.1;           //Abstände der Zeitmessung
  double x=0;
  double y=0;
  double r=200;            //Radius des äußeren Kreises
  double r1=100;           //Radius des Abrollkreises
  double r2=100;           //Radius des zweiten Kreises
  double mx,my;
  boolean pause=false;
  boolean ende=false;
// Ende Variablen
Die restlichen Variablen sind für den Programmablauf unbedingt notwendig, jedoch sind sie in diesem Teil der Arbeit nicht so wesentlich um erwähnt zu werden.

III. Programmierablauf:

Zuerst muss ein „Thread“ implementiert werden. Ein „Thread“ ist ein Programmteil der unabhängig vom restlichen Programm immer wieder abläuft.

Anschließend wird ein sogenannter „Key-Listener“ implementiert, der dafür zuständig ist, das das Programm auf gewisse Eingriffe mit der Tastatur reagiert. Im vorliegenden Programm ist nur der Programmabbruch (Esc) und eine Pause (Space), die das Zeichnen der immer neu ermittelten Punkte unterbricht, von Bedeutung.
// Anfang Komponenten
    addKeyListener(this);
    Thread th= new Thread (this);
    th.start();
    // Ende Komponenten

  }

  // Anfang Ereignisprozeduren

  public void KeyPressed (KeyEvent event) {
  if (event.getKeyCode()==KeyEvent.VK_SPACE) {pause=!pause;}
         if (event.getKeyCode()==KeyEvent.VK_ESCAPE) {System.exit(0);}
   }

  public void keyReleased(KeyEvent event) {} //keine Aktion
  public void keyTyped (KeyEvent event) {} //keine Aktion

  public void keyPressed (KeyEvent event){}
Daraufhin muss die Methode Paint eingeführt werden, die für die graphische Ausgabe des Programmes zuständig ist. Diese wird in zwei Teile untergliedert. Nämlich in den Teil der nur einmal zu Beginn des Programmes gezeichnet werden muss und dann immer gleich bleiben kann. Dies ist der Hintergrund und die Überschrift.

Vor diesem Teil fügt sich allerdings noch die Unterscheidung für die verschiedenen Fälle ein, die für den Programmablauf wichtig ist und bei der man sich das erneute Eingeben von verschiedenen Werten erspart. Dies sieht folgendermaßen aus:
if (fall==1) { r1=100; r2=100;}
      if (fall==2) { r1=150; r2=150;}
      if (fall==3) { r1=200; r2=200;}
      if (fall==4) { r1=300; r2=300;}
      if (fall==5) { r1=20; r2=100;}
Der Rest, also der Kreis und die Punkte, die berechnet werden, müssen immer neu gezeichnet werden und daher ist dies auch folgendermaßen unterschieden:

Hier der erste Teil der nur einmal gezeichnet werden muss und die Einführung der Methode Paint:
public void update (Graphics g) {paint(g);}
  public void paint (Graphics g) {
    if (neu){
      g.setColor(new Color(0,0,0));
      g.fillRect (0,0,breit,hoch);
      g.setColor (Color.green);
      g.drawOval ((int)(breit/2-r),(int)(hoch/2-r),(int)(2*r),(int)(2*r)) ;
      Font titel=new Font("Arial",Font.PLAIN,30);
      g.setColor(Color.green);
      g.setFont (titel);
      g.drawString("Abrollen",breit/2-55,50);
      neu=false;
    }
Ab dem „else“ ist nun der eigenständige Programm- bzw. Zeichenteil:
else{
      g.setColor (Color.white);
      g.drawOval ((int)(breit/2+x),(int)(hoch/2-y),2,2) ;
      g.drawOval ((int)(breit/2+mx),(int)(hoch/2-my),2,2) ;
    }
Der im Anschluss abgebildete Teil stellt die Methode „run“ dar, die für die Berechnung der Punkte und andere wichtige Aufgaben zuständig ist.
 public void run () {
      while (!ende) {                   //Solange das Programm nicht abgebrochen
        if (!pause) t=t+dt;             //Wenn keine Pause, dann t=t+dt;
        mx=-(r-r1)*Math.cos(t);         //Berechnung der Punkte
        my=-(r-r1)*Math.sin(t);         //Berechnung der Punkte
        x=mx+r2*Math.cos((r/r1-1)*t);   //Berechnung der Punkte
        y=my-r2*Math.sin((r/r1-1)*t);   //Berechnung der Punkte
        repaint();                      //Befehl zum Neuzeichnen
        try {Thread.sleep((int)(1000*dt));} catch (InterruptedException e){};

      }
    }
Nun jedoch genauer zu den verschiedenen Fällen die schon bei der Methode „paint“ genauer bearbeitet worden sind.

IV. Fälle:

Bei Fall 1 wird angenommen, dass die beiden inneren Kreisradien genau die Hälfte des großen Kreisradius sind. Daraus ergibt sich folgendes Bild:



Bei Fall 2 werden die kleineren Kreisradien irgendwo in der Mitte des großen Kreisradius angenommen. Daraus ergibt sich folgendes Bild:



Bei Fall 3 werden die beiden inneren Radien gleich wie der äußere Radius angenommen, wobei sich dann beim Abrollen kein Bild ergibt und daher werde ich auch keine Abbildung einfügen.

Bei Fall 4 werden die beiden Kreisradien größer angenommen, als der Radius des Kreises an dem abgerollt wird. Hier ergibt sich dann folgendes Bild:



Hier zum Abschluss noch ein fünfter Fall, der eigentlich keine große Problemstellung beinhaltet, aber ein schönes Bild ergibt und deshalb möchte ich es auch einfügen:

Das gesamte Programmlisting des Applets sehen Sie hier .