Fibonacci

Heute haben wir in der Schule die Aufgabe erhalten ein Applet zu erstellen, das eine Fibonacci-Spirale zeichnet.
Hier ist mein Ergebniss:


Vorgehen zum erstellen eines Applet Fibonacci (outdated)
Wir haben die Aufgabe inzwischen in der Schule besprochen und es gibt einen einfachere Methode, sie ist in der Datei Fibonacci2 erklärt.
Ich lasse diese Variante aber trotzdem Online.

Anhand der folgenden Grafik, will ich meine Überlegungen darlegen, wie ich die Aufgabe gelöst habe.
Bild einer Fibonaccispirale mit Detail Die Kreise stellen, die Mittelpunkte der Kreissegmente dar. der 1. Mittelpunkt ist der Grüne, dann kommt der Blaue usw.
Als Ausgangslange haben wir die Zahlenfolgen:
1 1 2 3 5 8
Diese Zahlenfolge definiert den Radius aller Viertelkreise. Die 1. zwei Viertelkreise haben Radius 1. darum wird dieser nicht in der Zeichenschlaufe gezeichnet.

Die Mittelpunkte der Kreissegmente hangen auch mit diesen Zahlen zusammen. Und zwar wird der Mittelpunkt immer nach der Folgenden Regel verändert:

  • Y Achse um Wert n verkleiner
  • X Achse umd Wert n vergrössern
  • Y Achse um Wert n vergrössern
  • X Achse um Wert n verkleinern

  • Wert n ist immer die vorletze Fibonaccizahl. Wenn die aktuelle Fibonacci zahl 5 ist, dann ist n = 2. Bei 8 ist n = 3

    Um die Richtung des Kreisbogens festzulegen gibt es auch eine Gesetzmässigkeit:
    Hiervon sind auch wieder der Halbkreis in der Mitte ausgenommen.

  • Der erste Kreisbogen ist nach unten Links ausgerichtet.
  • Der zweite Kreisbogen nach oben Links.
  • Der dritte nach oben Rechts
  • Der vierte nach unten Rechts.

  • Dann beginnt es wieder von vorne.
    Jetzt folgt mein Code:
    import java.awt.*;
    import java.applet.*;

    public class Fibo extends Applet
    {
        public void init()
        {
            setBackground(Color.blue);
            //setForeground(Color.black);
        }
        
        public void paint(Graphics g)
        {
            final int anzahl = 5; // Anzahl Zahlen die Berechnet werden
            final int scale = 10; // Umrechnungsfaktor nach Pixel
            
            int addZahl; // Temporäre Variabel um Fibo Zahlen zu berechnen
            int fibo = 1; // Aktuelle Fibonacci zahl
            int fiboLast1 = 1; // Letze Fibozahl vor fibo
            int fiboLast2 = 1; // Letze Fibozahl fibolast1
            
            // Startpunkt der Spirale:
            Dimension wnd = getSize();
            int x = wnd.width / 2;
            int y = wnd.height / 2;
            int c = 0; // Hilfsvariable zur bestimmung des Mittelpunktes
                        // Nimmt Werte zwischen 0 und 3 an.
            int sWinkel = 0; // Startwinkel ffür Kreissegment
                        
            // Start Teil zeichen:
            g.drawArc(x-scale,y-scale,2*scale,2*scale,-90,180);
            y = y - scale; // Neuer Mittelpunkt bestimmen
            
            for(int i=0;i <= anzahl;i++)
            {
                addZahl = fibo + fiboLast1;
                fiboLast2 = fiboLast1; // Vorvorhergehende Fibonaccizahl
                                        // Mit dieser Wird der neue Mittelpunkt
                                        // Des Kreisbogens bestimmt;
                fiboLast1 = fibo; // Vorhergehende Fibonaccizahl
                fibo = addZahl; // Aktuelle Fibonaccizahl
                
                //Debug
                g.drawString(fibo + "\t\t" + fiboLast1 + "\t\t" + fiboLast2,10,50 + (i*15));
                
                // Hier haben wir die Aktuelle Zahl der Fibo Folge
                // Bogen malen:
                if(i == 0)
                {
                    // Radius des Bogens ist jetzt 2 Verschiebung des Zentrums ist
                    // y -1
                    g.drawArc(x-(2*scale),y-(2*scale),4*scale,4*scale,-180,90);
                    // Neuer Mittelpunkt:
                    x = x + scale;
                }
                else if(i == 1)
                {
                    // Radius des Bogens ist jetzt 3 Verschiebung des Zentrums ist
                    // x + 1
                    g.drawArc(x-(3*scale),y-(3*scale),6*scale,6*scale,90,90);
                    // Neuer Mittelpunkt:
                    
                }
                else
                {
                    // Ab jetzt ist der Radius in fibo und die Verschiebung
                    // des Mittelpunktes in fiboLast2
                    
                    // Zuerst muss der Mittelpunkt des Kreisbogens bestummen werden:
                    switch(c)
                    {
                        case 0:
                            y += fiboLast2 * scale;
                            //g.drawString("fiboLast2= " + fiboLast2,10,20);
                            //g.drawString("fibo= " + fibo,10,50);
                            sWinkel = 0;
                            break;
                        case 1:
                            x -= fiboLast2 * scale;
                            sWinkel = 270;
                            break;
                        case 2:
                            y -= fiboLast2 * scale;
                            sWinkel = 180;
                            break;
                        case 3:
                            x += fiboLast2 * scale;
                            sWinkel = 90;
                            break;
                    }
                    
                    // Bogen zeichnen:
                    g.drawArc(x-(fibo * scale),y-(fibo * scale),2 * fibo * scale,2 * fibo * scale,sWinkel,90);
                    // Counter inkrementieren und prüfen:
                    c++;
                    if(c == 4) c = 0;
                }
            }
            
        }
    }