JavaScript - HTML5 canvas

5. Vászonra fel!

„Az európai festészet történetében a XVI. század óta a festmények tipikus hordozóanyaga a vászon, a festék pedig az olaj. Az olajfestés a temperával szemben egészen új művészi eszközök kibontakoztatását tette lehetővé. A temperával ellentétben ugyanis az olajfestésnél szabadon lehet egymásra több réteget felvinni, ezzel egyrészt az elrontott, vagy más okból megváltoztatandó részletet teljesen újra lehet festeni, másrészt egymás felett, enyhén áttetsző rétegeket is fel lehet vinni.”[1]

Négy évszázaddal később, a XX. század kibernetikai találmányai aztán megnyitották az utat egy eddig ismeretlen digitális világ felé, amelyben az új generáció tagjai már digitális vásznon valósítják meg az elképzeléseiket. Az elkészült alkotásokat pedig közösségi hálón osztják meg egymással, ezzel is gazdagítva bolygónk kollektív emlékezetét. A számítógépes grafika [2] eszközei beköltöztek a mindennapjainkba. A 2D és 3D ábrázolásnak talán már csak az emberi képzelőerő szab határt.

A digitális képi megjelenítés alapvetően kétféle megközelítésben értelmezhető. „A vektorgrafika a számítógépes grafikában az az eljárás, melynek során geometriai primitíveket (rajzelemeket), mint például pontokat, egyeneseket, görbéket és sokszögeket használunk képek leírására. Ennek az ellentéte a rasztergrafika, ahol képek leírására szabályos elrendezésű pontokat használunk.” [3] Az alábbiakban ismerkedjünk meg a digitális vászon használatával, és bemelegítésként gyártsunk le egy analóg kijelzővel működő virtuális időmérőt.

Your browser does not support the HTML5 canvas tag.

Analóg kijelzős óra

Bemenet: A számítógép órájának időadatai.

Kimenet: Az időadatok alapján kiszámított és grafikusan ábrázolt értékek a vásznon.

Változók: A canvas, context változók a vászonműveletekhez, valamint a myClock objektum változói a számítógép idejének lekéréséhez, illetve a számlap és a mutatók megjelenítéséhez.

Algoritmus: Megrajzoljuk az analóg számlapot, majd az aktuális rendszeridő alapján kiszámítjuk az óra mutatóinak kezdő- és végpontjait, és az így kapott koordinátákat összekötve jelenítjük meg a számlap mutatóit.

Eseménykezelés: A setInterval() metódus segítségével beállítunk 1000 ms-os ismétlési időt a számításokat végző függvény hívásához.

Megjegyzés: A JavaScript kód a saját rendszeridőt jeleníti meg. Ezért állítsátok be a pontos időt a számítógépeteken.

Kedves Bitfaragó jelöltek!

Ebben a leckében találtok jó néhány ötletet és megoldási mintát, amelyek felhasználásával bátran írhattok látványos animációkat, vagy modellezhettek matematikai, fizikai, kémiai, sőt akár biológiai jelenségeket. A digitális vászon rajzolásához csupán néhány JavaScript utasítást kell megismernetek, és a feladatban meghatározott algoritmus megoldásához szükséges vezérlőszerkezetekben felhasználnotok. Ha szeretnétek a leggyakoribb JavaScript utasításokat átismételni, akkor olvassátok el a 2013-as Bakonyi Bitfaragó Bajnokság felkészítő anyagait.

1

HTML5 dokumentum és a canvas

A HTML5 dokumentumokban a <canvas> elemmel jelölhetünk ki pixelterületet, melyet aztán script utasításokkal programozhatunk. A <canvas> elem önmagában nem képes rajzolásra, csupán a grafikához használt konténer. A getContext() metódus tér vissza egy olyan objektummal, amely a vásznon történő rajzoláshoz ad metódusokat és tulajdonságokat.

Az alábbi mintaprogramban a var canvas=document.getElementById('myCanvas'); és a var context=canvas.getContext('2d'); utasításokkal hozzuk létre a továbbiakban context néven azonosított grafikai objektumunkat, melynek segítségével egy Halloween maszkot készítünk el. Figyeljétek meg a forráskódban a kör, vonal, háromszög, négyszög alakzatok rajzolásához és kitöltéséhez használt utasításokat!

