# Mandelbrot Menge



## Sven (15. Dez 2004)

Ich bräuchte mal ein einfaches Beispiel für die Mandelbrot Menge. Ich hab schon bei google gesucht, finde aber nur Programme ohne Kommentar und ich hätte gerne eine genauere Erklräung wie man vorgehen könnte.

Danke


----------



## 8ull23y3 (15. Dez 2004)

Was ist mit Mandelbrot Menge gemeint?


----------



## Beni (15. Dez 2004)

Wikipedia - Mandelbrot :wink:


----------



## 8ull23y3 (15. Dez 2004)

Ah du Sch... Integrale...schnell weg 

_[Edit by Beni: also Intergale, das hat nichts mit Gale zu tun (vielleicht kommt die dir hoch, wenn du "Integrale" hörst...) ]_


----------



## Sven (15. Dez 2004)

Ja irgendwie will hier keiner mal was einfaches Posten. Ein Beispiel mit kommentar wär nicht schlecht


----------



## Beni (15. Dez 2004)

Ich hab dazu keine Lust, zumal die Wiki-Leute schon alle Formeln + Pseudocode aufgeschrieben haben :wink:


----------



## 8ull23y3 (15. Dez 2004)

Integral einfach? Find ich nicht. Hab ich schon immer gehasst.


----------



## L-ectron-X (16. Dez 2004)

Ich habe ein komplettes Programm auf meinem Server gehostet, darf aber den Code nicht raus rücken, weil ich ihn nicht geschrieben habe, sondern nur das Programm zu Demonstrationszwecken hoste.
http://www.bytes4fun.de/ivo/


----------



## Manfred (16. Dez 2004)

8ull23y3 hat gesagt.:
			
		

> Integral einfach? Find ich nicht. Hab ich schon immer gehasst.



Mandelbrot hat nix mit Integral zu tun!

Das einzige was dort beschrieben wird ist die Iteration!


----------



## Bleiglanz (16. Dez 2004)

>>Ich bräuchte mal ein einfaches Beispiel für die Mandelbrot Menge

Hä? Sollma die Menge hier posten?

Brauchst du einen Beispiel Algorithmus? 

google findet für "Mandelbrot Set Example Program" 33200 Treffer


----------



## Sven (19. Dez 2004)

Hä? Sollma die Menge hier posten? 

Brauchst du einen Beispiel Algorithmus? 

>> finde aber nur Programme ohne Kommentar und ich hätte gerne eine genauere Erklräung wie man vorgehen könnte <<

[1] Lesen
[2] Denken
[3] Antworten

PROOOGRAAAMMMM nichts mit "Die Menge"

>> google findet für "Mandelbrot Set Example Program" 33200 Treffer <<

Finde nur Programme ohne Kommentar, ich will ein ausführliches Programm mit Kommentar, was versteht du nicht ???


----------



## kopfsalat (19. Dez 2004)

Ich habe das mal in PureBasic mit der Julia- und der Mandelbrotmenge gemacht, dabei aber direkt in den GrafikBuffer geschrieben und ohne Kommentare. Komplette Berechnung Mandelbrot dauert ca. 200 ms. Die Julia-Menge geht sogar noch weit fixer, da kann man dann sogar per Mausbewegung die Parameter ändern.

Hier eine kurze Erklärung für solcherart Fraktale allgemein, quasi der Kommentar ohne Programm:
Stelle dir die Bildschirmfläche als komplexe Zahlenebene vor. Wenn Du nicht weißt, was das ist, dann schau mal nach komplexen Zahlen. (Sind eigentlich nichts weiter als Zahlenpaare zweier reellen Zahlen, für die es bestimmte Rechengesetze gibt, so dass man sie wieder addieren, multiplizieren kann, etc. Dadurch werden die reellen Zahlen ein Unterraum der komplexen.)

