Regionen Algebra


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

Regionen Algebra


Einleitung

Da Regionen Bilder mit bool‘schen Werten sind, lassen sich die bekannten Mengenoperationen einfach darauf definieren:

universeR,emptyR
::
Region



compR
::
Region → Region




∩, ∪, xorR, \
::
Region → Region → Region




universeR
=
const True




emptyR
=
const False

Entsprechende Notation in Pan
compR
=
lift1 not
complementR =
lift1 notE

=
lift2 and

intersectR
=
lift2 (&&*)
=
lift2 or

unionR
=
lift2 (||*)
xorR
=
lift1 (≠)

xorR
=
lift2 (/=*)
r \ r
=
r ∩ compR r

diffR r r'
=
 r `intersectR` ComplementR r'


Von Regionen zu Bildern

Um Regionen in Bilder umzuwandeln wird der bereits bekannte Typ FilterC verwendet. empty repräsentiert hierbei das unsichtbare Bild.

crop           :: Region → FilterC
crop reg im = cond reg im empty

Anwendungsbeispiel

Es werden jetzt die Verwenung der Mengenoperationen an einem längeren Beispiel demonstriert.
Zu nächst wird ein Ring durch Mengensubtraktion erstellt:

annulus             :: FractionE → Region
annulus inner     =
    udisk `intersectR` complementR  (uscale inner udisk)


Bild Ring


Nun werden aus dem Ring radial Segmente durch Subtraktion entfernt:

radReg    :: Int → Region
radReg n = strahl . toPolar
where strahl (_,t) = evenE(floorE(t * fromInt n/pi))

wedgeAnnulus             :: FloatE → IntE → Region
wedgeAnnulus inner  n = annulus inner `intersectR` radReg n

Bild Ring

Anschließend werden die Segmente eingefärbt:

sunshine         :: FloatE → IntE → ImageC
sunshine f i     = crop (wedgeAnnulus f i) (bunteRinge redI yellowI)

bunteRinge           :: ImageC → ImageC → ImageC
bunteRinge c1 c2 = lerpI wavDist1 c1 c2

Bild Ring

Abschliessend werden die einzelnen Segmente mittelns swirl gedreht:

sunswirl        :: FloatE → ImageC → ImageC
sunswirl f im = swirl f im

Bild Ring


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