Spelen met Mandelbrots

Vandaag aan het spelen geweest met Mandelbrots. Dat is best ingewikkeld voor iemand met MAVO Wiskunde D. Met hulp van Wikipedia en een voorbeeldje op internet is het nog best wat geworden.

Mandlebrot fractal

Mijn probleem is alleen dat het niet zo heel snel is. Nu begrijp ik dat er ook veel berekend moet worden, maar  toch moet er nog meer snelheid te halen zijn. Mijn idee was al om het aantal iteraties te verlagen, maar dan word het plaatje denk erg korrelig. Dat gaan we zo eens uit proberen. Dit is de code in ieder geval:

header("content-type: image/png");

$xRealMin = -1.5;
$xRealMax = 0.5;
$yImaginaryMin = -1;
$yImaginaryMax = 1;

$iMaxIterations = 200;
$iImageWidth = 500;
$iImageHeight = 500;
$iImageHeightHalf = Round( $iImageHeight / 2, 0);

$rImage = imagecreatetruecolor($iImageWidth, $iImageHeight);

$xFixedPos = (( $xRealMax - $xRealMin ) / ($iImageWidth - 1) );
$yFixedPos = (( $yImaginaryMax - $yImaginaryMin ) / ($iImageHeight - 1) );

$aColours = array();
$aColours['inside'] = imagecolorallocate($rImage, 0, 0, 0);

$palette = imagecreatefrompng("palette.png");
for ($i=0; $i<imagesx($palette); $i++) {
 $rgb = imagecolorat($palette, $i, 0);
 $aColours[$i] = imagecolorallocate($rImage, ($rgb >> 16) & 0xFF, ($rgb >> 8) & 0xFF, $rgb & 0xFF);
}

for( $xPos = 0; $xPos <= $iImageWidth; $xPos++ ) {
 for( $yPos = 0; $yPos <= $iImageHeightHalf; $yPos++ ) {

 $calculatedXPos = $xRealMin + $xPos * $xFixedPos;
 $calculatedYPos = $yImaginaryMin + $yPos * $yFixedPos;

 $iterations         = 0;
 $aComplexComponent  = array(0,0);
 $x2                 = 0;
 $y2                 = 0;

 while( $iterations <= $iMaxIterations && $x2+$y2 <= 4) {
 $aComplexComponent[1] = 2 * $aComplexComponent[0] * $aComplexComponent[1];
 $aComplexComponent[0] = $x2 - $y2;

 $aComplexComponent[0] = $aComplexComponent[0] + $calculatedXPos;
 $aComplexComponent[1] = $aComplexComponent[1] + $calculatedYPos;

 $x2 = $aComplexComponent[0] * $aComplexComponent[0];
 $y2 = $aComplexComponent[1] * $aComplexComponent[1];

 $iterations++;
 }

 if( $iterations == $iMaxIterations ) {
 imagesetpixel( $rImage, $xPos, $yPos, $aColours['inside']);
 imagesetpixel( $rImage, $xPos, $iImageHeightHalf - $yPos, $aColours['inside']);
 } else {
 imagesetpixel( $rImage, $xPos, $yPos, $aColours[$iterations]);
 imagesetpixel( $rImage, $xPos, $iImageHeight - $yPos, $aColours[$iterations]);
 }

 }
}

ImagePng( $rImage );
imagedestroy( $rImage );

Bijbehorende kleurenpalet: palette.png