JavaScript/Canvas/Transformationen
Aus SELFHTML-Wiki
< JavaScript | Canvas
Eine weitere Möglichkeit der Bildmanipulation stellt die Verwendung von sogenannten Transformationen dar. Eine Transformation (von lat. transformare: umformen, umwandeln) ist dabei ein Muster (die sogenannte Transformationsmatrix), mit dessen Hilfe jedem Ursprungspunkt ein neuer Zielpunkt zugewiesen wird. Mögliche Transformationen sind z. B. die einfache Verschiebung (Translation), Rotation, Streckung (Skalierung) u. Ä.
Zur Verwendung solcher Transformationen stehen folgende Memberfunktionen zur Verfügung:
-
translate(tx, ty)
: Verschiebt alles, was nach dem Aufrufen vontranslate
gezeichnet wird, um die angegebenen Koordinaten. Dies bedeutet, dass allen folgenden x-Koordinaten der Werttx
bzw. allen y-Koordinatenty
hinzuaddiert wird. Wird die Funktion mehrmals aufgerufen, so werden die einzelnentx
bzw.ty
addiert. Der Funktionsaufruf ist identisch mittransform(1, 0, 0, 1, tx, ty)
. -
rotate(w)
: Rotiert alles, was nach dem Aufrufen vonrotate
gezeichnet wird, im Uhrzeigesinn um den hinterlegten Winkel; als Rotationszentrum wird dabei der (evtl. durchtranslate
verschobene) Punkt (0 | 0) angenommen. Berücksichtigen Sie, dass der Winkel in der Einheit rad interpretiert wird (seine Angabe erfolgt jedoch als Float-Wert, nicht als CSS-String). Wird die Funktion mehrmals aufgerufen, so werden die einzelnenw
addiert. Der Funktionsaufruf ist identisch mittransform(Math.cos(w), Math.sin(w), -Math.sin(w), Math.cos(w), 0, 0).
-
scale(kx, ky)
: Multipliziert alle x-, y-, width- und height-Angaben, die nach dem Aufrufen vonscale
den Context-Funktionen übergeben werden. Dabei wirdkx
mit den x- und width-Angaben,ky
mit den y- und height-Angaben multipliziert. Die resultierenden Zeichnungen wirken nach Verwendung vonscale
(zentrisch) gestreckt. Wird die Funktion mehrmals aufgerufen, so werden die einzelnenkx
bzw.ky
miteinander multipliziert. Der Funktionsaufruf ist identisch mittransform(kx, 0, 0, ky, 0, 0)
. -
setTransform(a, b, c, d, e, f)
: Löscht alle aktiven Translationen, Rotationen sowie Skalierungen und setzt die Transformationsmatrix auf die übergebenen Werte. Dabei habena
undd
den gleichen Effekt wiekx
undky
beiscale
; die Wertee
undf
sind mittx
undty
vontranslate
identisch. Mithilfe des Wertesc
wird der x-Koordinate das c-Fache der y-Koordinate hinzuaddiert (das Umgekehrte gilt entsprechend fürd
). Sind die Wertea
,b
,c
undd
in spezieller Relation zueinander (z. B. über trigonometrische Funktionen wiesin
undcos
), wirkt das transformierte Bild rotiert, andernfalls in verschiedenster Weise verzerrt, z. B. erscheinen Rechtecke plötzlich wie Parallelogramme (mehr Informationen zu diesen sogenannten Scherungsfaktoren siehe Weblinks). -
transform(a, b, c, d, e, f)
: Multipliziert die aktuelle Transformationsmatrix mit einer weiteren Matrix, die durch die übergebenen Argumente spezifiziert wird (genauere Informationen über Matrixmultiplikation siehe Weblinks). Angenommen, die Werte aalt, balt, calt, dalt, ealt und falt sind die aktuellen Werte der Transformationsmatrix. Dann besitzt die Transformationsmatrix nach Aufrufen der Funktiontransform(a, b, c, d, e, f)
die folgenden Werte:- aneu = aalt * a + calt * b (entspricht neuem x-Skalierungswert)
- bneu = balt * a + dalt * b (entspricht neuer y-Scherung)
- cneu = aalt * c + calt * d (entspricht neuer x-Scherung)
- dneu = balt * c + dalt * d (entspricht neuem y-Skalierungswert)
- eneu = aalt * e + calt * f + ealt (entspricht neuer x-Verschiebung)
- fneu = balt * e + dalt * f + falt (entspricht neuer y-Verschiebung)
Beispiel
ansehen …
function zeichne() {
var element = document.getElementById('canvas');
if(element.getContext) {
var context = element.getContext('2d');
context.translate(element.width / 2, element.height / 2);
context.scale(1, 2);
context.rotate(45 * Math.PI / 180);
context.strokeRect(-50, -50, 100, 100);
}
}
Quellen
Weblinks
- W3C: transformations
- WHATWG: canvas-Element
- WHATWG: canvasTransform
- Wikipedia Scherung und Scherungskoeffizienten
- canvas.quaese: Mathematischer Aufbau der Transformationsmatrix
- Wikipedia: Matrizenmultiplikation
translate
aufgerufen, welche den Ursprung des Koordinatensystems in die Mitte der Canvas verschiebt. Weiterhin bewirkt der darauf folgende Aufruf vonscale
die Streckung der y-Achse um den Faktor 2. Dadurch wird eine y-Angabe von z.B. 100 auf 200 vergrößert. Abschließend wird das Koordinatensystem noch um 45° im Uhrzeigesinn rotiert, die Formel45 * Math.PI / 180
rechnet dabei das Winkelmaß in das notwendige Bogenmaß um. Schließlich wird das eigentliche Rechteck, welches dank der vorangegangenen Transformationen wie eine Raute in der Mitte der Canvas erscheint, gezeichnet.