Mandelbrot Menge

Status
Nicht offen für weitere Antworten.
S

Sven

Gast
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

Bekanntes Mitglied
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...) ]
 
S

Sven

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

Beni

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

Bleiglanz

Gesperrter Benutzer
>>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
 
S

Sven

Gast
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

Bekanntes Mitglied
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

Top Contributor
kopfsalat hat gesagt.:
...
Hier eine kurze Erklärung für solcherart Fraktale allgemein, quasi der Kommentar ohne Programm:
...

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

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

Top Contributor
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
[2] Denken
[3] Antworten

PROOOGRAAAMMMM nichts mit "Die Menge"
...
Finde nur Programme ohne Kommentar, ich will ein ausführliches Programm mit Kommentar, was versteht du nicht ???

Wer im Glashaus sitzt, ...
 

Bleiglanz

Gesperrter Benutzer
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

Bekanntes Mitglied
@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':

Code:
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

Top Contributor
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

Top Contributor
Ach noch etwas, ich würde in der Methode "main" die folgende Zeile so schreiben:
Code:
        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

Bekanntes Mitglied
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

Mitglied
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
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
U Threads Mandelbrot und Juliaset Java Basics - Anfänger-Themen 0
Z Applet mit Mandelbrot und Juliam. läuft nicht rund Java Basics - Anfänger-Themen 6
ArrayList mit unbekannter Menge an Arrays die Arrays vergleichen Java Basics - Anfänger-Themen 9
A Klasse Menge mit Objekten der Klasse Person Java Basics - Anfänger-Themen 8
O Iterator für eine geordnete Menge Java Basics - Anfänger-Themen 134
C Die Klasse Menge mit Konstruktoren und einfachen Methoden Java Basics - Anfänger-Themen 5
C Menge (Klasse und Objekte) Java Basics - Anfänger-Themen 3
Y Variable Menge von Objekten erzeugen und mit ihren Attributen rechnen Java Basics - Anfänger-Themen 7
P Element aus einer einelementigen Menge bekommen. Java Basics - Anfänger-Themen 8
S Fehler im Programm "Menge" Java Basics - Anfänger-Themen 13
U Menge des Vorkommens eines Strings in einem Anderen Java Basics - Anfänger-Themen 5
Guybrush Threepwood Effizientester Datentyp zur Speicherung einer ungeordneten Menge von ints Java Basics - Anfänger-Themen 8
S Menge -> Vereinigung Java Basics - Anfänger-Themen 2
K Neue Menge aus zwei Mengen konstruieren Java Basics - Anfänger-Themen 3
S Klasse Menge Java Basics - Anfänger-Themen 12
K Menge von Mengen Java Basics - Anfänger-Themen 2
S Wert-Orientere Klasse Menge Java Basics - Anfänger-Themen 23
G wie chars mit einer menge von chars vergleichen Java Basics - Anfänger-Themen 9
L Kombinationen einer Menge rekursiv berechnen Java Basics - Anfänger-Themen 11
G Wie erzeuge ich eine variable Menge von Variablen! Java Basics - Anfänger-Themen 2
S Leere Menge von integer Java Basics - Anfänger-Themen 3
K Variable Menge an Variablennamen per Schleife erstellen Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben