Räumliche Transformationen


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

Räumliche Transformationen


Einleitung

In der Computergrafik werden räumliche Transformationen häufig durch Matrizen dargestellt, und sind daher auf bestimmte Klassen, wie linear oder affin beschränkt. Anwendungen werden durch Matrizen Multiplikation oder Vektor Matrix Multiplikation definiert. Dieses Betrachtungsweise ist so verbreitet, dass Transformationen auch als Matrizen betrachtet werden können. Allgemeiner - und deshalb uneingeschränkt verwendbar - ist aber die Betrachtung, Transformationen wären Transformationen im Raum, also von Punkt zu Punkt.

type TransformE     = PointE → PointE

So lassen sich ähnliche Transformationen entwickeln:

type VectorE         = (FloatE, FloatE)

Verschieben

translateP :: Vector → Transform
translateP (dx, dy) (x, y) = (x + dx, y + dy)

Skalieren

scaleP :: VectorE → TransformE
scaleP (sx, sy) (x, y) = (sx * x, sy * y)
uscaleP :: FloatE → TransformE
uscaleP s = scaleP (s, s)

Drehen

rotateP :: FloatE → TransformE
rotateP θ (x, y) = (x * cos θ - y * sin θ ,y * cos θ + x * sin θ)

Anwendung

Per Definition bilden Transformationen Punkte auf  Punkten ab. Gibt es die Möglichkeit, sie so anzuwenden, dass Bilder auf transformierte Bilder abgebildet werden?

applyTrans :: TransformE → Image α → Image α

Ein Blick auf die verwendeten Typen suggeriert folgende Definition:

applyTrans xf im ?= im . xf

Prüfen der These durch vergrössern einer Scheibe

udisk :: Region
udisk p = distO p < 1

Bild udisk
Bild uscale udisk
Grafische Darstellung udisk
Grafische Darstellung udisk . uscaleP 2


Ergebnis: Verkleinerung auf die Hälfte.
Denn uscaleP verdoppelt den Abstand der Punkte zum Ursprung.
→ Damit ihre skalierten Gegenstücke noch innerhalb des Radius 1 liegen, müssen die Punkte einen Wert <= ½ haben.

Um ein Bild zu transformieren, müssen die Punkte invers transformiert werden bevor sie auf das Bild angewendet werden.

applyTrans xf im = im . xf-1

Problem:
→  Die Transformationen werden invertiert erstellt.

"neue" Transformationen

Es ergeben sich also folgenden neue Transformationen.

type Filter α     = Image α → Image α

translate, scale
::
Vector → Filter α
uscale, rotate
::
Float → Filter α
translate (dx, dy) im
=
im . translateP (- dx,- dy)
scale (sx, sy) im
=
im . scaleP (1/sx, 1/sy)
uscale s im
=
im . uscaleP (1/s)
rotate θ im
=
im . rotateP (-θ)

Swirl

Swirl ist eine Funktion, welche die einzelnen Punkte eines Bildes um den Ursprung dreht, in Abhängigkeit zur Entfernung vom Ursprung.
r gibt die Distanz an, ab welcher eine volle Drehung erfolgt.

swirlP
::
FloatE → TransformE
swirlP r p
=
rotate (distO p * 2π /r) p
swirl
::
FloatE → Filter α
swirl r im
=
im . swirlP (-r)

Es ist nützlich, aussagekräftie Namen für Transformationen auf farbigen Bilder zu haben:

type FilterC = Filter ColorE

Beispiel für Swirl

vstrip         :: Region
vstrip (x,y) = abs X <=* 1/2

Bild vstrip
Bild swirl vstrip
Grafische Darstellung vstrip
Grafische Darstellung swirl 3 vstrip


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