Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Mandelbrotmenge berechnen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.04.2008, 08:54 Uhr
Tommix



'Morgen,
ist doch auch hübsch Ohne es jetzt wirklich zu überblicken, ich glaube hier

Zitat:

C++:
  im_z = 2*re_z*im_z + im_c;



müßtest Du das alte re_z einsetzen und nicht das eine Zeile vorher bereits veränderte.

Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.04.2008, 12:45 Uhr
steinachim



Hi,

jep, hübsch ist es schon, aber ich brauche die normale Mandelbrotmenge (ist für ne Facharbeit über Fraktale)

Danke! Das war der Fehler, hatte ich komplett übersehen... Jetzt klappts wunderbar!

Gruß
Achim

Dieser Post wurde am 04.04.2008 um 12:45 Uhr von steinachim editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: