Signatur
Beschreibung
DOMQuad gehört zur Geometry-Interfaces-Spezifikation und steht neben DOMPoint, DOMRect und DOMMatrix. Ein DOMRect ist immer achsenparallel. Ein DOMQuad kann dagegen jedes Viereck darstellen, also auch gedrehte, gescherte oder perspektivisch verzerrte Flächen. Das ist der Fall, sobald eine CSS- oder Canvas-Transformation auf ein Rechteck angewendet wird.
Die vier Ecken liegen in den schreibgeschützten Eigenschaften p1, p2, p3 und p4. Jede davon ist ein DOMPoint. Die Referenz auf den Punkt lässt sich nicht austauschen, seine Koordinaten x, y, z und w kann man aber direkt ändern. Wichtige Mitglieder:
new DOMQuad(p1, p2, p3, p4): erzeugt ein Viereck aus vier Punkten.DOMQuad.fromRect(rect): erzeugt ein Viereck aus einem Rechteck (Uhrzeigersinn, Start oben links).DOMQuad.fromQuad(quad): erzeugt eine Kopie aus einem Objekt mit den Eigenschaftenp1bisp4.getBounds(): gibt das kleinste achsenparalleleDOMRectzurück, das alle vier Punkte umschließt.toJSON(): wandelt das Viereck in ein einfaches, serialisierbares Objekt um.
Typische Anwendungsfälle sind die Kollisionserkennung mit transformierten Elementen, Treffertests in Canvas- oder SVG-Editoren, das Berechnen der Bounding-Box nach einer Rotation und die Weitergabe von Geometriedaten an Worker, zum Beispiel per postMessage.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $p1 | DOMPointInit | {x: 0, y: 0, z: 0, w: 1} | Erster Eckpunkt, üblicherweise oben links. |
| $p2 | DOMPointInit | {x: 0, y: 0, z: 0, w: 1} | Zweiter Eckpunkt, üblicherweise oben rechts. |
| $p3 | DOMPointInit | {x: 0, y: 0, z: 0, w: 1} | Dritter Eckpunkt, üblicherweise unten rechts. |
| $p4 | DOMPointInit | {x: 0, y: 0, z: 0, w: 1} | Vierter Eckpunkt, üblicherweise unten links. |
Rückgabewert
DOMQuad-Objekt. Seine Eigenschaften p1 bis p4 sind DOMPoint-Instanzen.Beispiele
Viereck erzeugen und Bounding-Box ermitteln
const quad = new DOMQuad(
{ x: 0, y: 0 },
{ x: 100, y: 20 },
{ x: 120, y: 80 },
{ x: 10, y: 60 }
);
console.log(quad.p3.x, quad.p3.y);
const { x, y, width, height } = quad.getBounds();
console.log({ x, y, width, height });
Aus einem Rechteck erzeugen und serialisieren
const quad = DOMQuad.fromRect({ x: 10, y: 20, width: 100, height: 50 });
// Reihenfolge: oben links, oben rechts, unten rechts, unten links
const corners = [quad.p1, quad.p2, quad.p3, quad.p4]
.map(({ x, y }) => `(${x}|${y})`);
console.log(corners.join(' '));
// Für postMessage oder JSON geeignet
console.log(JSON.stringify(quad.toJSON().p3));
Gedrehtes Rechteck: Ecken transformieren und Bounding-Box berechnen
const rect = { x: 0, y: 0, width: 100, height: 50 };
const matrix = new DOMMatrix().rotate(90); // 90° um den Ursprung
const base = DOMQuad.fromRect(rect);
const rotated = new DOMQuad(
matrix.transformPoint(base.p1),
matrix.transformPoint(base.p2),
matrix.transformPoint(base.p3),
matrix.transformPoint(base.p4)
);
const b = rotated.getBounds();
// Runden, weil cos(90°) nicht exakt 0 ist
console.log([b.x, b.y, b.width, b.height].map(Math.round));
Punkt eines Vierecks direkt verschieben
const quad = DOMQuad.fromRect({ x: 0, y: 0, width: 40, height: 40 });
// quad.p2 = ... ist nicht möglich, die Koordinaten sind aber änderbar
quad.p2.x += 20;
quad.p3.x += 20;
console.log(quad.getBounds().width);
// Wichtig · Fallstricke
- Schreibgeschützte Punkte:
p1bisp4kann man nicht neu zuweisen. Werquad.p1 = new DOMPoint()schreibt, bekommt keine Wirkung (im Strict Mode einenTypeError). Die Koordinaten der vorhandenen Punkte lassen sich dagegen ändern. getBounds()berücksichtigt nurxundy: Werte fürzundwfließen nicht ein. Eine perspektivische Division durchwmuss man vorher selbst durchführen.- Keine Transformationsmethode:
DOMQuadhat kein eingebautestransform(). Jeden Punkt einzeln mitDOMMatrix.prototype.transformPoint()umrechnen. - Gleitkomma-Ungenauigkeit: Nach Rotationen entstehen Werte wie
6.1e-15statt0. Vor Vergleichen runden oder mit einer Toleranz arbeiten. - Kompatibilität: Das Interface selbst wird in allen modernen Browsern unterstützt, auch in Workern. Die Methoden, die ein
DOMQuadliefern, etwaElement.getBoxQuads()undconvertQuadFromNode(), sind experimentell und praktisch nur in Firefox hinter einem Flag verfügbar. In der Praxis erzeugt manDOMQuad-Objekte deshalb meist selbst. - Die Reihenfolge der Punkte wird nicht geprüft. Überkreuzte oder entartete Vierecke sind erlaubt.