Signatur
Beschreibung
DOMQuad.p3 gibt den dritten der vier Eckpunkte eines Vierecks (DOMQuad) als DOMPoint zurück. Die Punkte p1 bis p4 sind der Reihe nach angeordnet. Erzeugt man ein Quad mit DOMQuad.fromRect(), gilt: p1 ist oben links, p2 oben rechts, p3 unten rechts und p4 unten links.
Die Eigenschaft selbst ist schreibgeschützt: Man kann p3 kein neues Objekt zuweisen. Der zurückgegebene DOMPoint lässt sich aber verändern. Wenn du quad.p3.x oder quad.p3.y änderst, verformst du das Viereck direkt. Das wirkt sich auch auf das Ergebnis von getBounds() aus.
Nützlich ist p3 vor allem, wenn du mit transformierten Formen arbeitest, etwa nach einer Drehung, Scherung oder perspektivischen Verzerrung durch eine DOMMatrix. Nach so einer Transformation ist ein Rechteck meist kein achsenparalleles Rechteck mehr. Mit p1 bis p4 bekommst du dann trotzdem die genauen Eckpunkte, zum Beispiel für Kollisionsprüfungen, Hit-Tests oder zum Zeichnen auf einem Canvas.
Rückgabewert
x, y, z und w. Es wird bei jedem Zugriff dasselbe veränderbare Objekt zurückgegeben.Beispiele
Untere rechte Ecke eines Rechtecks ermitteln
const quad = DOMQuad.fromRect({ x: 10, y: 20, width: 100, height: 50 });
const { x, y, z, w } = quad.p3;
console.log(`p3 = (${x}, ${y}, ${z}, ${w})`);
Quad mit einer DOMMatrix transformieren
const quad = DOMQuad.fromRect({ x: 10, y: 20, width: 100, height: 50 });
// Erst mit Faktor 2 skalieren, dann um (5, 5) verschieben
const matrix = new DOMMatrix().translate(5, 5).scale(2);
const transformed = new DOMQuad(
matrix.transformPoint(quad.p1),
matrix.transformPoint(quad.p2),
matrix.transformPoint(quad.p3),
matrix.transformPoint(quad.p4)
);
console.log(transformed.p3.x, transformed.p3.y);
Eckpunkt direkt verschieben und die Bounding-Box prüfen
const quad = DOMQuad.fromRect({ x: 10, y: 20, width: 100, height: 50 });
// p3 ist schreibgeschützt, der DOMPoint selbst aber nicht
quad.p3.x = 200;
quad.p3.y = 120;
const bounds = quad.getBounds();
console.log(bounds.width, bounds.height);
Eigenes Viereck anlegen und auf einem Canvas zeichnen
const quad = new DOMQuad(
{ x: 20, y: 20 },
{ x: 180, y: 40 },
{ x: 160, y: 140 },
{ x: 40, y: 120 }
);
const ctx = document.querySelector('canvas').getContext('2d');
ctx.beginPath();
for (const p of [quad.p1, quad.p2, quad.p3, quad.p4]) {
ctx.lineTo(p.x, p.y);
}
ctx.closePath();
ctx.stroke();
console.log(quad.p3.toJSON());
// Wichtig · Fallstricke
- Schreibgeschützt, aber veränderbar:
quad.p3 = new DOMPoint()hat keine Wirkung (im Strict Mode gibt es einenTypeError). Die Koordinaten des zurückgegebenen Punkts lassen sich aber ändern, und das Quad ändert sich mit. Wenn du das nicht willst, erzeuge eine Kopie mitDOMPoint.fromPoint(quad.p3). - Der Konstruktor kopiert:
new DOMQuad(p1, p2, p3, p4)übernimmt die Werte der übergebenen Punkte. Wenn du den ursprünglichenDOMPointdanach änderst, bleibt das Quad unverändert. - Welche Ecke p3 ist, hängt von der Erzeugung ab: Nur bei
fromRect()istp3sicher die untere rechte Ecke. Bei eigenen Vierecken oder nach einer Drehung liegtp3dort, wo die Eingabe bzw. die Transformation ihn hinlegt. - Rundungsfehler: Nach Drehungen mit
DOMMatrix.rotate()können winzige Gleitkomma-Abweichungen entstehen, zum Beispiel6.1e-15statt0. Vergleiche Koordinaten deshalb mit einer Toleranz. - Kompatibilität:
DOMQuadgibt es in allen aktuellen Browsern. In Node.js ist es ohne Polyfill nicht vorhanden.Element.getBoxQuads(), dasDOMQuad-Objekte für Elemente liefern würde, ist dagegen kaum unterstützt (nur experimentell in Firefox).