Primi passi con gloss (haskell tutorial in italiano)

Con questo articolo e molti dei prossimi intendo fornire del materiale introduttivo per aspiranti programmatori in haskell.

Per lavorare con gloss dobbiamo installare i bindings a opengl, che sono compresi nella haskell platform, ma devono essere scaricati in caso diverso.

Nel secondo caso, ci procuriamo alcune librerie necessarie

sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev

e installiamo quindi gloss che trascinerà tutte le dipendenze necessarie

cabal install gloss

Purtroppo l’esperienza con ghci non è delle migliori e quindi ci si deve accontentare del lavoro sui files.

Per un utilizzo di base l’interfaccia in Graphics.Gloss è sufficiente. La funzione displayInWindows apre una finestra e disegna quanto richiesto nel suo quarto argomento.

Quindi nel nostro primo file mettiamo

import Graphics.Gloss
main = displayInWindow "primo esempio" (300,300) (0,0) 
                white (Circle 100)

esempio 1
Salvato il file in esempio.hs lo eseguiamo con

runhaskell -lglut esempio.hs

o meglio

ghc --make esempio.hs && ./esempio

Dalla documentazione di gloss (docs) esaminiamo la definizione del datatype Picture


data Picture
	= Blank
	| Polygon 	Path
	| Line		Path
	| Circle	Float
	| ThickCircle	Float		Float
	| Text		String
	| Bitmap	Int	Int 	ByteString
	| Color		Color  		Picture
	| Translate	Float Float	Picture
	| Rotate	Float		Picture
	| Scale		Float	Float	Picture
	| Pictures	[Picture]

Con la solita naturalezza haskell definisce Picture ricorsivamente per permettere le trasformazioni affini e per aggiungere il colore.
L’ultimo costruttore ci permette di vedere un insieme di Pictures come una sola.
Rimanendo sulla figura di base del cerchio ci possiamo sbizzarrire attraverso le trasformazioni affini.
Ecco un esempio di Picture costruita attraverso una list comprehension.

import Graphics.Gloss
main = displayInWindow "secondo esempio" (600,500) (0,0) white $
         Pictures 
         [Rotate (2*y) . Translate 0 y $ Circle y | y <- [5,10..100]]

esempio 2
E una variazione dove moduliamo anche il colore

import Graphics.Gloss

main = displayInWindow "terzo esempio" (600,500) (0,0) white .
   Pictures . map f $ [100,99.9 .. 5]
   where f y    = Rotate (10*y) 
                . Translate 0 y 
                . Color (makeColor 0 (y/100) (1 - y/100) (y/100)) 
                $ ThickCircle y y

esempio 3

Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...