Ugye, most már biztosan nem okozna gondot egy smile ikon kódolása sem, sőt akár a csapatlogót is el tudnátok készíteni a fenti mintaprogram alapján.

« Előző | Lap eleje

2

Analóg kijelzős óra

A számítógép idejét a megszokott hh:mm:ss formátumban már néhány soros script kóddal meg tudjuk jeleníteni. Ha azonban a klasszikus számlapos kijelzőt szeretnénk használni, akkor a <canvas> elemmel ki kell jelölnünk egy pixelterületet, amire a saját fejlesztésű myClock() objektum függvényeivel rajzoljuk fel az órát. Az JavaScript arc() metódusa a körívek rajzolását támogatja, a moveTo() és lineTo() metódusok pedig az óramutatók kiszámított végpontjai közé húznak vonalat.

« Előző | Lap eleje

3

Fibonacci spirál

"A Fibonacci számsor egy rendkívül érdekes matematikai sorozat melynek tagjai egymásra épülnek. A számsor első két száma 1-es, és a következő szám mindig az aktuális és az előző szám összege. A sorozat különlegessége, hogy ahogy haladunk a magasabb számok felé az aktuális számot és a megelőző számot egymással elosztva megközelítőleg az aranymetszés számát kapjuk eredményül. Ezek a számok azért rendkívül fontosak, mivel az egész világon minden, a növények, az állatok, az emberi test az aranymetszés arányai szerint épülnek fel. Ha megméred a kézfejed és az alkarod, majd a két számot elosztod egymással akkor 1,6 körüli értéket kapsz, de ugyanez igaz a lábfejed és a lábszárad arányaira is." [Schilling Péter]

A Fibonacci spirál a Fibonacci-sorozatnak megfelelő oldalú, egymáshoz illeszkedő négyzetekbe írt negyed körökből áll.

« Előző | Lap eleje

4

Ábrázoljunk függvényeket!

A canvas pixeleit felhasználhatjuk függvények ábrázolására is. A vászon bal felső sarka az X=0,Y=0 pont, a jobb alsó sarkát pedig az X=context.canvas.width és az Y=context.canvas.height koordináták azonosítják. Itt annyi a feladatunk, hogy a független változó és a függvényérték megjelenítendő értéktartományát leképezzük a vásznon ábrázolható pixeltartományba.

Az alábbi mintaprogramban HTML FORM-on megadott paraméterek segítségével ábrázolunk két egyszerűbb függvényt. Figyeljétek meg a FORM-ban megadott értékeket feldolgozó JavaScript kód működését.

« Előző | Lap eleje

5

Rajzoljunk Mandelbrot fraktált!

A Mandelbrot halmaz a komplex számsík egy ponthalmaza. Kiindulásként válasszunk ki egy pontot a komplex síkból, melynek megállapodás szerinti jelölése legyen z0. Számítsuk ki a zn=zn-12+z0 összefüggéssel rendre a zn sorozat elemeit mindaddig, amig az általunk beállított iterációk számát el nem érjük, vagy a zn komplex szám abszolútértéke túl nem mutat a vásznon ábrázolható tartományon.

Minden számhoz tartozik egy szín. Azok a tartományok lesznek egyszínűek, amelyeknek ugyanannyi iteráció kell a határérték megközelítéséhez. A mintaprogramban a vizsgált intervallumhoz beállított érték 4. A halmaz közepén levő pontok esetén soha nem érjük el ezt az értéket, tehát azok feketén maradnak. A Mandelbrot halmaz ábrázolásához az előbbi műveleteket az ábrázolási tartomány minden pontján el kell végeznünk.

« Előző | Lap eleje

6

Oldd meg a feladatokat!

A pixelek vásznán tett kalandozásunk folyatatásaként lenne még néhány izgalmas feladat, melynek megoldásával értékes pontokat gyűjthettek a verseny következő fordulójához. A könnyebb kezelhetőség érdekében a megoldást a feladatok előtti  kék azonosítóval  megegyező nevű könyvtárban dolgozzátok ki. A beküldött HTML kód elején a csapat logója és neve, alatta a feladat azonosítója, és szövege jelenjen meg sötét háttérrel és világos betűkkel. Ezt követően már csak a megoldást kell ügyesen kódolnotok. Az elkészült megoldásokat gyűjtsétek össze a csapat nevével megegyező nevű könyvtárban, majd tömörítve töltsétek fel a honlapra!

