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
|
|
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:
- unmöglich bei m:1 Zuweisungen
→ 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
|
|
Grafische
Darstellung vstrip
|
Grafische
Darstellung swirl 3 vstrip
|
... [ Seminar "Einführung in
Haskell" ] ... [ Inhaltsverzeichnis ]
... [ zurück ] ... [ weiter ] ... [ nach oben ] ...