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.
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:
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.
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;
}
}
}
}