000
04.04.2008, 01:54 Uhr
steinachim
|
Hallo,
ich versuche gerade ein Programm zu schreiben, dass die Mandelbrotmenge (und später auch andere Fraktale) graphisch auf dem Bildschirm ausgeben kann. Soweit ich es erkennen kann ist mein Code prinzipiell korrekt, aber trotzdem weicht das entstandene Bild von der normalen Mandelbrotform ab.
C++: |
void drawMandelbrot(int scr_width, int scr_height) { float re_c = 0.0; float im_c = 0.0;
// leere Bitmap erzeugen BITMAP *buffer; buffer = create_bitmap(scr_width, scr_height); clear(buffer);
PALETTE pal; get_palette(pal);
// Grün als Ausgangsfarbe int green = makecol(0, 128, 0);
// Zählschritte von einem c zum nächsten float step_x = 0.0; float step_y = 0.0;
step_x = 5.0 / (float)scr_width; // Gesamtbreite des Wertebereichs (-2,5 bis +2,5) step_y = 5.0 / (float)scr_height;
if ( step_x > step_y ) step_y = step_x; // kleineren Wert nehmen, damit Bild nicht verzerrt else step_x = step_y;
// Jeden Bildschirmpixel durchlaufen for ( int pos_x = 0; pos_x < scr_width; pos_x++ ) { for ( int pos_y = 0; pos_y < scr_height; pos_y++) { // Wertebereich: -2,5 bis +2,5 in x- und y-Richtung re_c = -2.5 + (pos_x * step_x); im_c = -2.5 + (pos_y * step_y);
// Pixel nach Anzahl der Iterationen einfärben int it = iterateMandelbrot(re_c, im_c); if ( it > 0 ) { putpixel(buffer, pos_x, pos_y, green+it); } } }
// Bild anzeigen und als img.bmp speichern blit(buffer, screen, 0, 0, 0, 0, scr_width, scr_height); save_bitmap("img.bmp", buffer, pal); destroy_bitmap(buffer); }
int iterateMandelbrot(float re_c, float im_c) { float re_z = 0.0; // z0 setzen float im_z = 0.0; /* z(n) = z(n-1)^2 + c z = x + iy z^2 = x^2 + 2xiy - y^2 */
for ( int i = 0; i < 1000; i++ ) { // max 1000 Iterationen re_z = re_z*re_z - im_z*im_z + re_c; im_z = 2*re_z*im_z + im_c;
if ( (re_z*re_z + im_z*im_z) > 4 ) { // Entfernung zum Ursprung > 2 return i; // aktuelle Iterationszahl zurückgeben } } return 1000; }
|
Zum Anzeigen der Graphik verwende ich die Allegro-Bibliothek. Einen Screenshot mit dem fehlerhaften Fraktal gibts hier
Hat von euch vielleicht jemand eine Idee, wo das Problem liegen könnte? Schonmal vielen Dank für alle Antworten!
Gruß Achim |