PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mandelbrot-Generator Fragen


Ganon
2011-02-09, 15:09:46
Heyho.

Ich bastle gerade hobbymäßig an einem Mandelbrot-Generator. Steht halt auf meiner "muss man mal programmiert haben" Liste :-D

Ich auch das WE gut voran gekommen. Ich habe es zuerst nach der Anleitung von http://warp.povusers.org/Mandelbrot/ gemacht.

Mit long double kommt man aber nicht wirklich weit, also habe ich GMPlib eingebaut. Damit ist das Problem mit der Unendlichkeit ja schon mal gelöst, da man bei GMPlib mit theoretisch unendlich Bit rechnen kann.

Jetzt hab ich noch 3 Fragen, die ja vllt. jemand hier beantworten kann.

1. Durch GMPlib wird das ganze ja recht langsam, trotz Multithreading. Ich zeichne das ja nun bisher noch pixelweise. Ich hab hier im Forum, und auch anderswo gelesen, dass man da auch so rangehen kann, dass man erst einen Rahmen um einen Bereich rechnet und dann guckt ob da Unterschiede auftreten, wenn nicht, dann alles in der Farbe zeichnen (sofern das hier jetzt korrekt ist). Da frage ich mich, inwieweit man da die Größe des Rahmens bestimmt?

2. Hier mal zwei Beispielbilder:

http://xenon.42degreesoffreedom.com/~matti/Mandelbrot3.png

http://xenon.42degreesoffreedom.com/~matti/Mandelbrot5.png


Man erkennt zwischendrin diverse weiße und schwarze Punkte. Liegt wohl daran, dass der Pixel da gerade etwas ungünstig liegt zur Farbbestimmung, sofern ich keinen Fehler gemacht habe. Gibt's da Ansätze sowas zu vermeiden? Vllt. liegt die Antwort darin ja auch in Frage 3:

3. Wie funktioniert das mit den Farbpaletten? Ich lese überall nur "Farbe anhand der Iterationsschritte (der Anzahl) bestimmen". Aber so ein wirkliches Beispiel hab ich da jetzt noch nicht gesehen. Und eine Tabelle mit 1000 und mehr Einträgen wäre ja auch iwie komisch... hat da jemand vllt. ein Tipp?

Danke ^^

Spasstiger
2011-02-09, 17:17:11
Um Artefakte zu vermeiden, könntest du Antialiasing nutzen, das heißt das Bild in höherer Auflösung rechnen als die Zielauflösung und dann runterrechnen (durch arithmetische Mittelung z.B., besser wäre ein Gaussfilter).

robobimbo
2011-02-09, 18:10:27
1.) hm, ich würd den rahmen so quadtreemässig aufspannen: vierteln, wenn unterschiede dann vierteln...

pest
2011-02-09, 18:12:43
3. Wie funktioniert das mit den Farbpaletten? Ich lese überall nur "Farbe anhand der Iterationsschritte (der Anzahl) bestimmen". Aber so ein wirkliches Beispiel hab ich da jetzt noch nicht gesehen. Und eine Tabelle mit 1000 und mehr Einträgen wäre ja auch iwie komisch... hat da jemand vllt. ein Tipp?


ist zwar schon 10+ Jahre her...aber du startest doch eine Iteration pro Pixel=komplexe Zahl. Die Anzahl der Iterationen die man benötigt um noch innheralb der Mandelbrot-Menge zu bleiben bestimmt die Farbe.

eine Palette ist jetzt z.B. eine Menge von 256 aus den 256^3 möglichen Werten bei RGB24, und da pickst du dir jetzt die Benötigte raus.

Ganon
2011-02-09, 19:29:55
Um Artefakte zu vermeiden, könntest du Antialiasing nutzen, das heißt das Bild in höherer Auflösung rechnen als die Zielauflösung und dann runterrechnen (durch arithmetische Mittelung z.B., besser wäre ein Gaussfilter).

Ah OK... nagut, das rutscht dann erst mal weiter nach unten auf den TODOs, da ich hauptsächlich Bilder berechnen will und man das dort ja dann per Grafikanwendung machen kann.

1.) hm, ich würd den rahmen so quadtreemässig aufspannen: vierteln, wenn unterschiede dann vierteln...

OK, muss ich dann mal probieren :)

eine Palette ist jetzt z.B. eine Menge von 256 aus den 256^3 möglichen Werten bei RGB24, und da pickst du dir jetzt die Benötigte raus.

Hmm... gibt's da irgendwie einen Standard, oder so?

pest
2011-02-09, 20:22:19
na lass dir halt was einfallen :)...wie bestimmst du die Farbe denn jetzt?

Zu DOS Zeiten war das halt praktisch weil man da über die VGA-Register die Palette rotieren lassen konnte...was fancy aussah :). Wenn du z.B. max 256 Iterationen zulässt, könntest ja erstmal mit (r[z],g[z],b[z]) probieren, wobei z die Iterationstiefe des Pixels ist. Oder g und b festlegen und nur r variabel halten. Wenn du jetzt in einem Schritt jeden RGB-Vektor um 1 erhöhst (nat. mit Clamp oder Ähnlichem) bekommst du diesen Paletten-Rotier-Effekt hin.

Ganon
2011-02-09, 20:43:19
na lass dir halt was einfallen :)...wie bestimmst du die Farbe denn jetzt?

Wie in dem Dokument oben beschrieben:
iteration <= maxIterations / 2 - 1
schwarz -> eine Farbe

iteration >= maxIterations / 2 && iteration <= maxIterations - 1
eine Farbe -> weiß

Wenn du z.B. max 256 Iterationen zulässt

Ne, da ist ja schnell vorbei :D Aber ich spiel trotzdem mal rum, so wie du sagst...

Aber gut, ich muss dann mal weiter gucken ^_^ Ich glaub ich versuch das erst mal mit dem beschleunigen des Rendervorgangs.