Start · Sprachen · JavaScript · Referenz · CanvasRenderingContext2D.miterLimit

CanvasRenderingContext2D.miterLimit

Eigenschaft

Legt fest oder liest aus, wie weit eine spitze Linienecke (<code>lineJoin = "miter"</code>) höchstens über den Eckpunkt hinausragen darf, bevor sie abgeschrägt wird.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

CanvasRenderingContext2D.miterLimit

Beschreibung

Die Eigenschaft miterLimit gilt nur, wenn lineJoin auf "miter" steht (das ist der Standardwert). Treffen zwei Liniensegmente in einem spitzen Winkel aufeinander, entsteht an der Außenseite eine lange Spitze, die Gehrung (englisch „miter“). Ihre Länge wird vom inneren bis zum äußeren Eckpunkt gemessen. Das Verhältnis aus dieser Länge und der halben Linienbreite (lineWidth / 2) nennt man Gehrungsverhältnis. Überschreitet es miterLimit, zeichnet der Browser die Ecke stattdessen abgeschrägt wie bei lineJoin = "bevel".

Der Standardwert ist 10.0. Damit werden Ecken ab einem Winkel von etwa 11,5° abgeschrägt. Mit einem kleineren Wert werden auch stumpfere Ecken abgeschrägt, mit einem größeren Wert bleiben selbst sehr spitze Ecken spitz. Das Verhältnis hängt vom Winkel θ zwischen den Segmenten ab: 1 / sin(θ / 2).

Die Eigenschaft ist nützlich für Diagramme mit Zickzack-Verläufen (zum Beispiel Kurs- oder Pulskurven), für Sterne und Pfeilspitzen und überall dort, wo dicke Linien mit spitzen Winkeln keine übermäßig langen „Stacheln“ bilden sollen. Der Wert gehört zum Zeichenzustand und wird deshalb mit save() und restore() gesichert und wiederhergestellt.

Parameter

Name Typ Default Beschreibung
$value number 10 Neues Gehrungsverhältnis. Nur endliche Zahlen größer als 0 sind gültig. Andere Werte werden ignoriert.

Rückgabewert

Typ
number
Beschreibung
Das aktuelle Miter-Limit als Gleitkommazahl, standardmäßig 10.

Beispiele

Standardwert lesen und neuen Wert setzen

const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');

console.log(ctx.miterLimit); // Standardwert
ctx.miterLimit = 4;
console.log(ctx.miterLimit);

// Ungültige Werte werden ignoriert
ctx.miterLimit = -1;
ctx.miterLimit = 0;
ctx.miterLimit = NaN;
console.log(ctx.miterLimit);
10 4 4

Zickzack-Linie mit verschiedenen Miter-Limits vergleichen

const canvas = document.querySelector('#demo');
const ctx = canvas.getContext('2d');

const zickzack = (offsetX, limit) => {
  ctx.save();
  ctx.lineWidth = 12;
  ctx.lineJoin = 'miter';
  ctx.miterLimit = limit;
  ctx.strokeStyle = '#1565c0';
  ctx.beginPath();
  ctx.moveTo(offsetX, 150);
  for (let i = 1; i <= 4; i++) {
    // spitze Winkel durch kleine horizontale Schritte
    ctx.lineTo(offsetX + i * 15, i % 2 ? 40 : 150);
  }
  ctx.stroke();
  ctx.restore();
};

zickzack(20, 1);   // alle Ecken abgeschrägt
zickzack(120, 5);  // teilweise abgeschrägt
zickzack(220, 20); // lange, spitze Ecken

Nötiges Miter-Limit für einen Winkel berechnen

// Gehrungsverhältnis = 1 / sin(θ / 2)
const miterRatio = (winkelGrad) => 1 / Math.sin((winkelGrad * Math.PI / 180) / 2);

const ctx = document.createElement('canvas').getContext('2d');

// Ein Stern mit 36°-Spitzen soll spitz bleiben
const benoetigt = miterRatio(36);
ctx.miterLimit = Math.ceil(benoetigt * 100) / 100;

console.log(benoetigt.toFixed(3));
console.log(ctx.miterLimit);
3.236 3.24

// Wichtig · Fallstricke

  • Wirkt nur bei lineJoin = "miter": Bei "round" oder "bevel" hat miterLimit keinen Einfluss.
  • Ungültige Werte werden stillschweigend ignoriert: Bei 0, negativen Zahlen, NaN oder Infinity wird kein Fehler geworfen, der alte Wert bleibt einfach bestehen.
  • Kein Kappen, sondern Umschalten: Wird das Limit überschritten, schneidet der Browser die Spitze nicht auf die erlaubte Länge ab (anders als bei miter-clip in SVG 2), sondern zeichnet die ganze Ecke abgeschrägt. Die Ecke kann deshalb sprunghaft ihre Form ändern, wenn sich der Winkel nur leicht ändert.
  • Hohe Werte: Sehr große Limits bei dicken Linien und fast parallelen Segmenten ergeben extrem lange Spitzen, die weit aus dem erwarteten Bereich herausragen und auch abgeschnitten werden können.
  • Gilt ebenso für OffscreenCanvasRenderingContext2D und Path2D-Striche. Wird in allen modernen Browsern unterstützt.