Start · Sprachen · JavaScript · Referenz · PointerEvent.altitudeAngle

PointerEvent.altitudeAngle

Eigenschaft

Schreibgeschützter Winkel in Radiant (0 bis π/2) zwischen der Achse eines Stifts bzw. Zeigers und der Bildschirmebene (X-Y-Ebene).

seit JavaScript Pointer Events Level 3 – Chrome/Edge 86+, Safari 1 Kategorie: webapi

Signatur

PointerEvent.altitudeAngle

Beschreibung

altitudeAngle ist eine schreibgeschützte Eigenschaft von PointerEvent. Sie gibt an, wie stark ein Transducer, meist ein Eingabestift, gegenüber der Oberfläche des Geräts geneigt ist. Der Wert wird in Radiant angegeben und liegt im Bereich 0 bis π/2:

  • 0: Der Stift liegt parallel zur Oberfläche.
  • π/2 (≈ 1,5708): Der Stift steht senkrecht auf der Oberfläche. Das ist auch der Standardwert, wenn das Gerät keine Neigung meldet.

Zusammen mit azimuthAngle beschreibt altitudeAngle die Ausrichtung des Stifts in Kugelkoordinaten. Das ist eine Alternative zu den älteren Eigenschaften tiltX und tiltY, die zwei ebene Neigungswinkel in Grad liefern. Der Browser rechnet die beiden Darstellungen ineinander um, sodass beide Werte gleichzeitig verfügbar sind.

Typische Einsatzgebiete sind Zeichen- und Malprogramme, Handschrift-Erkennung und Kalligrafie-Werkzeuge. Dort lässt sich über den Neigungswinkel zum Beispiel die Pinselbreite, die Deckkraft oder eine „Schraffur-Wirkung“ steuern, so wie bei einem echten Bleistift, der flach gehalten wird.

Rückgabewert

Typ
number
Beschreibung
Winkel in Radiant zwischen 0 (parallel zur Oberfläche) und Math.PI / 2 (senkrecht). Unterstützt das Gerät keine Neigung, ist der Wert Math.PI / 2.

Beispiele

Neigungswinkel des Stifts auslesen

const canvas = document.querySelector('#zeichenflaeche');

canvas.addEventListener('pointermove', (event) => {
  if (event.pointerType !== 'pen') return;

  // Radiant in Grad umrechnen
  const grad = event.altitudeAngle * (180 / Math.PI);
  console.log(`Höhenwinkel: ${grad.toFixed(1)}°`);
});
Höhenwinkel: 62.3°

Pinselbreite abhängig von der Neigung (Canvas)

const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
let zuletzt = null;

canvas.addEventListener('pointerdown', (e) => {
  zuletzt = { x: e.offsetX, y: e.offsetY };
  canvas.setPointerCapture(e.pointerId);
});

canvas.addEventListener('pointermove', (e) => {
  if (!zuletzt) return;

  // 0 = flach -> breit, 1 = senkrecht -> schmal
  const aufrecht = e.altitudeAngle / (Math.PI / 2);
  const breite = 2 + (1 - aufrecht) * 18;

  ctx.lineWidth = breite * (e.pressure || 0.5);
  ctx.lineCap = 'round';
  ctx.beginPath();
  ctx.moveTo(zuletzt.x, zuletzt.y);
  ctx.lineTo(e.offsetX, e.offsetY);
  ctx.stroke();

  zuletzt = { x: e.offsetX, y: e.offsetY };
});

canvas.addEventListener('pointerup', () => { zuletzt = null; });

Fallback auf tiltX/tiltY bei fehlender Unterstützung

const hoehenwinkel = (e) => {
  if ('altitudeAngle' in e) return e.altitudeAngle;

  // Umrechnung aus tiltX/tiltY (Grad) nach Pointer Events Level 3
  const tx = (e.tiltX * Math.PI) / 180;
  const ty = (e.tiltY * Math.PI) / 180;
  if (tx === 0 && ty === 0) return Math.PI / 2;
  if (Math.abs(tx) === Math.PI / 2 || Math.abs(ty) === Math.PI / 2) return 0;
  return Math.atan(1 / Math.sqrt(Math.tan(tx) ** 2 + Math.tan(ty) ** 2));
};

document.addEventListener('pointermove', (e) => {
  console.log(hoehenwinkel(e).toFixed(3));
});
1.571

Wert in einem synthetischen Event setzen

const ev = new PointerEvent('pointermove', {
  pointerType: 'pen',
  altitudeAngle: Math.PI / 4
});

console.log(ev.altitudeAngle.toFixed(4));
0.7854

// Wichtig · Fallstricke

  • Einheit: Der Wert ist in Radiant angegeben, nicht in Grad wie bei tiltX/tiltY. Für eine Anzeige in Grad mit 180 / Math.PI multiplizieren.
  • Standardwert: Bei Maus, Touch oder Stiften ohne Neigungssensor liefert die Eigenschaft immer π/2. Ob ein Stift wirklich geneigt ist, lässt sich daraus nicht sicher ablesen. Deshalb vorher pointerType === 'pen' prüfen.
  • Browser-Kompatibilität: Chromium-Browser unterstützen die Eigenschaft seit Version 86. Safari und Firefox sind erst später dazugekommen. Ältere Browser liefern undefined, daher mit 'altitudeAngle' in event prüfen und bei Bedarf aus tiltX/tiltY umrechnen.
  • Hardware: Ob sinnvolle Werte ankommen, hängt vom Stift, vom Treiber und vom Betriebssystem ab (z. B. Apple Pencil, Wacom, Surface Pen).
  • Performance: pointermove kann sehr häufig feuern. Für eine genaue Linienführung getCoalescedEvents() verwenden, denn jedes dieser Einzelereignisse hat einen eigenen altitudeAngle.