-- Eine kleine Grafik-Bibliothek type Bild = [[Pixel]] --Ein Bild besteht aus einer Folge von Zeilen --Eine Zeile ist eine Folge von Pixeln type Pixel = Char -- alternativ Boolean oder Int für S/W oder Farbbilder baum :: Bild -- Beispiel für ein Bild mit Pixeln aus Char baum = [" * ", " *** ", " ***** ", " * "] mond :: Bild -- Beispile für ein Bild mit Pixeln aus Char mond = [" * ", " * ", " * ", " * "] fun :: Bild fun = ["123", "456"] zeig :: Bild -> IO() zeig b = putStr(concat(map ('\n' :) b)) -- Einige Funktionen zur Komposition von Bildern spiegelS :: Bild -> Bild -- spiegeln an der senkrechten Achse spiegelS = map reverse spiegelW :: Bild -> Bild -- spiegeln an der waagerechten Achse spiegelW = reverse neben :: Bild -> Bild -> Bild -- setze zwei Bilder nebeneinander (mit Höhenanpassung) neben b1 b2 | length b1 == length b2 = zipWith (++) b1 b2 | length b1 > length b2 = neben b1 ((empty (length (head b2)) (length b1 - length b2)) ++ b2) | length b1 < length b2 = neben ((empty (length (head b1)) (length b2 - length b1)) ++ b1) b2 empty :: Int -> Int -> Bild -- leeres Bild der Breite b und der Höhe h empty b h = [[' '| c <- [1..b]] | z <- [1..h]] über :: Bild -> Bild -> Bild -- setze zwei Bilder übereinander (mit Breitenanpassung) über b1 b2 | breite1 == breite2 = b1 ++ b2 | breite1 < breite2 = (b1 `neben` (empty (breite2 - breite1) (length b1))) `über` b2 | breite1 > breite2 = b1 `über` (b2 `neben` (empty (breite1 - breite2) (length b2))) where breite1 = length (head b1) breite2 = length (head b2) drehR :: Bild -> Bild -- dreh ein Bild um 90% nach rechts drehR ([]:_) = [] drehR b = (reverse (map head b)) : (drehR (map tail b)) dreh180 :: Bild -> Bild -- Drehung um 180° dreh180 = spiegelS . spiegelW drehL :: Bild -> Bild -- dreh ein Bild um 90% nach links drehL = drehR . dreh180 meinBild, meinBild1, meinBild2 :: Bild meinBild1 = (fun `neben` baum) `über` mond meinBild2 = spiegelS meinBild1 meinBild = (meinBild1 `neben` meinBild2) `über` (dreh180 (meinBild1 `neben` meinBild2))