Start · Sprachen · JavaScript · Referenz · DOMMatrix.rotateFromVectorSelf()

DOMMatrix.rotateFromVectorSelf()

Methode

Dreht die Matrix direkt um den Winkel zwischen dem Vektor <code>(x, y)</code> und der positiven x-Achse <code>(1, 0)</code> und gibt dieselbe Matrix zurück.

seit JavaScript Baseline: alle modernen Browser (Chrome 61+, Firef Kategorie: webapi

Signatur

DOMMatrix.prototype.rotateFromVectorSelf(x, y)

Beschreibung

rotateFromVectorSelf() ist die verändernde Variante von DOMMatrixReadOnly.rotateFromVector(). Die Methode bestimmt den Drehwinkel nicht über eine Gradangabe, sondern aus einem Richtungsvektor: Der Winkel entspricht Math.atan2(y, x), also dem Winkel zwischen (x, y) und (1, 0). Mit diesem Winkel wird eine 2D-Drehung um die z-Achse auf die bestehende Matrix angewendet. Die Drehmatrix wird dabei rechts an die aktuelle Matrix multipliziert (this = this × R).

Nützlich ist das immer dann, wenn eine Richtung als Vektor vorliegt, etwa eine Bewegungsrichtung, ein Geschwindigkeitsvektor oder der Abstand zwischen zwei Punkten. Pfeile, Sprites oder Beschriftungen lassen sich so an einer Richtung ausrichten, ohne dass man selbst Math.atan2() aufrufen und von Bogenmaß in Grad umrechnen muss.

Da die Methode die Matrix selbst verändert und this zurückgibt, kann man sie mit anderen *Self()-Methoden wie translateSelf() oder scaleSelf() verketten. Soll die ursprüngliche Matrix erhalten bleiben, verwendet man stattdessen rotateFromVector(). Diese Methode liefert eine neue Matrix.

Parameter

Name Typ Default Beschreibung
$x number 0 x-Komponente des Richtungsvektors.
$y number 0 y-Komponente des Richtungsvektors.

Rückgabewert

Typ
DOMMatrix
Beschreibung
Dieselbe, jetzt gedrehte DOMMatrix-Instanz (this). Dadurch lassen sich weitere Aufrufe anhängen.

Beispiele

Einfache Drehung um 45° über den Vektor (1, 1)

const m = new DOMMatrix();
m.rotateFromVectorSelf(1, 1);

// Werte zur besseren Lesbarkeit runden
const round = (n) => Number(n.toFixed(4));
console.log(round(m.a), round(m.b), round(m.c), round(m.d));
console.log(m.is2D);
0.7071 0.7071 -0.7071 0.7071 true

Pfeil im Canvas an der Mausbewegung ausrichten

const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
let last = { x: canvas.width / 2, y: canvas.height / 2 };

canvas.addEventListener('pointermove', (event) => {
  const dx = event.offsetX - last.x;
  const dy = event.offsetY - last.y;
  if (dx === 0 && dy === 0) return;

  // An die Mausposition verschieben und in Bewegungsrichtung drehen
  const matrix = new DOMMatrix()
    .translateSelf(event.offsetX, event.offsetY)
    .rotateFromVectorSelf(dx, dy);

  ctx.setTransform(1, 0, 0, 1, 0, 0);
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.setTransform(matrix);

  // Pfeil zeigt im lokalen Koordinatensystem nach rechts (1, 0)
  ctx.beginPath();
  ctx.moveTo(-20, -8);
  ctx.lineTo(10, 0);
  ctx.lineTo(-20, 8);
  ctx.closePath();
  ctx.fill();

  last = { x: event.offsetX, y: event.offsetY };
});

Unterschied zu rotateFromVector()

const original = new DOMMatrix();

// Liefert eine neue Matrix, das Original bleibt unverändert
const copy = original.rotateFromVector(0, 1);
console.log(original.isIdentity); // true

// Verändert das Original selbst
const same = original.rotateFromVectorSelf(0, 1);
console.log(same === original);   // true
console.log(Math.round(original.b), Math.round(original.c));
true true 1 -1

// Wichtig · Fallstricke

  • Verändert die Matrix: Wird dieselbe DOMMatrix an mehreren Stellen verwendet, wirkt sich die Drehung überall aus. Wer das nicht will, nimmt rotateFromVector() oder erstellt vorher eine Kopie mit DOMMatrix.fromMatrix(m).
  • Nur die Richtung zählt: Die Länge des Vektors spielt keine Rolle, (2, 2) und (1, 1) ergeben dieselbe Drehung. Der Nullvektor (0, 0), der auch ohne Argumente verwendet wird, ergibt einen Winkel von 0°. Die Matrix bleibt dann unverändert.
  • Koordinatensystem: Im Bildschirm- und Canvas-Koordinatensystem zeigt die y-Achse nach unten. Ein positives y dreht deshalb optisch im Uhrzeigersinn.
  • Reihenfolge: Die Drehung wird rechts an die Matrix multipliziert und wirkt damit im lokalen Koordinatensystem. translateSelf().rotateFromVectorSelf() dreht also um den verschobenen Ursprung.
  • Rundung: Wegen der Gleitkomma-Arithmetik entstehen Werte wie 6.123e-17 statt 0. Vor einem Vergleich sollte man runden.
  • Kompatibilität: Die Methode gibt es nur bei DOMMatrix, nicht bei DOMMatrixReadOnly. Sie ist auch in Web Workern verfügbar. In Node.js gibt es DOMMatrix nicht ohne Polyfill.