Hi!
Ich habe mal aus Spaß ein Programm geschrieben (Lazarus), welches die Mandelbrot-Menge grafisch darstellt (bezüglich komplexer Zahlen ist das sogar ein kleines wenig mehr geworden). Das Apfelmännchen selber ist auch schon recht gut zu erkennen. Allerdings würde ich mir ein wenig schönere Farben wünschen. Bis jetzt habe ich das provisorisch mal so gelöst:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| const DIVER_LIMIT = 1000; FLOOD_LIMIT = 2000; LIMIT_ORANGE = 80; LIMIT_RED = 40; LIMIT_MAROON = 20; LIMIT_BLUE = 10; LIMIT_BLACK = 5;
...
function ProveDivergence(c: TKomplex): Integer; var z: TKomplex; begin Result := 0; z := KZero; while ((KAbs(calcMandelbrot(z, c)) < DIVER_LIMIT) and (Result <= FLOOD_LIMIT)) do begin z := calcMandelbrot(z, c); inc(Result); end; end;
...
function MandelColor(Diver: Integer): TColor; begin if Diver <= LIMIT_BLACK then Result := clBlack else if Diver <= LIMIT_BLUE then Result := clNavy else if Diver <= LIMIT_MAROON then Result := clMaroon else if Diver <= LIMIT_RED then Result := clRed else if Diver <= LIMIT_ORANGE then Result := $0099ff else Result := $00ffff; end;
... |
Hier prüfe ich also für jedes
c, wobei ich die Reihe z_n = Z_(n-1)² + c maximal bis n = FLOOD_LIMIT fortsetze, ob der Betrag KAbs(z) größer als DIVER_LIMIT wird. Anhand dieses N (Variable habe ich hier Diver genannt) wird dann die Farbe festgelegt (Mit einer Schwarz-Weiß-Darstellung wollte ich mich hier nicht zufrieden geben).
Da fallen mir aber mehrere Dinge auf:
- DIVER_LIMIT ist hier evtl. nicht ideal - ich kann aber nicht einschätzen, ob es höher oder tiefer sein müsste. Wenn es aber zu hoch ist (ich hab zwischen 10000 und 2 alle Größenordnungen durch), dauert der Kern (gelb) beim Zeichnen pro Spalte 1 Sekunde, während der schwarze Rest dann ziemlich schnell geht.
- Abstufung war nur zum Testen da. Ich hätte lieber einen graduellen Übergang, wie es in der Wikipedia der Fall ist.
- Zudem sind die Farblimits sowie die Farben selbst ziemlich hässlich gewählt.
Wie geht man denn normalerweise vor, wenn man ein Fraktal darstellen will? Evtl. will ich das Programm auch dahingehend erweitern, dass ich Julia-Mengen und andere Fraktale darstellen kann.
Mein erster Gedanke war jetzt ein Blau-Weiß-Übergang. Das kann man ja einfach berechnen, wenn man r(n), g(n) und b(n) als lineare Funktionen betrachtet. Aber besonders schön ist das auch nicht. Am liebsten hätte ich zwischendurch noch Orange-/Gelb-Töne (eben so wie in der Wikipedia).
PS: Ich habe natürlich die Forums-Suche benutzt, aber was ich da gefunden habe, war eben auch nicht viel mehr als ein einfacher Blau-Weiß-Übergang oder elend langsam.
//EDIT: Ein halbwegs ästhetisches Ergebnis kriege ich schonmal damit:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function MandelColor(DIVER: Integer): TColor; var b, r: Integer; begin if Diver < 20 then begin b := $ff; r := Trunc($ff * Diver / 20); Result := RGB(r, r, b); end else if Diver < 500 then Result := clWhite else Result := clBlack end; |
Aber wie gesagt, nur ein naiver Blau-Weiß-Ansatz und ich bin nicht wirklich zufrieden damit.
Moderiert von
Narses: Topic aus Off Topic verschoben am Do 12.08.2010 um 18:26