Was sind funktionale Bilder?


... [ Seminar "Einführung in Haskell" ] ... [ Inhaltsverzeichnis ] ... [ zurück ] ... [ weiter ] ...

Was sind funktionale Bilder?


Einleitung

Computer generierte Bilder werden meist von einem darunterliegenden geometrischen Modell, welche aus Lininen Texturen und ähnlichem besteht, erstellt. So wie Bilder Präsentation von geometrischen Modellen darstellen, sind geometrische Modelle Präsentationen von abstrakteren Datenmodellen, wie z.B. Text oder finanzielle Daten. Durch diese Unterscheidung zwischen Präsentation und Modell wird es einfacher Bilder zu beschreiben, denn der Anwender braucht sich nur auf  das Modell zu konzentrieren und muss nicht um die Präsentation kümmern.
Die allgemeine Begriff von Bildern kann direkt als Funktion vom endlosen ununterbrochenen 2D Raum zu Farben mit teilweiser Opazität (Durchlässigkeit) beschrieben werden:
 
type Image
=  
PointE

Colour
wobei




type PointE
=
(FloatE,FloatE)







oder allgemein mit beliebigem Pixeltyp

type Image a
=
PointE
a

In dieser allegmeinen Definition lassen sich die Bilder leicht durch eine weitere Dimension zur Animation oder einem 3D Bild erweitern.

Regionen

Es ist für einige Operationen hilfreich, den Typ der Bilder von Punkten im 2D Raum zu anderen Typen zu verallgemeinern.
Bool'sche Bilder eignen sich zur Darstellung von beliebig komplexen Regionen für aufwändige Bildmaskierung.

type Region
=
Image BoolE Grafische Darstellung der Funktion schach
Beispiel für ein Schachfeld:
schach
::
Region
schach (x,y)
= evenE ( floorE(x) + floorE(y) )
floorE
::
DoubleE
IntE
floorE
= f2i x (1)

(1) f2i wandelt einen Float-Wert in einen Int-Wert um.
Grafische Darstellung des Beispiels

Polare Koordinaten

Häufig ist es sinnvoll polare Koordinaten p = (ρ, θ) anstatt von rechteckigen Koordinaten p = (x, y) zu verwenden. Hier bei gibt ρ den Abstand zu Mittelpumkt und θ den Winkel zwischen der positiven Abszisse und eine imaginären Linie vom Mittelpunkt zu p an.

 type PolarPoint  =  (FloatE,FloatE)

Mit den folgenden Funktionen lassen sich rechteckige Koordinatenin polare Koordinaten umrechnen, und umgekehrt:

fromPolar

PolarPointE

PointE
fromPolar (ρ, θ)
::
( ρ * cos θ, ρ * sin th )
toPolar
=
PointE

PolarPointE
toPolar (x, y)
::
( distO (x, y), atan2 y x )
distO
=
PointE
→ 
PointE
distO (x,y)
::
sqrt ( x^2 * y^2)
Beispiel: polares Schachfeld
Bild eines polaren Schachfeldes
polarSchach
:: 
IntE
Region
polarSchach
= schach
. sc .
toPolar
where
sc (ρ, θ) =
( ρ, θ * fromInt n / π )(1)(2)





(1) fromInt wandelt einen Integer in einen anderen Typ,
hier: Float
(2) n entspricht hier der Anzahl der Alternationen pro Kreis.
Grafische Darstellung des Beispiels (n = 7)

Graustufen

Für Graustufen können Pixelwerte im Realwertebereich [0..1] verwendet werden. Da es diesen Typ nicht explizit in Haskell gibt,
wird der folgende Typ eingeführt:

type FractionE
=
FloatE
Bild wavDist
Beispiel: Alternierende Ringe mit weichem Übergang
zwischen schwarz (1) und weiss (0)
wavDist
::
Image FractonE
wavDist
=
( 1 + cos ( π * distO p) ) / 2

Grafische Darstellung des Beispiels




... [ Seminar "Einführung in Haskell" ] ... [ Inhaltsverzeichnis ] ... [ zurück ] ... [ weiter ] ... [ nach oben ] ...