Grafika függvényekkel

Bevezetés: funkcionális programozás

Bevezetés: ábrák Haskellben

A koordináta-rendszer

xy

Egyszerű alakzat: kör

Test>

A kirajzolt alakzat a koordináta-rendszeren elhelyezve:

xy

Nézzük meg a kor függvény típusát!

kor :: Szam -> Abra

Egyszerű alakzat: téglalap

Test>
Test>

A kirajzolt alakzat a koordináta-rendszeren elhelyezve:

xy

Nézzük meg a teglalap függvény típusát!

teglalap :: Szam -> Szam -> Abra

Kombinátor: két ábra egymásra helyezése

Test>

Feladat: mindkét irányból behajtani tilos tábla

Segítség: a felhasznált sugarak 5 és 7

Test>

Feladat: behajtani tilos tábla

Segítség: a felhasznált hosszúságok 2, 7 és 12

Test>

Feladat: svájci zászló körvonalai

Segítség: a felhasznált hosszúságok 2, 6 és 10:

Test>

Alakzat színezése

Átszínezhetjük egyszerre az alakzat egészét (kitöltését és körvonalát):

szin :: Abra -> Szin -> Abra
Test>
Test>
Test>

Feladat: színes két irányból behajtani tilos tábla

Segítség: fontos, hogy a nagyobb, piros kör legyen először, erre “tegyük rá” a kisebb, fehéret

Test>

Feladat: színes behajtani tilos tábla

Test>

Feladat: színes svájci zászló

Segítség: a befoglaló négyzet mérete 10x10-es

Test>

Feladat: laoszi zászló

Segítség: a befoglaló téglalap mérete 16x12-es

Test>

Művelet: origó körüli forgatás

Forgatás során a koordináta-rendszer középpontja körül forgatjuk el a megadott ábrát a megadott szöggel.

forgat :: Abra -> Szam -> Abra
Test>

Egyszerre több összekapcsolt alakzat is forgatható:

Test>

Feladat: főútvonal tábla

Segítség: a négyzetek méretei 14, 13 és 9

Test>

Feladat: főútvonal vége tábla

Segítség: a nagyobb négyzet oldalai 14 hosszúak

Test>

Feladat: várakozni tilos tábla

Segítség: a kör sugara 7

Test>

Feladat: megállni tilos tábla

Segítség: a kör sugara 7

Test>

Művelet: eltolás

eltol :: Abra -> (Szam, Szam) -> Abra
Test>
Test>

Feladat: magyar zászló

A zászlót úgy rakjuk össze, hogy egy 16x12-es fekete körvonalú téglalapban legyen, viszont a színek között ne látszódjon fekete körvonal. A zászló közepe maradjon az origóban.

Test>

Feladat: zsákutca tábla

Segítség: a felhasznált méretek 14, 8 és 2, az eltolás mértéke az y tengely mentén -1 és 4

Test>

Listák

A listákba elemeket sorolhatunk fel szögletes zárójelek között, vesszővel elválasztva. Egy listában csak egyforma típusú elemek lehetnek, és fontos a sorrendjük.

Példa: számok listája:

Test>
[1, 6, 10] :: [Integer]

Egyéb sokszögek

Tetszőleges sokszöget megadhatunk, ha a csúcsai koordinátáit felsoroljuk egy listában, és meghívjuk a listára a sokszog függvényt. Ekkor a megadott pontokat a megadott sorrendben összeköti, plusz az utolsót az elsővel.

Test>

Feladat: autó

Tervezz meg négyzetrácsos papíron egy, a lentihez hasonló autót. Az autó vázát add meg egy sokszöggel, a kerekei körök a megfelelő pozícióba eltolva. A lenti ábrán az autó alsó egyenes vonala fekszik az x tengelyen. Ha van kedved, kiegészítheted lámpákkal, kipufogóval, ablakkal, stb.

Test>

Feladat: házikó

Segítség: Az alábbi házikó egyetlen pontsorozattal megadható.

Test>

Feladat: Jamaica zászlója

Segítség: a zászló mérete 20x12-es. Készíts egy nagy sárga téglalapot, és erre tedd rá a 4 háromszöget. További segítség lentebb.

Test>

További segítség: a zászló vonalai a koordináta-rendszeren elhelyezve:

xy-10106-6

Ábrák listájának összefűzése

Ábrákat is tehetünk egy listába, azonban ábrák listáját nem tudja a keretrendszer kirajzolni, csak akkor, ha azokat egyetlen ábrává fűzzük össze.

osszefuz :: [Abra] -> Abra
Test>

Ilyen módon megspórolhatunk sok <|> műveletet.

Számtani sorozatok

Számtani sorozatoknak nevezzük azokat a számsorozatokat, ahol az egymás után következő számok különbsége ugyanannyi.

A sorozat első és utolsó elemének megadásával 1-gyel növekvő számtani sorozatot kapunk:

