about-svg.de

Linien und Pfade mit dem path-Element

Teil 1: Grundlagen · Kapitel 3 von 12 · Aktualisiert am · 5 Minuten Lesezeit

Fast jede Grafik, die aus einem Zeichenprogramm kommt, besteht zum größten Teil aus Pfaden. Wer das d-Attribut lesen kann, versteht, was in einer SVG-Datei tatsächlich passiert.

Ein Stift, der Befehle bekommt

Das Element <path> hat ein einziges zentrales Attribut: d für „data“. Darin steht eine Folge von Befehlen, jeweils ein Buchstabe gefolgt von Zahlen. Am einfachsten stellst du dir einen Zeichenstift vor, der über das Papier geführt wird. M hebt ihn an und setzt ihn an eine neue Stelle, L zieht eine gerade Linie dorthin, Z führt ihn zurück zum Anfang des Teilpfads.

Großbuchstaben bedeuten absolute Koordinaten, Kleinbuchstaben relative, also gemessen vom aktuellen Punkt aus. L 50 80 zieht eine Linie zum Punkt (50|80), l 50 80 zieht sie 50 Einheiten nach rechts und 80 nach unten.

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 150" width="240" height="180">
  <path d="M 40 140 V 70 L 100 20 L 160 70 V 140 Z M 85 140 V 100 H 115 V 140"
        fill="#cfdcf7" stroke="#1f5fd1" stroke-width="4" stroke-linejoin="round"/>
</svg>
Ein Haus aus einem einzigen Pfad. H und V sind Kurzformen für waagerechte und senkrechte Linien.

Die Befehle im Überblick

BefehlParameterBedeutung
Mx yStift absetzen (move to), beginnt einen neuen Teilpfad
Lx ygerade Linie zum Punkt
H / Vx bzw. ywaagerechte bzw. senkrechte Linie
Cx1 y1 x2 y2 x ykubische Bézierkurve mit zwei Kontrollpunkten
Sx2 y2 x yglatte Fortsetzung einer kubischen Kurve
Qx1 y1 x yquadratische Bézierkurve mit einem Kontrollpunkt
Tx yglatte Fortsetzung einer quadratischen Kurve
Arx ry Drehung große-Bogen-Flag Richtungs-Flag x yelliptischer Bogen
ZkeineTeilpfad schließen

Bézierkurven

Kurven beschreibt SVG mit Bézierkurven, benannt nach dem französischen Ingenieur Pierre Bézier, der sie in den 1960er-Jahren bei Renault für die Konstruktion von Karosserien nutzte. Eine kubische Kurve (C) hat einen Start- und einen Endpunkt und dazwischen zwei Kontrollpunkte. Die Kurve geht nicht durch die Kontrollpunkte hindurch. Sie wird von ihnen angezogen, und die Verbindung vom Endpunkt zum Kontrollpunkt gibt die Richtung an, in der die Kurve den Punkt verlässt.

Genau das siehst du in jedem Vektorprogramm als „Anfasser“: die kleinen Griffe an einem Ankerpunkt, mit denen man eine Kurve biegt. Im Beispiel sind sie eingezeichnet.

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 170" width="320" height="170">
  <path d="M 30 140 C 60 20, 250 20, 290 140" fill="none" stroke="#1f5fd1" stroke-width="4"/>
  <path d="M 30 140 L 60 20 M 290 140 L 250 20" stroke="#9aa3b2" stroke-width="1.5"/>
  <circle cx="60" cy="20" r="5" fill="#fff" stroke="#566070" stroke-width="2"/>
  <circle cx="250" cy="20" r="5" fill="#fff" stroke="#566070" stroke-width="2"/>
  <rect x="25" y="135" width="10" height="10" fill="#c2410c"/>
  <rect x="285" y="135" width="10" height="10" fill="#c2410c"/>
</svg>
Eine kubische Bézierkurve. Die orangen Quadrate sind Start- und Endpunkt, die Kreise die Kontrollpunkte, die dünnen Linien die Anfasser.