Dann kann man wie mit Koordinaten sagen, z.B. an 'Stelle' (1.0, 0.7) ist die 'komplexe Zahl' (1.0 , 0.7).
Also entspricht nun jeder Punkt auf dem Bildschirm einer komplexen Zahl. Der Nullpunkt liegt bei Mandelbrot für eine schöne Sicht normalerweise etwas rechts in der Mitte. Bildschirmränder Oben/Unten liegen etwa bei 1.25, -1.25, Links/Rechts etwa bei -2.5, 2.5

Nun wird bei Mandelbrot einfach _für jeden Punkt_ C des Bildschirms die folgende Folge _neu_ berechnet:
Zunächst wird A = 0 gesetzt, dann:
; starte Loop
A_{n+1} = A_{n}^2 + C

Wobei A und C komplexe Zahlen sind.
Es wird also immer nur - angefangen mit A=0 - die Zahl A quadriert, dann wird C (unser Bildschirmwert) dazuaddiert.
Dieser Wert wird A zugewiesen (Also im Prinzip A = A^2 + C)
Und endlos so weiter (für jeden Bildschirmpunkt).
Leider können wir nicht unendlich lange rechnen, deswegen müssen wir zumindest schonmal eine Höchstgrenze für die Iteration setzen (diese kann schon bei 30 liegen, man kann sie aber durch aus auch auf 10000 setzen, je höher, desto genauer, aber desto langsamer).
Nun geht es um folgendes:
Die Folge kann genau eines von zwei Verhalten zeigen:
a) der Betrag der Zahl A (wird einfach mit Phytagoras berechnet) wächst immer weiter ins bodenlose, ins Unendliche.
b) der Betrag der Zahl A bleibt bis in alle Zeit unter einer festen Schranke, der er sich immer weiter annähert.

Nun machen wir einfach folgendes:
Wir testen bei jedem Schleifendurchlauf, ob unsere Zahl A schon so groß ist, dass die Folge gegen unendlich laufen wird. (dafür reicht z.B. ein Betrag von 2.0) Dann können wir die Schleife so butz abbrechen. Je nachdem, wie schnell sie diese Schranke überschritten hat, malen wir den entsprechenden Punkt C in grün, oder rot, oder blau, oder einer Mischfarbe davon (Diese Schnelligkeit können wir einfach vom Schleifenzähler ableiten).
Sollte der Betrag von A selbst nach unserer definierten Höchstgrenze noch kleiner als 2.0 sein, dann malen wir den entsprechenden Punkt C einfach schwarz.

Fertig!

Die Juliamenge ist übrigens ähnlich:
Die Formel ist dieselbe, nur die Startwerte werden anders erhalten: Hier wird im Unterschied zu Mandelbrot das C für alle Punkte gleich gewählt (typisch zwischen 0 und 1).
Die Bildschirmpunkte geben diesmal den Startwert für A, dieser ist also - im Gegensatz zu Mandelbrot- nicht 0.
Interessant ist, dass man für C = 0 den Einheitskreis erhält. Ist ja auch logisch, da dann die Formel lautet:
"A = A^2". Für Beträge > 1 läuft die Folge natürlich gegen unendlich, für Beträge kleiner als 1 gegen einen fixen Wert (hier immer 0). Hier jedoch gibt es sogar noch den dritten Fall: Für Betrag = 1 bleibt der Betrag immer gleich 1. Es existiert also eine feste Trennlinie, welche einfach ein langweiliger Kreis ist. Für Werte C <> 0 gibt es dann stattdessen fraktale Zerklüftungen, die sich bis in unendlich kleine Größenordnungen stets neu verwirbeln.
Die Grenze selbst, die vorher 1 war, ist nun fraktal, sie existiert 'nicht wirklich festlegbar', ähnlich einer reellen Zahl, die man immer nur zwischen zwei Werten genauer eingrenzen kann.

Leider ist das Wochenende vorbei, sonst hätte ich den Code noch portiert, das kann ich aber demnächst mal nachholen. Kannst dich ja erstmal weiter da reinfuchsen. Komplexe Zahlen und Fraktale sind auf jedenfall interessante Dinge!


----------



## abollm (20. Dez 2004)

