GDLib varjostettu pascalin kolmio

msdos64 04.04.07 20:38

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 :)

 Tekstiversio  Arvo: 5 (7 ääntä)  Äänestä: +  -
<?php
/* Tekee hienon pascalin kolmion, jossa parittomat luvut on varjostettu.
   Lienee myös eräänlainen fraktaali kuvio. Jos $res on liian pieni, tapahtuu kummia. */


        $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
?>

msdos64 20:39 4.4.07 
Sharlin 20:40 4.4.07 
Juu, se tosiaan lähestyy Sierpinskin kolmiota.
editoitu: 19:00 5.4.07
T.M. 18:48 5.4.07 
"GDLib varjostettu pascalin kolmio"
Missä ihmeessä se varjo on? O_o

ehdotus:
        $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ä

->
        $im = imagecreate($res, $res); // luodaan kuva
        $tausta = imagecolorallocate($im, 255, 255, 200);

Ei tarvitse truecolor kuvaa tehä, jos käytetään vain kahta väriä, huom: ensimmäinen määritetty väri määrittää taustavärin 256 värisessä kuvassa :)
Eikä myöskään tarvita enää imagefill() funkkaria (joka on jopa hitaampi kuin imagefilledrectangle() funktio).

Potenssit voi optimoida vielä bittisiirroilla: $pow = 1 << $kierrokset; Tosin, tässäpä siitä ei nopeusiloa tule.

$p*$sivu kohdat olis myös mukava laittaa muuttujaan, selkeyttää kivasti.
msdos64 20:09 5.4.07 
T.M. kirjoitti:
"GDLib varjostettu pascalin kolmio"
Missä ihmeessä se varjo on? O_o


Tuo kuvio siis saadaan myös siten, että varjostetaan (eli peitetään mustalla) kaikki parittomat numerot. Ehkä tiesitkin tämän, mutta halusit olla tarkkana ilmaisusta :).

joo tuon $p*$sivu:n olisi tosiaan voinut tallentaa väliaikaiseen muuttujaan.. Tuota truecoloria olen kaikissa gdlib hommeleissa käyttänyt, tuli kopioitua se tähänkin :P

Miksi imagefill on hitaampi, kuin filledrectangle? Toiminta on melkeimpä sama..
T.M. 22:50 5.4.07 
Imagefill on luultavasti jokin rekursiivinen härpäke, joka etsii värin perusteella paikan minkä se voi täyttää, koska sehän voi siis täyttää muitakin kuin neliöitä.
msdos64 00:49 6.4.07 
aa, se katsoo siis, että mihin asti se sama väri jatkuu.. jostain syystä oletin, että se olisi aina värittäny kuvan kaikki pikselit niiden väristä riippumatta.