Fraktal: Mandelbrot

Wadlschrat

Mitglied
Den ganzen Tag wühle ich mich schon durch's Netz, weil ich versuche Fraktale in PHP darzustellen. Die Lösung lag bei wikipedia. Danke an Thomas Darimont, der mich mit seinem Beitrag darauf gestoßen hat.

Das Ergebnis liegt bei. Hier der Quelltext:
PHP:
<?php
// die Berechnung kann je nach Einstellungen dauern
set_time_limit(600);

// mandelbrot.php als Benchmark ;)
$startzeit=microtime(true);

// function punkt_iteration liefert bei den momentanen Einstellungen Werte bis 1000 zurück
// die $wertN sind die Schwellenwerte für die 6 eingesetzten Farben
$wert1=30;
$wert2=100;
$wert3=300;
$wert4=500;
$wert5=800;
$wert6=1000;

// $max_x und $max_y geben Hoehe/Breite des Bildes an
$max_x=700;
$max_y=700;

$max_iterationen=1000;
$punkt_abstand_x=0.001;
$punkt_abstand_y=0.001;
$min_cx=0.1;
$min_cy=0.5;
$max_betrags_quadrat=100000;

$image = imagecreatetruecolor($max_x, $max_y);
$bg = imagecolorallocate($image, 0, 0, 0);

function punkt_iteration($cx, $cy, $max_betrag_quadrat, $max_iter)
{
   $betrag_quadrat = 0;
   $iter = 0;
   $x = 0;
   $y = 0;

   while ( $betrag_quadrat <= $max_betrag_quadrat and $iter < $max_iter )
   {
     $xt = $x * $x - $y * $y + $cx;
     $yt = 2 * $x * $y + $cy;
     $x = $xt;
     $y = $yt;
     $iter = $iter + 1;
     $betrag_quadrat = $x * $x + $y * $y;
   }

   return($iter);
}

 for($pix_x = 1; $pix_x<=$max_x;$pix_x++)
 {

    for($pix_y = 1; $pix_y<=$max_y;$pix_y++)
    {
     $cx = $min_cx + $pix_x * $punkt_abstand_x;
     $cy = $min_cy + $pix_y * $punkt_abstand_y;
     $iteration=punkt_iteration ( $cx, $cy, $max_betrags_quadrat, $max_iterationen );
     if($iteration>=0 and $iteration <$wert1)imagesetpixel($image,$pix_x,$pix_y,ImageColorAllocate($image,0,0,0));
     if($iteration>=$wert1 and $iteration <$wert2)imagesetpixel($image,$pix_x,$pix_y,ImageColorAllocate($image,255,255,0));
     if($iteration>=$wert2 and $iteration <$wert3)imagesetpixel($image,$pix_x,$pix_y,ImageColorAllocate($image,0,0,255));
     if($iteration>=$wert3 and $iteration <$wert4)imagesetpixel($image,$pix_x,$pix_y,ImageColorAllocate($image,0,255,0));
     if($iteration>=$wert4 and $iteration <$wert5)imagesetpixel($image,$pix_x,$pix_y,ImageColorAllocate($image,255,255,0));
     if($iteration>=$wert5 and $iteration <=$wert6)imagesetpixel($image,$pix_x,$pix_y,ImageColorAllocate($image,125,0,0));
    }
 }
imagejpeg($image,"./fraktal.jpg",100);
echo'<img src="./fraktal.jpg">';
echo'<br/>Dauer: '.(microtime(true)-$startzeit).' Sekunden.';
?>

Mein Laptop braucht übrigens 15,971755981445 Sekunden für das Bild aus dem Quelltext.

Inzwischen habe ich an den Parametern rumgeschraubt und z.B. die Farbpalette verändert. Das zweite Bild brauchte knapp drei Minuten.
 

Anhänge

  • fraktal.jpg
    fraktal.jpg
    42,1 KB · Aufrufe: 77
  • fraktal2.jpg
    fraktal2.jpg
    36,8 KB · Aufrufe: 156
Zuletzt bearbeitet:
Zurück