Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

Javakurs/Übungsaufgaben/Appleman: Unterschied zwischen den Versionen

(Appleman)
K (hat „Javakurs2007/Appleman“ nach „Javakurs/Übungsaufgaben/Appleman“ verschoben: wikistruktur)
 
(24 dazwischenliegende Versionen von 7 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 +
== Vorüberlegungen ==
 +
Lest euch zunächst etwas Wissen über [[wikipedia:Komplexe Zahlen|Komplexe Zahlen]] an. Legt besonderes Augenmerk auf das Quadrieren von komplexen Zahlen in Normalform, andere Darstellungsformen von komplexen Zahlen werden hier nicht benötigt.
 +
 
== Appleman ==
 
== Appleman ==
 +
Die Mandelbrot-Menge, oder auch Apfelmännchen genannt, ist eine ganz bestimme Menge von komplexen Zahlen. Sie gehört zu den sogenannten [[wikipedia:Fraktal|Fraktalen]] und man kennt sie aus unzähligen Darstellungen in Printmedien. Für eine genaue Definition und Berechnungsvorschrift sei auf die Wikipedia verwiesen: [[wikipedia:Mandelbrot-Menge#Definition_.C3.BCber_Rekursion |Mandelbrot-Menge, Definition über Rekursion]]. In dieser Aufgabe soll es darum gehen, ein Programm zur Darstellung eines solchen Apfelmännchens zu programmieren.
  
Die Mandelbrot-Menge, oder auch Apfelmaennchen genannt, ist eine ganz bestimmen Menge von komplexen Zahlen. Sie gehoert zu den sog. Fraktalen und man kennt sie aus unzaehligen Darstellungen in Printmedien. Fuer eine genaue Definition und Berechnungsvorschrift sei auf die Wikipedia verwiesen: [http://de.wikipedia.org/wiki/Mandelbrot-Menge#Definition_.C3.BCber_Rekursion Mandelbrot-Menge, Definition ueber Rekursion]. In dieser Aufgabe soll es darum gehen ein Programm zur Darstellung eines solchen Apfelmaennchens zu programmieren.
+
=== Theorie... ===
 
 
=== Theorie ===
 
 
# Lies dir die Definition der Mandelbrot-Menge durch.
 
# Lies dir die Definition der Mandelbrot-Menge durch.
# Ueberlege dir, wie du die komplexen Zahlen ''c'' und ''z''<sub>''n+1''</sub> mit Java darstellen kannst.
+
# Überlege dir, wie du die komplexen Zahlen ''c'' und ''z''<sub>''n''</sub> mit Java darstellen kannst. Welche Datentypen sind zur Berechnung notwendig?
# Ueberlege dir, wie du die Folge berechnest (quadrieren komplexer Zahlen).
+
# Überlege dir, wie du die Folge berechnest (quadrieren komplexer Zahlen).
# Ueberlege dir die Abbruchbedingungen fuer die Berechnung der Folge und was aus den beiden Faellen folgt.
+
# Überlege dir die Abbruchbedingungen für die Berechnung der Folge und was aus den beiden Fällen folgt.
# Entwirf die grundsaetzliche Struktur des Algorithmus.
+
# Entwirf die grundsätzliche Struktur des Algorithmus. Plane dabei eine Methode ''pointIteration(...)'' ein, die die Iteration für jeden Punkt durchführt.
  
=== und Praxis ===
+
=== ... und Praxis ===
Nachdem du nun hoffentlich den theoretischen Teil hinter dir hast, kannst du mit der Implementierung beginnen. Zur Grafikdarstellung gibt es die einfach zu bedienende Klasse "Pad", die ein Fenster erstellt in dem du mit einfachen Routinen zeichnen kannst.
+
Nachdem du nun hoffentlich den theoretischen Teil hinter dir hast, kannst du mit der Implementierung beginnen. Zur Grafikdarstellung gibt es die einfach zu bedienende Klasse "Pad", die ein Fenster erstellt, in dem du mit einfachen Methoden zeichnen kannst.
  
Falls du noch nicht die UEBB-Klassen in deinem Javakurs Verzeichnis hast, lade dir von [http://uebb.cs.tu-berlin.de/books/java/] die Klassen Pad, Point unter Terminal herunter und lege sie in das Verzeichnis ab, in dem auch dein Programm entstehen soll.
+
Falls du noch nicht die ÜBB-Klassen in deinem Javakurs-Verzeichnis hast, lade dir von [http://www.uebb.tu-berlin.de/menue/forschung/buecher/pepper_programmieren_lernen_eine_grundlegende_einfuehrung_mit_java_1_und_2_auflage/ der ÜBB-Seite] die Klassen Pad, Point und Terminal herunter und lege sie in dem Verzeichnis ab, in dem auch dein Programm entstehen soll.
Wenn du dies getan hast, steht dir die Grafikfunktionalitaet zur Verfuegung.
+
Wenn du dies getan hast, steht dir die Grafikfunktionalität zur Verfuegung.
 
  //Mit
 
  //Mit
  Pad DrawPad = new Pad();
+
  Pad drawPad = new Pad();
 
  //wird ein neues Fenster erzeugt.
 
  //wird ein neues Fenster erzeugt.
 
   
 
   
  DrawPad.setPadSize(int width, int height);
+
  drawPad.setPadSize(int width, int height);
  //setzt die Groesse des Fensters.
+
  //setzt die Größe des Fensters.
 
   
 
   
  DrawPad.setVisible(true);
+
  drawPad.setVisible(true);
 
  //zeigt das Fenster an.
 
  //zeigt das Fenster an.
 
   
 
   
  DrawPad.drawDot(int x, int y);
+
  drawPad.drawDot(int x, int y);
 
  //zeichnet einen Punkt an der Stelle (x,y).
 
  //zeichnet einen Punkt an der Stelle (x,y).
  
Du musst noch nicht verstehen was dies sprachlich genau bedeutet. In LE5 und LE6 sollte dann klar werden was DrawPad ist.
+
Du musst noch nicht verstehen, was dies sprachlich genau bedeutet. In Vorträgen 5 und Vortrag06 sollte dann klar werden was, drawPad ist.
 +
 
 +
# Implementiere die ''pointIteration(...)''-Methode
 +
# Teste die Methode. Teste dabei Werte die eindeutig innerhalb bzw. außerhalb der Mandelbrot-Menge liegen.
 +
# Lass diese Methode nun für jeden Punkt im Fenster ausführen. Dabei wird der Parameter ''c'' aus der aktuellen x- und y-Koordinate zusammengesetzt.
 +
# Zeichne die Punkte der Mandelbrot-Menge.
 +
# Fertig :)
 +
 
 +
== Hinweise ==
 +
 
 +
=== Koordinaten im Computer ===
 +
Am Computer werden Koordination, historisch bedingt, anders behandelt als im rechtwinkligen Koordinatensystem. Koordination im Computer werden von links nach rechts, als X-Achse und '''von oben nach unten''' als Y-Achse berechnet. Beachte dies bei der Verwendung von ''drawPad.drawDot(x,y)''.
 +
 
 +
(0,0)-------------------- X
 +
|                  (640,0)
 +
|
 +
|
 +
|
 +
|
 +
|
 +
| (0,480)          (640,480)
 +
Y
 +
 
 +
=== Quadrieren komplexer Zahlen ===
 +
.
 +
 
 +
.
 +
 
 +
.
 +
 
 +
.
 +
 
 +
ACHTUNG: Teaser - lies hier nur weiter, wenn du nicht weiter kommst oder ... dir den Spass verderben willst.
 +
 
 +
.
 +
 
 +
.
 +
 
 +
.
 +
 
 +
.
 +
 
 +
.
 +
 
 +
.
 +
 
 +
.
 +
 
 +
.
 +
 
 +
 
 +
Komplexe Zahlen werden in Normalform als ''z'' = ''a'' + ''b'' ''i'' dargestellt.
 +
Um ''z'' zu quadrieren, kann man sich entweder einen eigenen Datentyp schreiben, der die Multiplikation implementiert ODER man macht es sich einfach und berechnet das Quadrat Komponentenweise.
 +
 
 +
''z''<sub>''n''+1</sub> = ''z''<sub>''n''</sub><sup>2</sup> + ''c'' = (''a''<sub>''z''<sub>''n''</sub></sub>+''b''<sub>''z''<sub>''n''</sub></sub>i) + (''a''<sub>''c''</sub> + ''b''<sub>''c''</sub>i)<sup>2</sup> = ''a''<sub>''z''<sub>''n''</sub></sub><sup>2</sup> - ''b''<sub>''z''<sub>''n''</sub></sub><sup>2</sup> + 2''a''<sub>''z''<sub>''n''</sub></sub>''b''<sub>''z''<sub>''n''</sub></sub>i + ''a''<sub>''c''</sub> + ''b''<sub>''c''</sub>i =
 +
(''a''<sub>''z''<sub>''n''</sub></sub><sup>2</sup> - ''b''<sub>''z''<sub>''n''</sub></sub><sup>2</sup> + ''a''<sub>''c''</sub>) + (2''a''<sub>''z''<sub>''n''</sub></sub>''b''<sub>''z''<sub>''n''</sub></sub> + ''b''<sub>''c''</sub>)i
 +
 
 +
''z''<sub>''n''+1</sub> = ''a''<sub>''z''<sub>''n''+1</sub></sub> + ''b''<sub>''z''<sub>''n''+1</sub></sub>i laesst sich also komponentenweise berechnen mit:<br/>
 +
''a''<sub>''z''<sub>''n''+1</sub></sub> = (''a''<sub>''z''<sub>''n''</sub></sub><sup>2</sup> - ''b''<sub>''z''<sub>''n''</sub></sub><sup>2</sup> + ''a''<sub>''c''</sub>)<br/>
 +
''b''<sub>''z''<sub>''n''+1</sub></sub> = (2''a''<sub>''z''<sub>''n''</sub></sub>''b''<sub>''z''<sub>''n''</sub></sub> + ''b''<sub>''c''</sub>)
 +
 
 +
In Java sieht dies wie folgt aus:
 +
double cReal = startX;
 +
double cImg = startY;
 +
double zReal = 0;
 +
double zImg = 0;
 +
 +
zReal = zReal*zReal - zImg*zImg + cReal;
 +
zImg = 2*zReal*zImg + cImg;
 +
 
 +
 
 +
 
 +
 
 +
 
 +
== Kommentare ==
 +
Wenn du Anmerkungen zur Aufgabe hast oder Lob und Kritik loswerden möchtest, ist hier die richtige Stelle dafür. Klicke einfach ganz rechts auf "bearbeiten" und schreibe deinen Kommentar direkt ins Wiki. Keine Scheu, es geht nichts kaputt ;)
 +
 
 +
<!--
 +
Als kleine Starthilfe folgt ein Beispiel, wie so ein Kommentar formatiert sein könnte. Mit "Vorschau zeigen" kannst du dir ansehen, was deine Änderung bewirken würde, ohne wirklich etwas zu ändern.
 +
Du musst übrigens außerhalb dieses auskommentieren Bereichs schreiben ;)
 +
 
 +
==== Robert ====
 +
Na mal schauen, ob irgendjemand diese Funktion wirklich benutzt. Ich fände es jedenfalls toll.
 +
-->
  
Implementiere nun den Algorithmus der das Apfelmaennchen zeichnet!
+
[[Kategorie:Java]]
 +
[[Kategorie:Java_Aufgaben]]

Aktuelle Version vom 1. August 2010, 11:46 Uhr

Vorüberlegungen

Lest euch zunächst etwas Wissen über Komplexe Zahlen an. Legt besonderes Augenmerk auf das Quadrieren von komplexen Zahlen in Normalform, andere Darstellungsformen von komplexen Zahlen werden hier nicht benötigt.

Appleman

Die Mandelbrot-Menge, oder auch Apfelmännchen genannt, ist eine ganz bestimme Menge von komplexen Zahlen. Sie gehört zu den sogenannten Fraktalen und man kennt sie aus unzähligen Darstellungen in Printmedien. Für eine genaue Definition und Berechnungsvorschrift sei auf die Wikipedia verwiesen: Mandelbrot-Menge, Definition über Rekursion. In dieser Aufgabe soll es darum gehen, ein Programm zur Darstellung eines solchen Apfelmännchens zu programmieren.

Theorie...

  1. Lies dir die Definition der Mandelbrot-Menge durch.
  2. Überlege dir, wie du die komplexen Zahlen c und zn mit Java darstellen kannst. Welche Datentypen sind zur Berechnung notwendig?
  3. Überlege dir, wie du die Folge berechnest (quadrieren komplexer Zahlen).
  4. Überlege dir die Abbruchbedingungen für die Berechnung der Folge und was aus den beiden Fällen folgt.
  5. Entwirf die grundsätzliche Struktur des Algorithmus. Plane dabei eine Methode pointIteration(...) ein, die die Iteration für jeden Punkt durchführt.

... und Praxis

Nachdem du nun hoffentlich den theoretischen Teil hinter dir hast, kannst du mit der Implementierung beginnen. Zur Grafikdarstellung gibt es die einfach zu bedienende Klasse "Pad", die ein Fenster erstellt, in dem du mit einfachen Methoden zeichnen kannst.

Falls du noch nicht die ÜBB-Klassen in deinem Javakurs-Verzeichnis hast, lade dir von der ÜBB-Seite die Klassen Pad, Point und Terminal herunter und lege sie in dem Verzeichnis ab, in dem auch dein Programm entstehen soll. Wenn du dies getan hast, steht dir die Grafikfunktionalität zur Verfuegung.

//Mit
Pad drawPad = new Pad();
//wird ein neues Fenster erzeugt.

drawPad.setPadSize(int width, int height);
//setzt die Größe des Fensters.

drawPad.setVisible(true);
//zeigt das Fenster an.

drawPad.drawDot(int x, int y);
//zeichnet einen Punkt an der Stelle (x,y).

Du musst noch nicht verstehen, was dies sprachlich genau bedeutet. In Vorträgen 5 und Vortrag06 sollte dann klar werden was, drawPad ist.

  1. Implementiere die pointIteration(...)-Methode
  2. Teste die Methode. Teste dabei Werte die eindeutig innerhalb bzw. außerhalb der Mandelbrot-Menge liegen.
  3. Lass diese Methode nun für jeden Punkt im Fenster ausführen. Dabei wird der Parameter c aus der aktuellen x- und y-Koordinate zusammengesetzt.
  4. Zeichne die Punkte der Mandelbrot-Menge.
  5. Fertig :)

Hinweise

Koordinaten im Computer

Am Computer werden Koordination, historisch bedingt, anders behandelt als im rechtwinkligen Koordinatensystem. Koordination im Computer werden von links nach rechts, als X-Achse und von oben nach unten als Y-Achse berechnet. Beachte dies bei der Verwendung von drawPad.drawDot(x,y).

(0,0)-------------------- X
|                  (640,0)
|
|
|
|
|
| (0,480)          (640,480)
Y

Quadrieren komplexer Zahlen

.

.

.

.

ACHTUNG: Teaser - lies hier nur weiter, wenn du nicht weiter kommst oder ... dir den Spass verderben willst.

.

.

.

.

.

.

.

.


Komplexe Zahlen werden in Normalform als z = a + b i dargestellt. Um z zu quadrieren, kann man sich entweder einen eigenen Datentyp schreiben, der die Multiplikation implementiert ODER man macht es sich einfach und berechnet das Quadrat Komponentenweise.

zn+1 = zn2 + c = (azn+bzni) + (ac + bci)2 = azn2 - bzn2 + 2aznbzni + ac + bci = (azn2 - bzn2 + ac) + (2aznbzn + bc)i

zn+1 = azn+1 + bzn+1i laesst sich also komponentenweise berechnen mit:
azn+1 = (azn2 - bzn2 + ac)
bzn+1 = (2aznbzn + bc)

In Java sieht dies wie folgt aus:

double cReal = startX;
double cImg = startY;
double zReal = 0;
double zImg = 0;

zReal = zReal*zReal - zImg*zImg + cReal;
zImg = 2*zReal*zImg + cImg;



Kommentare

Wenn du Anmerkungen zur Aufgabe hast oder Lob und Kritik loswerden möchtest, ist hier die richtige Stelle dafür. Klicke einfach ganz rechts auf "bearbeiten" und schreibe deinen Kommentar direkt ins Wiki. Keine Scheu, es geht nichts kaputt ;)