Test>
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] :: [Integer]

Ha megadunk egy második elemet is, akkor utána az első és a második elem közötti különbség lesz a lépésköz, amíg el nem érjük az utolsó elemet:

Test>
[5, 8, 11, 14] :: [Integer]

Hogyan tudnánk csökkenő sorozatot előállítani?

Test>

Halmazkifejezések

Egy lista elemeit szeretnénk felhasználni úgy, hogy eredményként is egy listát kapjunk.

A korábbi példában a körök sugarai 5-től csökkentek 1-esével 1-ig. Az összes kör felsorolása nélkül a következőképpen tudjuk előállítani ezt az 5 kört:

Test>

A halmazkifejezések elején (fejében) akár összetettebb műveletek is lehetnek. Beszéljük meg együtt, hogyan lehetne a következő ábrát létrehozni:

Test>

Feladat: pénzoszlop

Segítség: a körök sugara 4, most az eltolás mértéke változik mindig 1-gyel.

Test>

Feladat: lépcső

Segítség: a kis téglalapok mérete 2x1-es, az x és y tengely mentén is mindig ugyanannyival toljuk el őket, az eltolás mértéke 1-esével nő.

Test>

Feladat: napocska

Segítség: készítsünk háromszöget az alábbi koordinátákkal: (-1,0), (1,0) és (0,6). Egy halmazkifejezésben készítsünk 16 db ilyen háromszöget, mindegyik 360/16 = 22.5 fokkal legyen elforgatva az előzőhöz képest.

Test>

Feladat: Antigua és Barbuda zászlaja

Segítség: készítsünk egy 30x20-as fekete téglalapot. Helyezzük rá a napot, ehhez segítségként a háttérben létrehoztunk egy nap nevű függvényt, amivel létrehozható egy olyan méretű nap, amit fent rajzoltunk. A napot 2-vel fölfelé kell eltolni. Ezután következik a kék téglalap (középre), és a fehér téglalap (lefelé eltolva). Végül a két háromszög, amik a sokszog függvénnyel hozhatók létre. A méreteket le lehet olvasni a lentebb található ábrán, ahol elhelyeztük a zászló körvonalát a koordináta-rendszeren.

Test>

További segítség: a zászló vonalai a koordináta-rendszeren elhelyezve:

xy

Saját függvény definiálása

Eddig teljesen fix tulajdonságú ábrákat készítettünk, de ha szeretnénk valamivel paraméterezni, például hogy milyen nagy legyen a zászló, vagy hogy mennyi lépcsőfok legyen a lépcsőn, saját függvényeket is definiálhatunk.

Egyparaméteres függvény:

f x = x + 1

Kétparaméteres függvény:

g :: Szam -> Szam -> Szam
g a b = a * b + 1

Példa feladat

Adjunk meg egy függvényt, aminek behajtaniTilos a neve, az egyetlen paramétere egy szám, ami megadja, hogy mennyi legyen a külső kör átmérője. A benti téglalap szélessége ennél mindig 2-vel legyen kisebb, a magassága pedig legyen a téglalap szélességének 1/6 része.

behajtaniTilos :: Szam -> Abra
behajtaniTilos x = kor (x/2) `szin` piros <|> teglalap (x-2) ((x-2)/6) `szin` feher

Próbáljuk ki, hogy az új függvényünk segítségével hogyan tudunk különböző méretű táblákat rajzolni! Ilyenkor a függvény neve után megadott számot helyettesítjük az x változó helyére a függvény definíciójában (az = jel jobb oldala).

Test>

Feladat: tetszőleges méretű magyar zászló

Adjunk meg egy magyarZaszlo nevű, két paraméteres függvényt. A két paraméter a zászló méretét határozza meg.

magyarZaszlo :: Szam -> Szam -> Abra

Test>

Feladat: sorminta körökből

Adjunk meg egy sorMinta nevű függvényt, amelynek az első paramétere adja meg a körök sugarát, a második pedig a körök darabszámát.

sorMinta :: Szam -> Szam -> Abra

Test>

Feladat: mozaik alapeleme

Készítsük el a lenti ábrát, ami a későbbi mozaikunk alapeleme lesz. A függvény neve alapelem, az egyetlen paramétere a mozaik mérete.

Segítség: a középső négyzet oldalhossza a méret fele, a kis négyzetek oldalhosszai a méret negyede.

alapelem :: Szam -> Abra

Test>

Feladat: a mozaik egy sora

Készítsük el azt a két paraméteres függvényt, aminek sor a neve, az első paraméter az alapelem mérete, a második paraméter a sorban lévő elemek száma.

sor :: Szam -> Szam -> Abra

Test>

Feladat: a mozaik

Készítsük el a mozaik függvényt három paraméterrel: alapelem mérete, sorban lévő elemek száma, sorok száma.

mozaik :: Szam -> Szam -> Szam -> Abra

Test>