| Uutiset | Koodikirjasto | Wiki | Keskustelut | FAQ | Info |
Analoginen kello GD-kirjastollapiisami 13.06.05 13:28 GD-kirjastolla piirretty nopea & ruma kolmen viisarin aikarauta. (Jos ei toimi, niin luultavasti kuvien käsittelyyn tarkoitettu GD-kirjasto puuttuu palvelimelta.)
<?php // asetetaan dokumentin tyyppi header("Content-type: image/png"); // luodaan kuva $kuva = imagecreate(401, 401); // asetetaan värejä $tausta = imagecolorallocate($kuva, 255, 255, 255); $musta = imagecolorallocate($kuva, 0, 0, 0); $sininen = imagecolorallocate($kuva, 60, 70, 200); // hankitaan tarkat desimaalilukemat tunneille, minuuteille ja sekunneille $tunteja = date("g") + (date("i") / 60) + (date("s") / 3600); $minuutteja = date("i") + (date("s") / 60); $sekunteja = date("s"); // muunnetaan aika viisarien kulmiksi radiaaneissa $rad_tunti = 2 * M_PI / 12 * $tunteja - M_PI_2; // 1 tunti = 2 * M_PI rad / 12, nollakohdan korjaus - M_PI / 2 rad (-90 astetta) $rad_minuutti = 2 * M_PI / 60 * $minuutteja - M_PI_2; // 1 minuutti = 2 * M_PI / 60 rad, nollakohdan korjaus - M_PI / 2 rad (-90 astetta) $rad_sekunti = 2 * M_PI / 60 * $sekunteja - M_PI_2; // 1 sekunti = 2 * M_PI / 60 rad, nollakohdan korjaus - M_PI / 2 rad (-90 astetta) // piirretään kellon ympyrä imageellipse($kuva, 200, 200, 400, 400, $musta); // piirretään viisarit keskipisteestä (200, 200) suuntaan (x2, y2) -> (cos KULMA, sin KULMA) kerrottuna viisarin pituudella // lisäksi tehdään koordinaatiston korjaus (x2, y2) -> (+200, +200), koska (0,0) on vasemmassa yläkulmassa imageline($kuva, 200, 200, 120 * cos($rad_tunti) + 200, 120 * sin($rad_tunti) + 200, $musta); imageline($kuva, 200, 200, 180 * cos($rad_minuutti) + 200, 180 * sin($rad_minuutti) + 200, $musta); imageline($kuva, 200, 200, 190 * cos($rad_sekunti) + 200, 190 * sin($rad_sekunti) + 200, $sininen); // luodaan kuva imagepng($kuva); // poistetaan kuva palvelimen muistista imagedestroy($kuva); ?> editoitu: 13:38 13.6.05 piisami 13:36 13.6.05 Tulipahan mieleen tällainen tapa piirtää kello nykyisestä ajanhetkestä. Demo löytyy osoitteesta http://www.piuha.org/demo/gdkello.php . Tuosta voi sitten kehitellä kauniimman ja laittaa jopa numerot näkyviin... Ja kellon koosta helposti saa myös skaalautuvan, kun laittaa kertoimen kuvakokoon ja piirrettäviin elementteihin. Ja älkää nyt sitten laittako mitään kolmen rivin toteutusta kommentiksi - tai laittakaa vaan :) Kun muuten päivittelee tuota demoa, niin välillä sekuntiviisari hyppää taaksepäin parikolme sekuntia. Mutta tuo johtuu siitä, että ko. palvelimen kello palauttaa ajan juuri noin hyppien, ilmeisesti kuormaa sen verran... JTS 15:13 13.6.05 Hyvä koodivinkki. Yksinkertainen ja hyödyllinen idea, hyvin koodattu ja kommentoitu. Tosin ei mikään paras skaalattava omaan käyttöön, muokkailin koodia hieman (ei vielä optimaalinen, viisareiden koot voisi skaalata vielä paremmin, mutta enpä jaksa pahemmin alkaa säätämään): <?php // asetetaan dokumentin tyyppi header("Content-type: image/png"); // kuvan koko, kuvasta tulee vielä 1px isompi $halkaisija = 400; $säde = $halkaisija/2; // ihan vain selkeyden vuoksi // luodaan kuva $kuva = imagecreate($halkaisija + 1, $halkaisija + 1); // asetetaan värejä $tausta = imagecolorallocate($kuva, 255, 255, 255); $musta = imagecolorallocate($kuva, 0, 0, 0); $sininen = imagecolorallocate($kuva, 60, 70, 200); // hankitaan tarkat desimaalilukemat tunneille, minuuteille ja sekunneille $tunteja = date("g") + (date("i") / 60) + (date("s") / 3600); $minuutteja = date("i") + (date("s") / 60); $sekunteja = date("s"); // muunnetaan aika viisarien kulmiksi radiaaneissa $rad_tunti = 2 * M_PI / 12 * $tunteja - M_PI_2; // 1 tunti = 2 * M_PI rad / 12, nollakohdan korjaus - M_PI / 2 rad (-90 astetta) $rad_minuutti = 2 * M_PI / 60 * $minuutteja - M_PI_2; // 1 minuutti = 2 * M_PI / 60 rad, nollakohdan korjaus - M_PI / 2 rad (-90 astetta) $rad_sekunti = 2 * M_PI / 60 * $sekunteja - M_PI_2; // 1 sekunti = 2 * M_PI / 60 rad, nollakohdan korjaus - M_PI / 2 rad (-90 astetta) // piirretään kellon ympyrä imageellipse($kuva, $säde, $säde, $halkaisija, $halkaisija, $musta); // viisareiden pituudet $viisaripituus_tunti = $säde*0.6; $viisaripituus_minuutti = $säde*0.8; $viisaripituus_sekunti = $säde*0.9; // piirretään viisarit keskipisteestä (200, 200) suuntaan (x2, y2) -> (cos KULMA, sin KULMA) kerrottuna viisarin pituudella // lisäksi tehdään koordinaatiston korjaus (x2, y2) -> (+200, +200), koska (0,0) on vasemmassa yläkulmassa imageline($kuva, $säde, $säde, $viisaripituus_tunti * cos($rad_tunti) + $säde, $viisaripituus_tunti * sin($rad_tunti) + $säde, $musta); imageline($kuva, $säde, $säde, $viisaripituus_minuutti * cos($rad_minuutti) + $säde, $viisaripituus_minuutti * sin($rad_minuutti) + $säde, $musta); imageline($kuva, $säde, $säde, $viisaripituus_sekunti * cos($rad_sekunti) + $säde, $viisaripituus_sekunti * sin($rad_sekunti) + $säde, $sininen); // luodaan kuva imagepng($kuva); // poistetaan kuva palvelimen muistista imagedestroy($kuva); ?> Ztane 22:09 13.6.05 mielenkiintosesti poukkoilee noi viisarit refreshiessä :D:D Pitfall 14:15 14.6.05 nii on, jotain bugaa :) amp_god 10:24 16.6.05 Tuohonha olis nätti lisätä vaikka "taustakuva", missä olis noi kellon numerot yms :P piisami 18:04 16.6.05 Ztane & Pitfall: No eihän bugaa :) Ekassa kommentissa mainitsinkin, että serveri, jolla demo nyt on, palauttaa usein ajan etenkin sekunneissa poukkoillen. Omalla testiserverillä ja varmasti muillakin toimii ihan kiltisti. amp_god: Jep, tarvittaessa tuo kellotaulu kannattaa tehdä juuri valmiilla taustakuvalla, jonka hakee aluksi pohjaksi vaikka imagecreatefrompng() -funktiolla. |
![]() Haku
|