Canvas/Transformationen
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 vontranslategezeichnet wird, um die angegebenen Koordinaten. Dies bedeutet, dass allen folgenden x-Koordinaten der Werttxbzw. allen y-Koordinatentyhinzuaddiert wird. Wird die Funktion mehrmals aufgerufen, so werden die einzelnentxbzw.tyaddiert. Der Funktionsaufruf ist identisch mittransform(1, 0, 0, 1, tx, ty). -
rotate(w): Rotiert alles, was nach dem Aufrufen vonrotategezeichnet wird, im Uhrzeigesinn um den hinterlegten Winkel; als Rotationszentrum wird dabei der (evtl. durchtranslateverschobene) 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 einzelnenwaddiert. 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 vonscaleden Context-Funktionen übergeben werden. Dabei wirdkxmit den x- und width-Angaben,kymit den y- und height-Angaben multipliziert. Die resultierenden Zeichnungen wirken nach Verwendung vonscale(zentrisch) gestreckt. Wird die Funktion mehrmals aufgerufen, so werden die einzelnenkxbzw.kymiteinander 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 habenaunddden gleichen Effekt wiekxundkybeiscale; die Werteeundfsind mittxundtyvontranslateidentisch. Mithilfe des Wertescwird der x-Koordinate das c-Fache der y-Koordinate hinzuaddiert (das Umgekehrte gilt entsprechend fürd). Sind die Wertea,b,cunddin spezieller Relation zueinander (z. B. über trigonometrische Funktionen wiesinundcos), 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)
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);
}
}
In diesem Beispiel wird eine Raute in die Mitte der Canvas gezeichnet. Hierzu wird nach dem Ermitteln des Context-Objekts zuerst die Funktion translate aufgerufen, welche den Ursprung des Koordinatensystems in die Mitte der Canvas verschiebt. Weiterhin bewirkt der darauf folgende Aufruf von scale 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 Formel 45 * 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.
Weblinks
- W3C: transformations
- WHATWG: canvas-Element
- WHATWG: canvasTransform
- Wikipedia Scherung und Scherungskoeffizienten
- canvas.quaese: Mathematischer Aufbau der Transformationsmatrix
- Wikipedia: Matrizenmultiplikation