kopfsalat hat gesagt.:
			
		

> ...
> Hier eine kurze Erklärung für solcherart Fraktale allgemein, quasi der Kommentar ohne Programm:
> ...
> 
> ...



Folgende, nach meiner Meinung wichtige Ergänzungen zum Thema Programmierung der Mandelbrot-Menge:

Es ist mathematisch erwiesen, dass die Mandelbrot-Menge durch eine geschlossene Linie begrenzt ist. Wie auch oben erläutert und erwähnt, tasten die meisten Programme ein rechteckiges Feld von Pixeln ab. Der wesentliche Nachteil dieser typischen Programme besteht darin, dass sie relativ betrachtet sehr viel Zeit benötigen. Mit einem Algorithmus, der die Ränder der Einkreisungen, das sind die Äquipotentiallinien die die M.-Menge einkreisen, approximiert läuft der ganze Vorgang wesentlich schneller ab als der gewöhnliche "Pixel"-Algorithmus.


----------



## abollm (20. Dez 2004)

Sven hat gesagt.:
			
		

> ...
> >> finde aber nur Programme ohne Kommentar und ich hätte gerne eine genauere Erklräung wie man vorgehen könnte <<
> 
> [1] Lesen
> ...



Wer im Glashaus sitzt, ...


----------



## Bleiglanz (20. Dez 2004)

> Ich bräuchte mal ein einfaches Beispiel für die Mandelbrot Menge.


Erst Denken, dann Fragen

Es gibt verschiedene Mandelbrot-Mengen (auch wenn die z^2+c die bekannteste ist), deshalb war deine Frage nicht gut formuliert, warum hast du nicht geschrieben

"Ich bräuchte mal ein einfaches Programm mit Quelltext, welches die Mandelbrot-Menge auf dem Bildschirm darstellt"


Dass bei tausenden Google Treffern nicht irgendwo ein kommentierter Source-Code dabei ist glaubst du ja wohl selber nicht....


----------



## kopfsalat (20. Dez 2004)

@abollm
ich glaube, beim Abtasten der Äquipotentiallinien entsteht ab einer gewissen Komplexität der Kurve (je näher man an der fraktalen Grenze ist) das Problem, dass man Gefahr läuft, niemals Abschnitte zu erreichen, die nur über eine extrem dünne Verbindung mit dem Hauptbereich verbunden sind, so z.B. das kleine Apfelmännchen in der spitzen Nase des großen Apfelmännchens. Wenn man die Linie so abtastet, dass man jedesmal einige Werte in der Umgebung ausrechnet, um zu gucken wo man dann hingeht, kann man durchaus eine extrem schmale Abzweigung übergehen, und da diese beliebig schmal sein können, kann dies bei allen Schrittweiten passieren. Oder gibt es für dieses Problem eine Lösung ?

Hier ist ein einfacher Code für die 'normale Art':


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

public class MandelbrotFrame extends Frame
{
    // drawing the mandelbrot set
    // by kopfsalat

    private int width, height;
    private double left, top, right, bottom;
    private double xside, yside, xscale, yscale;

    public MandelbrotFrame (int width, int height, double left, double top, double right, double bottom)
    {
        // creating the frame
        super("Mandelbrot");
        
        // setting some variables for calculation
        this.width  = width;
        this.height = height;
        this.left   = left;
        this.right  = right;
        this.top    = top;
        this.bottom = bottom;

        this.xside  = right - left;
        this.yside  = bottom - top;
        this.xscale = xside / width;
        this.yscale = yside / height;

        // set some parameters and the listener for the frame
        this.setSize(width, height);
        this.setVisible(true);
        addWindowListener(new WindowAdapter()
            {   public void windowClosing(WindowEvent e) { System.exit(0); } } );
    }