Beküldhető feladatok 2014:

  1.  B3-2014-EGY01  Rajzoljátok meg a csapatlogótokat JavaScript kódban egyszerű alakzatok felhasználásával! Az elkészült logót a továbbiakban minden beadott feladatnál felhasználhatjátok.
    1. A figuratív megjelenésnél ügyeljetek a jól felismerhető formák kiválasztására.
    2. A megfelelő színek használata erősíti az üzenetet. Használjatok legalább három színt a mondanivalótok kiemeléséhez.
    3. A logók egyik legfontosabb alkotóeleme a felirat, azaz a tipográfia. A tudatos, átgondolt betűhasználat növelheti a logó értékét.
    4. Legyen méretezhető, ne okozzon gondot a megjelenés a canvas méretének megváltoztatásakor.
    5. Tartalmazzon 10 másodpercenként ismétlődő, a figyelemfelkeltésére alkalmas effektet.

    0100 0000|2 pont

  2.  B3-2014-EGY02  Készítsetek egy virtuális ingaóra objektumot! Az óra számlapján jelenjen meg a csapatlogótok, és legyen opcionálisan hallható a másodpercenkénti tik-tak, illetve kerek óránként a pontos idő.

    0100 0000|2 pont

  3.  B3-2014-EGY03  Tervezzétek meg egy személygépkocsi műszerfalának analóg kijelzős modelljét. A műszerfalra helyezzetek el fordulatszámmérőt, sebességmérőt km számlálóval és illesszétek be a B3 oldalon található analóg órát is. A műszerfal az adatokat egy tesztpanelről kapja, amely egy HTML formon beállított kuplung, fék, gáz, és sebességfokozat értékek alapján véletlenszámokból generált adatfolyamot küld a műszerfalhoz. Szabályok a következők:
    1. A sebességfokazat és gázadás szerinti fordulatszám beállításával az elérhető sebességet saját algoritmussal kalkulálja a program. Az alábbi táblázatban megállapodás szerinti értékekkel szemléltetjük a sebességfokozat, gáz, fordulatszám és az elért sebesség feltételezett kapcsolatát. Természetesen a különböző motor és autótípusok jellemzői eltérnek egymástól, így ezek sajátosságainak figyelmebevételével a táblázat tovább bővíthető.
      Sebességfokozat Gáz Fordulatszám Sebesség
      1 50% 2500 30
      2 50% 2500 50
      3 50% 2500 70
      4 50% 2500 90
      5 50% 2500 110
    2. A fék lenyomásával a gáz értéke nullázódjon.
    3. A kuplung lenyomásakor a sebességfokozat és a gáz értéke nullázódjon.
    4. A km számláló a tesztelési idő és ez elért sebesség alapján pörögjön.

    1000 0000|2 pont

  4.  B3-2014-EGY04  Alakítsátok át a bemutatott Mandelbrot kódot úgy, hogy a zn=zn-12+z0 összefüggésben használt z0 érték helyére egy c konstans kerüljön. Készítsetek űrlapot, amelyen megadható a vizsgált komplex számtartomány alsó és felső határa, a c konstans értéke valamint az ábrázoláshoz használt színkód! Melyik nevezetes halmaz jelenik meg?

    0100 0000|2 pont

« Előző | Lap eleje

Hivatkozások, felhasznált források

[1] A táblaképfestészet, SuliNet, 2014.09.06

[2] Schwarcz Tibor: Bevezetés a számítógépi grafikába, mobiDIÁK könyvtár, 2005

[3] Vektorgrafika, Wikipedia, 2014.09.06

[4] HTML Canvas Reference

[5] HTML5 Canvas Tutorials

[6] W Patrick Hooper: SVG Tutorial for Mathematics Students

[7] Horváth Győző: Bevezetés a kliens- és szerveroldali webalkalmazások készítésébe

[8] CodeMirror: Theme Demo