Die quadratische Variante Q kommt mit einem Kontrollpunkt aus und ist dadurch leichter zu berechnen, aber weniger flexibel. S und T sparen Schreibarbeit: Sie spiegeln den letzten Kontrollpunkt der vorherigen Kurve, sodass zwei Kurvenstücke ohne Knick ineinander übergehen. So entstehen Wellenlinien mit sehr kurzem Code.

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 100" width="320" height="100">
  <path d="M 10 50 Q 45 5, 80 50 T 160 50 T 240 50 T 310 50" fill="none" stroke="#1f5fd1" stroke-width="4" stroke-linecap="round"/>
</svg>
Eine Welle aus einem Q-Befehl und drei T-Befehlen. Nur der erste Kontrollpunkt wird angegeben.
Zwei durchsichtige Kurvenlineale aus Kunststoff auf einem Holztisch
Kurvenlineale aus dem technischen Zeichnen. Bevor Kurven am Rechner berechnet wurden, zeichnete man sie an solchen Schablonen entlang. Foto: 5snake5, CC0, Wikimedia Commons

Bögen

Der Befehl A zeichnet ein Stück einer Ellipse und gilt als der schwierigste. Er bekommt die beiden Radien, eine Drehung der Ellipse in Grad und den Zielpunkt. Dazwischen stehen zwei Schalter mit den Werten 0 oder 1. Zwischen zwei Punkten passen nämlich meistens zwei Ellipsen mit den gegebenen Radien, und auf jeder gibt es einen kurzen und einen langen Weg. Der erste Schalter (large-arc-flag) wählt den langen oder kurzen Bogen, der zweite (sweep-flag) die Drehrichtung.

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 340 170" width="340" height="170">
  <path d="M 30 85 A 50 50 0 0 0 100 85" fill="none" stroke="#1f5fd1" stroke-width="3"/>
  <path d="M 30 85 A 50 50 0 0 1 100 85" fill="none" stroke="#7fa6ef" stroke-width="3"/>
  <path d="M 200 85 A 50 50 0 1 0 270 85" fill="none" stroke="#1f5fd1" stroke-width="3"/>
  <path d="M 200 85 A 50 50 0 1 1 270 85" fill="none" stroke="#7fa6ef" stroke-width="3"/>
  <rect x="26" y="81" width="8" height="8" fill="#c2410c"/><rect x="96" y="81" width="8" height="8" fill="#c2410c"/>
  <rect x="196" y="81" width="8" height="8" fill="#c2410c"/><rect x="266" y="81" width="8" height="8" fill="#c2410c"/>
</svg>
Viermal derselbe Bogen von links nach rechts mit Radius 50, nur die beiden Schalter unterscheiden sich: 0 0, 0 1, 1 0 und 1 1.

Pfade von Hand lesen

Pfade aus Zeichenprogrammen sehen oft so aus: m12.5 3.2c-1.1 0-2 .9-2 2v6l3 3. Das ist dieselbe Sprache, nur ohne Leerzeichen. Ein Minuszeichen oder ein zweiter Dezimalpunkt beginnt automatisch eine neue Zahl, und folgen auf einen Befehl mehr Zahlen als nötig, wird er einfach wiederholt. Die Schreibweise spart Platz, ist aber schwer zu lesen. Zum Verstehen hilft es, die Befehle gedanklich zu trennen und mit Kleinbuchstaben vom jeweils letzten Punkt aus zu rechnen.

Wie Pfade aussehen, hängt außerdem von der Füllregel ab. Schneidet sich ein Pfad selbst oder enthält er mehrere Teilpfade, entscheidet fill-rule, welche Bereiche gefüllt werden. Mit evenodd entstehen Löcher, etwa beim Buchstaben O, mit nonzero hängt das Ergebnis von der Zeichenrichtung ab.

Pfade sind auch die Grundlage für Text entlang einer Linie, wie das Kapitel über Text zeigt, und für Bewegungen entlang einer Bahn im Kapitel Animation.

Zum Weiterlesen