Lehrer Nussbaumer - JAVA (eine kleine Einführung ;)

Grundlagen

GUI

Eingabe

Ausgabe

Applikationen

  1. Wurfbahnen
  2. Satellitenbahnen
  3. Interaktion
  4. Notizzettel
  5. Typkonvertierung
  6. Rechner
  7. Mandelbrot-Menge
  8. Julia-Menge

Applets

Servlets

Beispiele

Spiele

IDEs

Skriptum

JAVA-DOCS


-----------------
letzte Änderung:
09 December 2021
-----------------
Lehrer Nussbaumers Seite

... in Arbeit ...

Die Mandelbrot-Menge

... wird auch "Apfelmännchen" - wegen seiner charakteristischen Form - genannt ;-). Wie auch immer: Das Gebilde ist ein Fraktal, das durch eine rekursive definierte Folge von komplexen Zahlen entsteht.

z(n+1) = z(n)²+c     z(0) = (0, 0)

Stellen wir die komplexe Zahl z = (x, y) mit Realteil x und Imaginärteil y dar, und sind a und b Real- und Imaginärteil der Zahl c = (a, b) so erhalten wir:

(x,y) := (x² - y², 2*x*y) + (a, b)

Wir untersuchen da Verhalten des Koordinatenursprunges z = (0, 0) unter der angegebenen Iteration. Konvergiert er für einen Parameter (a, b) der komplexen Zahlenebene bei der angegebenen Rekursion, so ist dieser ein Element der sogenannten Mandelbrot-Menge (genannt nach dem Mathematiker B.B. Mandelbrot, der diese Beziehungen in der 2. Hälfte des 20. Jahrhunderts untersuchte). Der "konergente" Punkt wird beispielsweise schwarz eingefärbt. Strebt die Rekursion für den gewählten Parameter gegen Unendlich, so wird er "verworfen".

Anschließend wird der nächste Punkt untersucht.

Diese Gleichung lösen wir koordinatenweise auf und codieren eine entsprechende Iteration über alle Punkte eines gewählten Quadrates der komplexen Zahlenebene. Das Quadrat wird durch den "Eckpunkt" (amin, bmin) und durch seine Kantenlänge k festgelegt. Zusätzlich müssen die Punkte der komplexen Zahlenebene auf ein Bildschirmquadrat (im untenstehenden Programm 200x200 Pixel) "gezoomt" werden. Dazu dividieren wir die Kantenlänge des Quadrats durch 200 (Zahl der Pixel, Schrittweite ds:=k/200)und erhöhen bei jeder Iteration den Realteil bzw. den Imaginärteil der komlexen Zahl um diese Schrittweite ds:

Beispiel:


Code:

import java.awt.*;
import java.awt.event.*;

public class mandel extends Frame {

    public static void main(String arguments[]) {
        mandel proggi = new mandel();

        WindowListener wl = new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        };
        proggi.addWindowListener(wl);
        proggi.setLocation(100,100);
        proggi.resize(300,300);
        proggi.show();
    }

    mandel() {
        super("Mandelbrotmenge");
    }

    public void paint (Graphics bs) {
	double amin;
	double bmin;
	double kante;
	double ds;
	double a;
	double b;
	double x;
	double y;
	double xx;
	double yy;
	int s;
	int r;
	int zaehler;

	amin=-1.5;
	bmin=-1;
	kante=2;

	ds=kante/200;

	a=amin;

        bs.setColor(Color.black);
	bs.fillRect(50,50,200,200);

	for (s=0; s<=200; s++) {
	    b=bmin;
	    for (r=0; r<=200; r++) {
		x=0;
		y=0;
		zaehler=0;
		while ((zaehler < 100) && (Math.sqrt(x*x+y*y)<2)) {
		    zaehler++;
		    xx=x*x-y*y+a;
		    y=2*x*y+b;
		    x=xx;
		}
		if (zaehler > 100) {
		    bs.setColor(Color.black);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}

		if (zaehler < 10) {
		    bs.setColor(Color.red);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}
		else if (zaehler < 20) {
		    bs.setColor(Color.green);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}
		else if (zaehler < 30) {
		    bs.setColor(Color.lightGray);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}
		else if (zaehler < 40) {
		    bs.setColor(Color.blue);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}
		else if (zaehler < 50) {
		    bs.setColor(Color.yellow);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}
		else if (zaehler < 60) {
		    bs.setColor(Color.magenta);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}
		else if (zaehler < 70) {
		    bs.setColor(Color.gray);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}
		else if (zaehler < 80) {
		    bs.setColor(Color.orange);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}
		else if (zaehler < 90) {
		    bs.setColor(Color.white);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}
		else if (zaehler < 100) {
		    bs.setColor(Color.cyan);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}

		b=b+ds;
	    }
	    a=a+ds;
	}
    }
}

Kommentar:

Die Methode Paint wird nach dem Start der Applikation aufgerufen. Sie entält die "eigentlichen" Programmzeilen...


Aufgabe:

Erweitere das obige Programm um drei Eingabefelder für amin, bmin und kante, um den Ausschnitt der Mandelbrotmenge und die Vergrößerung individuell wählen zu können! Verwende ein geeignetes Layout...


Bemerkung:

Wir haben das Verhalten des Koordinatenursprunges (0, 0) unter der Iteration z(n+1) = z(n)² + c betrachtet, wobei der "Parameter" c jeder Punkt der komplexen Zahlenebene (um den Ursprung und der negativen reellen Achse herum) ist. Jeder Punkt der Mandelbrotmenge ergibt eine konvergente Iteration für den Koordinatenursprung, jeer Punkt außerhalb der Mandelbrotmenge führt zu einer divergenten Iteration


© Alfred Nussbaumer, Weblog "MiniNuss"