Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Paskalin kolmio GDLib + kopiointi

msdos464 [04.04.2007 20:35:34]

#

Ohjelma tekee kivan pascalin kolmion kopioimalla edellistä palaa kahteen kertaan aina yhtä kierrosta kohti. Tämän voisi laskea myös esim. käyttäen kahta boolean taulukkoa, mutta tein vaihteeksi tällaisen toteutuksen :)

Ei ole välttämättä kovin tehokas ratkaisu, mutta tulipahan tehtyä. Tuossa taitaa ilmentyä vielä yhden pikselin klappi, joka tulee ilmi, jos alkuneliöön piirtää sisäerunaan jotkut erottuvat borderit.

Jos $res on liian pieni, niin kuvaan tulee outoja mustia kuvioita, ilmeisesti sen takia, että yritetään kopioida pikseleitä kuvan ulkopuolelta.

http://msdos464.no-ip.com/php/gdlib/pkolm.php tuolla voi tarkastella.

<?php
/* Tekee hienon pascalin kolmion, jossa parittomat luvut on varjostettu.
   Lienee myös eräänlainen fraktaali kuvio. */

	$res = 1300; // kuvan sivun pituus
	$sivu = 10; // yhden ruudun sivun pituus
	$kierrokset = 7; // montako kertaa toistetaan
	$topmargin = ($res - pow(2, $kierrokset)*$sivu) / 2; // laitetaan kuva keskelle myös pystysuunnassa

	$im = @imagecreatetruecolor($res, $res) or die("Cannot Initialize new GD image stream"); // luodaan kuva
	imagefill($im, 0, 0, imagecolorallocate($im, 255, 255, 200)); // peitetään taustavärillä

	imagefilledrectangle($im, ($res - $sivu) / 2, $topmargin, ($res + $sivu) / 2, $sivu + $topmargin, imagecolorallocate($im, 0, 0, 0)); // tehdään alkuneliö

	$max = pow(2, $kierrokset); // lyhentää vähän koodia, kun erillistä looppimuuttujaa ei tarvita
	for ($p = 1; $p < $max; $p *= 2) // looppi, joka kopioi kuvaa itsensä päälle
		{
		imagecopy($im, $im, $res/2 - $p*$sivu, $p*$sivu + $topmargin, $res/2 - $p*$sivu/2, $topmargin, $p*$sivu, $p*$sivu); // vasen puoli
		imagecopy($im, $im, $res/2, $p*$sivu + $topmargin, $res/2 - $p*$sivu/2, $topmargin, $p*$sivu, $p*$sivu); // oikea puoli
		}

	header ("Content-type: image/png"); // png tulossa
	imagepng($im); // kuva ulos
	imagedestroy($im); // vapautetaan varmuuden vuoksi muistista
?>

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta