Grafika pusztán függvényekkel

Bevezetés: SVG

Egyszerű példa dokumentum:

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE svg PUBLIC "-//W3//DTD SVG 1.1//EN"
	"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg version="1.1" width="320" height="200"
     xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink">

     <circle r="5.000"
             style="stroke-width: 0.100; 
                    stroke: black;
                    fill: white"
                    transform="matrix(10.000 0.000 0.000 -10.000 160.000 100.000)"/>
</svg>

További információk: http://svg.elte.hu

Bevezetés: funkcionális programozás

Bevezetés: Haskell

Ábrák

A koordináta rendszer

Primitívek: kör

Test>

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

Test>
circle :: Double -> Diagram

Primitívek: téglalap

rect :: Double -> Double -> Diagram
Test>
Test>

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

(<|>) :: Diagram -> Diagram -> Diagram
Test>

Feladat: behajtani tilos tábla

Készítsük el a következő alakzatot (a felhasznált hosszúságok 2, 5 és 8):

Test>

Transzformációk: eltolás

move :: Diagram -> Point -> Diagram
Test>
Test>

Kombinátorok: sok ábra egymásra helyezése

union :: [Diagram] -> Diagram
Test>
Test>

A union után egy lista szerepel.

Haskell: konkrét listák

Test>
[True, False, False] :: [Bool]
Test>
[circle 5, circle 4, circle 3, circle 2, circle 1] :: [Diagram]

Számít a sorrend és a multiplicitás:

Test>
True :: Bool
Test>
True :: Bool

A listák homogének, azaz csak azonos típusú elemeket tartalmazhatnak!

Test>
<interactive>:1:2: error:
    • No instance for (Num Bool) arising from the literal ‘1’
    • In the expression: 1
      In the expression: [1, True]

Haskell: pontpont kifejezések

A négy forma:

Test>
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] :: [Integer]
Test>
[1, 3, 5, 7, 9] :: [Integer]
Test>
Test>

Ilyet is lehet:

Test>
"abcdefghijklmnopqrstuvwxyz" :: [Char]

Haskell: halmazkifejezés

Matematikai példakép: { n2 | n ∈ N, n páros }

Haskellben:

Test>
[4, 16, 36, 64, 100, 144, 196, 256, 324, 400, 484, 576, 676, 784, 900, 1024, 1156, 1296, 1444, 1600, 1764, 1936, 2116, 2304, 2500, 2704, 2916, 3136, 3364, 3600, 3844, 4096, 4356, 4624, 4900, 5184, 5476, 5776, 6084, 6400, 6724, 7056, 7396, 7744, 8100, 8464, 8836, 9216, 9604, 10000, 10404, 10816, 11236, 11664, 12100, 12544, 12996, 13456, 13924, 14400, 14884, 15376, 15876, 16384, 16900, 17424, 17956, 18496, 19044, 19600, 20164, 20736, 21316, 21904, 22500, 23104, 23716, 24336, 24964, 25600, 26244, 26896, 27556, 28224, 28900, 29584, 30276, 30976, 31684, 32400, 33124, 33856, 34596, 35344, 36100, 36864, …, ……] :: [Integer]

Test>
<interactive>:1:9: error: Variable not in scope: n :: Integer

Ábra halmazkifejezéssel

Test>

Próbáljuk meg a köröket sűríteni!

Feladat: pénzoszlop

A kör sugara 4.

Test>

Feladat: lépcső

A felhasznált számok: -5, 1, 2, 5

Test>

Feladat+: körök

Test>
Test>
Test>

Segítség: abszolútérték függvény: abs

Feladat: gyöngysor

A függvény x ↦ x2/10.

Test>

Feladat+: spirál

Test>

Segítség: cos és sin egy paraméteres és pi konstans függvények

Színezés

Test>

Előre definiált színek: black, gray, white, red, green, blue, yellow

Feladat: színes behajtani tilos tábla

Készítsük el a következő alakzatot (a felhasznált hosszúságok 2, 5 és 8):

Test>

Feladat+: kukac

