| Uutiset | Koodikirjasto | Wiki | Keskustelut | FAQ | Info |
GDLib varjostettu pascalin kolmiomsdos64 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 :)
<?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 Ainiin, http://msdos464.no-ip.com/php/gdlib/pkolm.php voi tarkastella. 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. |
![]() Haku
|