Gimliho web „foggy point” - programování, php, outdoor, o ničem...Skip to main content.

PHP bug - imageellipse(); a velké poloměry

Po delší době jsem opět narazil na něco, co by stálo za zveřejnění. Při programování grafu ulovených mafiánů, přesněji jeho úpravy pro tisk na A3 za účelem použití na sraze po skončení společensky nespolečenské hry Mafie jsem objevil podivné chování PHP v krajních situacích...

Problém jsem odhalil ve své verzi PHP - PHP Version 5.0.3 s grafickými knihovnami - GD Version: bundled (2.0.28 compatible). A o co tedy jde? Funkce imageellipse();, která se používá i na kreslení kružnic se začíná chovat podivně, když po ní žádáte kružnici větší než zhruba 2060 pixelů (průměr), tak jakoby na všech "pólech" (i západní a východní) krůžnici zkresluje. Jak, to je vidět z obrázku. Proč k tomu dojde zrovna při uvedeném průměru, netuším - patrně to bude způsobené ztrátou přesnosti funkcí sin/cos pro hodně malé úhly. Zajímavý je rozdíl nepravidelností mezi severním/jižním (jsou symetricky shodné) pólem a západním/východním (opět shodné).

Takže co to vlastně dělá?

A použitý testovací script:

header
("Content-type: image/png");
$w=$h=2400;

$im = imagecreate($w,$h);
$white = imagecolorallocate($im, 255, 255, 255);
$orange = imagecolorallocate($im, 255, 210, 60);
$red = imagecolorallocate($im, 255,0,0);
$green = imagecolorallocate($im, 0,255,0);
$black = imagecolorallocate($im, 0,0,0);

for (
$i=2400; $i>1800; $i-=20) {
switch (
$i) {
case
2020:
$col = $red;
break;
case
2040:
$col = $red;
break;
case
2060:
$col = $green;
break;
case
2080:
$col = $black;
break;
default:
$col = $orange;
break;
}

imageellipse($im, $w/2, $h/2, $i, $i, $col);
}

imagepng($im);
imagedestroy($im);

?>



Gimli2 | Vyšlo: 26. 6. 2006 - 12:07:15 | Zobrazení: 3407

Články podobné

Podobnost je určována triviální cestou shody některého ze slov z nadpisu článku. Jsem zvědavej, co to tu bude nabízet za asociace ;-)