Test>

Segítség: sin egy paraméteres függvény

Transzformáció: origó körüli forgatás

rotate :: Diagram -> Double -> Diagram
Test>

Feladat: fekete csillag

A felhasznált hosszúság 10.

Test>

Feladat: óralap

Test>

Primitívek: szakasz

(>-<) :: Point -> Point -> Diagram
Test>

Feladat: pitypang

Test>

Primitívek: poligon

polygon :: [Point] -> Diagram
Test>

Feladat: csillag

Test>

Rekurzív ábrák: egy példa

tree n x
  | n <= 0 = empty
  | otherwise = (0,0) >-< (0,x)
                <|> tree (n-1) (x/2) `rotate` 30 `move` (0,x) 
                <|> tree (n-1) (x/2) `rotate` -30 `move` (0,x) 

Egy 6 magasságú fa (ennél nagyobb magassággal ne próbáljuk!):

Test>

Szükséges háttérismeretek:

Haskell: függvények definiálása

Egyparaméteres függvény, típus nélkül:

f x = x + 1

Kérdezzük meg, milyen típust vezetett le a fordító:

Test>

Kétparaméteres függvény, típussal:

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

Feladat: háromszög magassága

magassag :: Floating a => a -> a

Test>
8.660254037844387 :: Double

Segítség: sqrt gyökvonás függvény használható

Feladat: háromszög adott oldalhosszal

haromszog :: Double -> Diagram

Test>

Tipp: a háromszög bal alsó sarka legyen a (0,0) koordinátánál

Haskell: esetszétválasztás

NyariEgyetem2015bcae25edfc0f86150396ca91d20218f3.png

min x y
    | x <= y    =  x
    | otherwise =  y

Eltérés a matematikai esetszétválasztástól:

Szintaxis:

Szemantika: Az őrfeltételeket fentről lefelé vizsgáljuk, és az első teljesülő feltételnek megfelelő kifejezést választjuk.

Az otherwise nem kulcsszó, hanem a Prelude modulban definiált konstans:

Test>

Feladat: negatív paraméter kezelése

Változtassuk meg úgy a haromszog függvényt, hogy amennyiben a háromszög oldalhosszánál negatív érték szerepel, rajzoljuk egy háromszöget “fejjel lefelé” a megadott érték abszolútértékének megfelelő oldalhosszal.

haromszog2 :: Double -> Diagram

Test>

Feladat: Sierpinski háromszög

Első paraméter: a rekurzió foka, második paraméter: a külső háromszög oldalhossza

s_haromszog :: Integer -> Double -> Diagram

Test>

Feladat+: Sierpinski nyílhegy görbéje

Első paraméter: a rekurzió foka, második paraméter: a befoglaló háromszög oldalhossza

s_gorbe :: Integer -> Double -> Diagram

Test>

Segítség: http://info.berzsenyi.hu/logo/feladatok/rekurziv-goerbek

Feladat: Koch görbe

Első paraméter: a rekurzió foka, második paraméter: a görbe hossza

koch :: Integer -> Double -> Diagram

Test>

Feladat+: hópihe

hopihe :: Integer -> Double -> Diagram

Test>

Egyéb lehetőségek

rgb :: Double -> Double -> Double -> Color -- rgb szín előállítása
scale :: Diagram -> Double -> Diagram -- skálázás
stroke :: Diagram -> Color -> Diagram -- vonalszín megadás
strokeWidth :: Diagram -> Double -> Diagram -- vonalvastagság megadás
clip :: Point -> Point -> Diagram -> Diagram -- rajztábla mérete (bal alsó - jobb felső)

Példa:

Test>

Egyéb lehetőségek: szövegek

textFrom :: String -> Point -> Diagram -- szöveg adott pozíciótól
textTo :: String -> Point -> Diagram -- szöveg adott pozícióig
fontFamily :: Diagram -> String -> Diagram -- betűkészlet megadás
link :: Diagram -> String -> Diagram -- html link megadása

Példák

Test>
Test>
Test>
Test>
Active.hs