Start · Sprachen · JavaScript · Referenz · SVGPolygonElement.points

SVGPolygonElement.points

Eigenschaft

Liefert eine lebendige <code>SVGPointList</code> mit dem Basiswert des <code>points</code>-Attributs eines <code>&lt;polygon&gt;</code>-Elements.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

get SVGPolygonElement.points

Beschreibung

Die schreibgeschützte Eigenschaft points des Interfaces SVGPolygonElement gibt eine SVGPointList zurück. Diese Liste enthält den Basiswert des points-Attributs, also den Wert ohne Einfluss von SMIL-Animationen. Jeder Eintrag ist ein Punkt mit den Koordinaten x und y.

„Schreibgeschützt“ heißt hier nur: Man kann polygon.points kein neues Objekt zuweisen. Die Liste selbst lässt sich aber ändern. Sie ist lebendig: Methoden wie appendItem(), insertItemBefore(), replaceItem(), removeItem() und clear() ändern sofort das points-Attribut im DOM. Wenn man die Koordinaten eines vorhandenen Punkts direkt ändert (point.x = 10), wird das Attribut ebenfalls aktualisiert. Umgekehrt ändert sich die Liste, wenn das Attribut per setAttribute() geändert wird.

Die Eigenschaft ist nützlich, wenn man Polygone Punkt für Punkt lesen oder bearbeiten will, etwa in Diagramm-Editoren, für Hit-Tests, zum Berechnen von Flächen oder Umfängen oder für interaktives Ziehen einzelner Eckpunkte. So muss man die Attribut-Zeichenkette nicht selbst zerlegen und wieder zusammensetzen. Für den gerade animierten Wert gibt es die Eigenschaft animatedPoints.

Rückgabewert

Typ
SVGPointList
Beschreibung
Eine lebendige Liste der Eckpunkte (DOMPoint bzw. früher SVGPoint) mit den Eigenschaften length/numberOfItems und Methoden wie getItem(), appendItem(), removeItem(). Jede Änderung wird sofort ins points-Attribut übernommen.

Beispiele

Eckpunkte eines Polygons auslesen

const svg = document.querySelector('svg');
const polygon = document.createElementNS('http://www.w3.org/2000/svg', 'polygon');
polygon.setAttribute('points', '0,0 100,0 50,80');
svg.append(polygon);

const { points } = polygon;
console.log(points.numberOfItems);
for (let i = 0; i < points.numberOfItems; i++) {
  const p = points.getItem(i);
  console.log(`Punkt ${i}: (${p.x}, ${p.y})`);
}
3 Punkt 0: (0, 0) Punkt 1: (100, 0) Punkt 2: (50, 80)

Punkt anhängen und einzelnen Punkt verschieben

const svg = document.querySelector('svg');
const polygon = svg.querySelector('polygon'); // points="0,0 100,0 50,80"

// Neuen Punkt über das SVG-Wurzelelement erzeugen (breiteste Kompatibilität)
const p = svg.createSVGPoint();
p.x = 0;
p.y = 80;
polygon.points.appendItem(p);

// Vorhandenen Eckpunkt direkt ändern – das Attribut wird mitgeführt
polygon.points.getItem(1).x = 120;

console.log(polygon.getAttribute('points'));
0,0 120,0 50,80 0,80

Fläche eines Polygons berechnen (Gaußsche Trapezformel)

const polygonArea = (polygon) => {
  const pts = Array.from({ length: polygon.points.numberOfItems },
    (_, i) => polygon.points.getItem(i));
  let sum = 0;
  pts.forEach((p, i) => {
    const q = pts[(i + 1) % pts.length];
    sum += p.x * q.y - q.x * p.y;
  });
  return Math.abs(sum) / 2;
};

const poly = document.querySelector('polygon');
poly.setAttribute('points', '0,0 100,0 100,50 0,50');
console.log(polygonArea(poly));
5000

// Wichtig · Fallstricke

  • Schreibschutz betrifft nur die Referenz: polygon.points = … hat keine Wirkung (im Strict Mode wird ein TypeError geworfen). Um alle Punkte zu ersetzen, nutzt man setAttribute('points', …) oder points.clear() und danach appendItem().
  • Ein Punkt kann nur in einer Liste stehen: Fügt man per appendItem() einen Punkt ein, der schon zu einer anderen Liste gehört, wird er dort entfernt oder als Kopie eingefügt, je nach Implementierung. Am sichersten ist es, für jede Liste neue Punkte mit svg.createSVGPoint() zu erzeugen.
  • DOMPoint statt SVGPoint: Nach SVG 2 sind die Einträge DOMPoint-Objekte. Ältere Chromium-Versionen akzeptieren in appendItem() nur echte SVGPoint-Objekte. createSVGPoint() funktioniert überall.
  • Die Liste ist nicht iterierbar wie ein Array, zumindest nicht in allen Browsern. Für eine portable Schleife nutzt man numberOfItems bzw. length zusammen mit getItem(i).
  • Ungültige Attributwerte (etwa eine ungerade Anzahl von Koordinaten) führen zu einer gekürzten Liste bis zum Fehler. Es wird keine Ausnahme geworfen.
  • points liefert den Basiswert. Laufende SMIL-Animationen sieht man nur in animatedPoints.
  • Die Eigenschaft wird in allen modernen Browsern unterstützt. Dasselbe Verhalten gibt es bei SVGPolylineElement.points.