    public void paint(Graphics g)
    {
        double cx, cy, zx, zy, zxPow, zyPow, tempx;
        int colorcounter, maxiterations = 32;

        for (int y = 0; y < height; y++)
        {
            for (int x = 0; x < width; x++)
            {
                cx = x * xscale + left;
                cy = y * yscale + top;
                zx = 0; zxPow = 0;
                zy = 0; zyPow = 0;
                colorcounter = 0;

                while (zxPow + zyPow < 4.0 && colorcounter < maxiterations)
                {
                    tempx = zxPow - zyPow + cx;
                    zy = 2.0 * zx * zy + cy;
                    zx = tempx;
                    colorcounter++;
                    zxPow = zx * zx;
                    zyPow = zy * zy;
                }
                g.setColor(new Color(colorcounter * 0x09091A)); // play with this value for other coloreffects
                g.drawRect(x,y,0,0);
             }
        }
    }

    public static void main (String [] args)
    {
        new MandelbrotFrame (750, 750, -2.0, 1.25, 0.5, -1.25);
    }
}
```


----------



## abollm (20. Dez 2004)

kopfsalat hat gesagt.:
			
		

> @abollm
> ich glaube, beim Abtasten der Äquipotentiallinien entsteht ab einer gewissen Komplexität der Kurve (je näher man an der fraktalen Grenze ist) das Problem, dass man Gefahr läuft, niemals Abschnitte zu erreichen, die nur über eine extrem dünne Verbindung mit dem Hauptbereich verbunden sind, so z.B. das kleine Apfelmännchen in der spitzen Nase des großen Apfelmännchens. Wenn man die Linie so abtastet, dass man jedesmal einige Werte in der Umgebung ausrechnet, um zu gucken wo man dann hingeht, kann man durchaus eine extrem schmale Abzweigung übergehen, und da diese beliebig schmal sein können, kann dies bei allen Schrittweiten passieren. Oder gibt es für dieses Problem eine Lösung ?
> 
> ...



Es gibt (nicht nur) eine Lösung des Problems. Ich habe auch irgendwo einen Algorithmus dazu herumliegen, aber - wie du dir wahrscheinlich denken kannst - muss der auch portiert werden.

Wenn ich mal (viel) Zeit und Lust habe, mache ich das und poste ihn hier an geeigneter Stelle.


----------



## abollm (20. Dez 2004)

Ach noch etwas, ich würde in der Methode "main" die folgende Zeile so schreiben:

```
new MandelbrotFrame (800, 800, -2.0, 1.25, 0.5, -1.25);
```

Dann sieht das "Apfelmännchen" einfach besser aus, und bildet zudem die mathematischen Grundlagen getreuer ab.


----------



## kopfsalat (21. Dez 2004)

Habs statt auf 800x800 auf 750x750 geändert, um mit 1024x768 noch ordentlich zu laufen.



> Es gibt (nicht nur) eine Lösung des Problems. Ich habe auch irgendwo einen Algorithmus dazu herumliegen, aber - wie du dir wahrscheinlich denken kannst - muss der auch portiert werden.


Würde mich sehr interessieren! Vielleicht kannst Du mir den Code mal schicken (PN), falls Du ihn finden solltest ? Mußte auch nicht portieren, es ist ja eh fast jede Programmiersprache gleich...

Ich hatte mal eine ganze Weile damit zugebracht, einen Algorithmus zu basteln, der die Umrandung mit fester Schrittweite, aber ohne festgelegtes Raster abtastet, aber bin eben an dem beschriebenen Problem gescheitert, und daran, dass es zu fast jeder Schrittweite Situationen gibt (ohne Raster), wo man in kleinen Verästelungen in eine Schleife gerät, und somit blöde Zickzackwege abschreitet, da hätte ich noch einen 'BisherigenWegÜberkreuzt'-Check nachrüsten müssen, dann habe ich das erstmal auf Eis gelegt. Wenn Du einen Algorithmus hast, der die Grenze sicher abschreiten kann, wäre das grandios !


----------



## skullbocks (13. Mai 2007)

Hi,

vielen Dank an @kopfsalat dein Quell Code hat uns bei der Farbausgabe sowie beim Erzeugen der Mandelbrot Menge sehr gut geholfen.

Danke.

mfg 
skullbocks


----------

