Pfade
Das <path>
-Element ist das leistungsstärkste Element in der SVG-Bibliothek der Grundformen. Es kann verwendet werden, um Linien, Kurven, Bögen und mehr zu erstellen.
Pfade erzeugen komplexe Formen, indem sie mehrere gerade Linien oder gebogene Linien kombinieren. Komplexe Formen, die nur aus geraden Linien bestehen, können als <polyline>
-Elemente erstellt werden. Während <polyline>
- und <path>
-Elemente ähnliche Formen erzeugen können, erfordern <polyline>
-Elemente viele kleine gerade Linien, um Kurven zu simulieren, und skalieren nicht gut auf größere Größen.
Ein gutes Verständnis von Pfaden ist wichtig beim Zeichnen von SVGs. Während das Erstellen komplexer Pfade mit einem XML-Editor oder Texteditor nicht empfohlen wird, ermöglicht das Verständnis, wie sie funktionieren, das Erkennen und Beheben von Darstellungsproblemen in SVGs.
Die Form eines <path>
-Elements wird durch einen Parameter definiert: d
. (Mehr dazu in Grundformen.) Das d
-Attribut enthält eine Reihe von Befehlen und Parametern, die von diesen Befehlen verwendet werden.
Jeder der Befehle wird durch einen bestimmten Buchstaben instanziiert (z.B. durch das Erstellen einer Klasse, Benennen und Lokalisieren dieser). Zum Beispiel bewegen wir uns zu den x- und y-Koordinaten (10
, 10
). Der "Move to"-Befehl wird mit dem Buchstaben M
aufgerufen. Wenn der Parser auf diesen Buchstaben stößt, weiß er, dass er zu einem Punkt wechseln muss. Um also zu (10
, 10
) zu wechseln, würde der zu verwendende Befehl M 10 10
lauten. Danach beginnt der Parser mit dem Lesen des nächsten Befehls.
Alle Befehle existieren auch in zwei Varianten. Ein Großbuchstabe gibt absolute Koordinaten auf der Seite an, und ein Kleinbuchstabe gibt relative Koordinaten an (z.B. bewege dich 10px nach oben und 7px nach links vom letzten Punkt aus).
Koordinaten im d
-Parameter sind immer einheistlos und befinden sich im Benutzerkoordinatensystem. Später werden wir lernen, wie Pfade transformiert werden können, um anderen Bedürfnissen gerecht zu werden.
Linien-Befehle
Es gibt fünf Linien-Befehle für <path>
-Knoten. Der erste Befehl ist der "Move To" oder M
, der oben beschrieben wurde. Er nimmt zwei Parameter, eine Koordinate (x
) und eine Koordinate (y
), um dorthin zu wechseln. Wenn sich der Cursor bereits irgendwo auf der Seite befindet, wird keine Linie gezeichnet, um die beiden Positionen zu verbinden. Der "Move To"-Befehl erscheint am Anfang von Pfaden, um anzugeben, wo die Zeichnung beginnen soll. Zum Beispiel:
M x y (or) m dx dy
Im folgenden Beispiel gibt es nur einen Punkt bei (10
, 10
). Beachten Sie jedoch, dass er nicht angezeigt würde, wenn ein Pfad einfach normal gezeichnet würde. Zum Beispiel:
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
<path d="M10 10" />
</svg>
Es gibt drei Befehle, die Linien zeichnen. Der allgemeinste ist der "Line To"-Befehl, der mit L
aufgerufen wird. L
nimmt zwei Parameter—x- und y-Koordinaten—und zeichnet eine Linie von der aktuellen Position zu einer neuen Position.
L x y (or) l dx dy
Es gibt zwei abgekürzte Formen zum Zeichnen horizontaler und vertikaler Linien. H
zeichnet eine horizontale Linie und V
zeichnet eine vertikale Linie. Beide Befehle nehmen nur einen Parameter, da sie sich nur in eine Richtung bewegen.
H x (or) h dx V y (or) v dy
Ein einfacher Einstieg ist das Zeichnen einer Form. Wir beginnen mit einem Rechteck (derselbe Typ, der einfacher mit einem <rect>
-Element erstellt werden könnte). Es besteht nur aus horizontalen und vertikalen Linien.
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
<path d="M 10 10 H 90 V 90 H 10 L 10 10" />
</svg>
Wir können die obige Pfaderklärung ein wenig verkürzen, indem wir den "Close Path"-Befehl verwenden, der mit Z
aufgerufen wird. Dieser Befehl zeichnet eine gerade Linie von der aktuellen Position zurück zum ersten nicht geschlossenen Punkt (erster Punkt nach dem letzten Z
-Befehl, wenn es einen gibt, oder der erste Punkt im Pfad anderweitig) und schließt den Pfad mit einem Linienabschnitt. Er wird häufig am Ende eines Pfad-Knotens platziert, aber nicht immer. Es gibt keinen Unterschied zwischen dem Groß- und Kleinbuchstaben-Befehl.
Z (or) z
Unser obiger Pfad könnte also verkürzt werden zu:
<path d="M 10 10 H 90 V 90 H 10 Z" fill="transparent" stroke="black" />
Die relativen Formen dieser Befehle können ebenfalls verwendet werden, um dasselbe Bild zu zeichnen. Relative Befehle werden durch Verwendung von Kleinbuchstaben aufgerufen und bewegen den Cursor relativ zu seiner letzten Position statt zu einer exakten Koordinate. Zum Beispiel, da unser Rechteck 80×80 groß ist, könnte das <path>
-Element wie folgt geschrieben werden:
<path d="M 10 10 h 80 v 80 h -80 Z" fill="transparent" stroke="black" />
Der Pfad wird zum Punkt (10
, 10
) gehen und sich dann horizontal 80 Punkte nach rechts bewegen, dann 80 Punkte nach unten, dann 80 Punkte nach links und dann zurück zum Anfang.
In diesen Beispielen wäre es wahrscheinlich intuitiver, die <polygon>
- oder <polyline>
-Elemente zu verwenden. Da Pfade jedoch so häufig beim Zeichnen von SVGs verwendet werden, fühlen sich Entwickler möglicherweise wohler, sie anstelle dessen zu verwenden. Es gibt keinen wirklichen Leistungsnachteil oder Vorteil bei der Verwendung des einen oder anderen.
Kurven-Befehle
Es gibt drei verschiedene Befehle, die verwendet werden können, um glatte Kurven zu erzeugen. Zwei dieser Kurven sind Bézierkurven, und die dritte ist ein "Bogen" oder ein Teil eines Kreises. Sie haben möglicherweise bereits praktische Erfahrungen mit Bézierkurven mit Pfadwerkzeugen in Inkscape, Illustrator oder Photoshop gesammelt. Es gibt eine unendliche Anzahl von Bézierkurven, aber nur zwei stehen in <path>
-Elementen zur Verfügung: eine kubische, die mit C
aufgerufen wird, und eine quadratische, die mit Q
aufgerufen wird.
Bézierkurven
Die kubische Kurve, C
, ist die etwas komplexere Kurve. Kubische Béziers benötigen zwei Kontrollpunkte für jeden Punkt. Daher müssen zur Erstellung einer kubischen Bézier drei Koordinatensätze angegeben werden.
C x1 y1, x2 y2, x y (or) c dx1 dy1, dx2 dy2, dx dy
Der letzte Koordinatensatz hier (x
, y
) gibt an, wo die Linie enden soll. Die anderen beiden sind Kontrollpunkte. (x1
, y1
) ist der Kontrollpunkt für den Start der Kurve, und (x2
, y2
) ist der Kontrollpunkt für das Ende. Die Kontrollpunkte beschreiben im Wesentlichen die Steigung der Linie, die an jedem Punkt beginnt. Die Bézier-Funktion erzeugt dann eine glatte Kurve, die sich von der zu Beginn der Linie festgelegten Steigung zur Steigung am anderen Ende überträgt.
<svg width="190" height="160" xmlns="http://www.w3.org/2000/svg">
<path d="M 10 10 C 20 20, 40 20, 50 10" stroke="black" fill="transparent" />
<path d="M 70 10 C 70 20, 110 20, 110 10" stroke="black" fill="transparent" />
<path
d="M 130 10 C 120 20, 180 20, 170 10"
stroke="black"
fill="transparent" />
<path d="M 10 60 C 20 80, 40 80, 50 60" stroke="black" fill="transparent" />
<path d="M 70 60 C 70 80, 110 80, 110 60" stroke="black" fill="transparent" />
<path
d="M 130 60 C 120 80, 180 80, 170 60"
stroke="black"
fill="transparent" />
<path
d="M 10 110 C 20 140, 40 140, 50 110"
stroke="black"
fill="transparent" />
<path
d="M 70 110 C 70 140, 110 140, 110 110"
stroke="black"
fill="transparent" />
<path
d="M 130 110 C 120 140, 180 140, 170 110"
stroke="black"
fill="transparent" />
</svg>
Das obige Beispiel erstellt neun kubische Bézierkurven. Während sich die Kurven nach rechts bewegen, werden die Kontrollpunkte horizontal weiter auseinandergezogen. Während sich die Kurven nach unten bewegen, werden sie weiter von den Endpunkten entfernt. Hier ist zu beachten, dass die Kurve in die Richtung des ersten Kontrollpunkts beginnt und sich dann so biegt, dass sie in der Richtung des zweiten Kontrollpunkts ankommt.
Mehrere Bézierkurven können hintereinander gereiht werden, um erweiterte, glatte Formen zu erstellen. Oft wird der Kontrollpunkt auf einer Seite eines Punktes eine Spiegelung des auf der anderen Seite verwendeten Kontrollpunkts sein, um die Steigung konstant zu halten. In diesem Fall kann eine Abkürzungsversion der kubischen Bézier verwendet werden, die durch den Befehl S
(oder s
) bezeichnet wird.
S x2 y2, x y (or) s dx2 dy2, dx dy
S
erzeugt denselben Kurventyp wie zuvor – aber wenn es einem anderen S
-Befehl oder einem C
-Befehl folgt, wird der erste Kontrollpunkt als Spiegelbild des zuvor verwendeten angesehen. Wenn der S
-Befehl keinem anderen S
- oder C
-Befehl folgt, wird die aktuelle Position des Cursors als erster Kontrollpunkt verwendet. Das Ergebnis ist nicht dasselbe wie das, was der Q
-Befehl mit denselben Parametern produziert hätte, es ist jedoch ähnlich.
Ein Beispiel für diese Syntax ist unten gezeigt, und auf der Abbildung links werden die angegebenen Kontrollpunkte in Rot und der abgeleitete Kontrollpunkt in Blau angezeigt.
<svg width="190" height="160" xmlns="http://www.w3.org/2000/svg">
<path
d="M 10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80"
stroke="black"
fill="transparent" />
</svg>
Der andere Typ der Bézierkurve, die quadratische Kurve, die mit Q
aufgerufen wird, ist tatsächlich eine einfachere Kurve als die kubische. Sie erfordert einen Kontrollpunkt, der die Steigung der Kurve sowohl am Start- als auch am Endpunkt bestimmt. Es nimmt zwei Parameter: den Kontrollpunkt und den Endpunkt der Kurve.
Hinweis:
Die Koordinatendifferenzen für q
sind beide relativ zum vorherigen Punkt (das heißt, dx
und dy
sind nicht relativ zu dx1
und dy1
).
Q x1 y1, x y (or) q dx1 dy1, dx dy
<svg width="190" height="160" xmlns="http://www.w3.org/2000/svg">
<path d="M 10 80 Q 95 10 180 80" stroke="black" fill="transparent" />
</svg>
Wie bei der kubischen Bézierkurve gibt es eine Abkürzung, um mehrere quadratische Béziers aneinanderzureihen, die mit T
aufgerufen wird.
T x y (or) t dx dy
Diese Abkürzung betrachtet den zuvor verwendeten Kontrollpunkt und leitet daraus einen neuen ab. Dies bedeutet, dass nach dem ersten Kontrollpunkt ziemlich komplexe Formen hergestellt werden können, indem nur Endpunkte angegeben werden.
Dies funktioniert nur, wenn der vorherige Befehl ein Q
- oder ein T
-Befehl war. Andernfalls wird angenommen, dass der Kontrollpunkt derselbe wie der vorherige Punkt ist, und es werden nur Linien gezeichnet.
<svg width="190" height="160" xmlns="http://www.w3.org/2000/svg">
<path
d="M 10 80 Q 52.5 10, 95 80 T 180 80"
stroke="black"
fill="transparent" />
</svg>
Beide Kurven erzeugen ähnliche Ergebnisse, obwohl die kubische größere Freiheit darüber bietet, wie genau die Kurve aussieht. Die Entscheidung, welche Kurve verwendet werden soll, ist situationsabhängig und hängt von der Symmetrie ab, die die Linie hat.
Bögen
Der andere Typ der gekrümmten Linie, die mit SVG erstellt werden kann, ist der Bogen, der mit dem A
-Befehl aufgerufen wird. Bögen sind Abschnitte von Kreisen oder Ellipsen.
Für einen gegebenen x-Radius und y-Radius gibt es zwei Ellipsen, die zwei beliebige Punkte verbinden können (solange sie innerhalb des Radius des Kreises liegen). Entlang einer dieser Kreise gibt es zwei mögliche Pfade, die genommen werden können, um die Punkte zu verbinden – in jeder Situation stehen also vier mögliche Bögen zur Verfügung.
Aufgrund dessen erfordern Bögen ziemlich viele Parameter:
A rx ry x-axis-rotation large-arc-flag sweep-flag x y a rx ry x-axis-rotation large-arc-flag sweep-flag dx dy
Zu Beginn nimmt das Bogenelement zwei Parameter für den x-Radius und den y-Radius an. Bei Bedarf sehen Sie sich <ellipse>
s und deren Verhalten an. Die letzten beiden Parameter geben die x- und y-Koordinaten an, um den Strich zu beenden. Diese vier Werte definieren gemeinsam die Grundstruktur des Bogens.
Der dritte Parameter beschreibt die Rotation des Bogens. Dies lässt sich am besten mit einem Beispiel erklären:
<svg width="320" height="320" xmlns="http://www.w3.org/2000/svg">
<path
d="M 10 315
L 110 215
A 30 50 0 0 1 162.55 162.45
L 172.55 152.45
A 30 50 -45 0 1 215.1 109.9
L 315 10"
stroke="black"
fill="green"
stroke-width="2"
fill-opacity="0.5" />
</svg>
Das Beispiel zeigt ein <path>
-Element, das diagonal über die Seite verläuft. In seiner Mitte wurden zwei elliptische Bögen ausgeschnitten (x-Radius = 30
, y-Radius = 50
). Im ersten wurde die x-Achsen-Rotation bei 0
belassen, sodass die Ellipse, um die der Bogen verläuft (in Grau gezeigt), gerade nach oben und unten ausgerichtet ist. Für den zweiten Bogen hingegen ist die x-Achsen-Rotation auf -45
Grad eingestellt. Dies dreht die Ellipse so, dass sie mit ihrer Nebenachse in Pfadrichtung ausgerichtet ist, wie durch die zweite Ellipse im Beispielbild gezeigt.
Für die ungedrehte Ellipse im obigen Bild gibt es nur zwei verschiedene Bögen und nicht vier zur Auswahl, da die Linie, die von Anfang bis Ende des Bogens gezogen wird, durch die Mitte der Ellipse verläuft. In einem leicht veränderten Beispiel können die beiden Ellipsen gesehen werden, die die vier verschiedenen Bögen bilden:
<svg xmlns="http://www.w3.org/2000/svg" width="320" height="320">
<path
d="M 10 315
L 110 215
A 36 60 0 0 1 150.71 170.29
L 172.55 152.45
A 30 50 -45 0 1 215.1 109.9
L 315 10"
stroke="black"
fill="green"
stroke-width="2"
fill-opacity="0.5" />
</svg>
Beachten Sie, dass jede der blauen Ellipsen aus zwei Bögen besteht, je nachdem, ob im Uhrzeigersinn oder gegen den Uhrzeigersinn gefahren wird. Jede Ellipse hat einen kurzen und einen langen Bogen. Die beiden Ellipsen sind einfach Spiegelbilder voneinander. Sie sind entlang der Linie, die von den Start→End-Punkten gebildet wird, gespiegelt.
Wenn die Start→End-Punkte weiter von einander entfernt liegen, als der x
- und y
-Radius der Ellipse erreichen kann, werden die Radien der Ellipse minimal erweitert, damit sie die Start→End-Punkte erreichen kann. Das interaktive Codepen am Ende dieser Seite zeigt dies gut. Um zu bestimmen, ob die Radien einer Ellipse groß genug sind, um erweitert werden zu müssen, müsste ein Gleichungssystem gelöst werden, wie z.B. dies auf Wolfram Alpha. Diese Berechnung bezieht sich auf die nicht gedrehte Ellipse mit Start→Ende (110
, 215
)→(150.71
, 170.29
). Die Lösung, (x
, y
), ist das Zentrum der Ellipse(n). Die Lösung wird imaginär, wenn die Radien der Ellipse zu klein sind. Diese zweite Berechnung bezieht sich auf die nicht gedrehte Ellipse mit Start→Ende (110
, 215
)→(162.55
, 162.45
). Die Lösung hat eine geringe imaginäre Komponente, da die Ellipse nur minimal erweitert wurde.
Die vier oben genannten verschiedenen Pfade werden durch die nächsten beiden Parameter-Flags bestimmt. Wie bereits erwähnt, gibt es immer noch zwei mögliche Ellipsen, um die herum der Pfad verlaufen kann, und zwei verschiedene mögliche Pfade auf beiden Ellipsen, was vier mögliche Pfade ergibt. Der erste Parameter ist das large-arc-flag
. Es bestimmt, ob der Bogen größer oder kleiner als 180 Grad sein soll; letztlich bestimmt dieses Flag, in welche Richtung der Bogen um einen gegebenen Kreis verlaufen wird. Der zweite Parameter ist das sweep-flag
. Es bestimmt, ob der Bogen positiv oder negativ verlaufende Winkel beginnen soll, was im Wesentlichen auswählt, um welchen der beiden Kreise herum gegangen wird. Das folgende Beispiel zeigt alle vier möglichen Kombinationen zusammen mit den beiden Kreisen für jeden Fall.
<svg width="360" height="360" xmlns="http://www.w3.org/2000/svg">
<path
d="M 100 100
A 45 45, 0, 0, 0, 145 145
L 145 100 Z"
fill="#00FF00A0"
stroke="black"
stroke-width="2" />
<path
d="M 250 100
A 45 45, 0, 1, 0, 295 145
L 295 100 Z"
fill="#FF0000A0"
stroke="black"
stroke-width="2" />
<path
d="M 100 250
A 45 45, 0, 0, 1, 145 295
L 145 250 Z"
fill="#FF00FFA0"
stroke="black"
stroke-width="2" />
<path
d="M 250 250
A 45 45, 0, 1, 1, 295 295
L 295 250 Z"
fill="#0000FFA0"
stroke="black"
stroke-width="2" />
<path
d="M 45 45 L 345 45 L 345 345 L 45 345 Z M 195 45 L 195 345 M 45 195 L 345 195"
fill="none"
stroke="black" />
<text x="140" y="20" font-size="20" fill="black">Large arc flag</text>
<text
x="-15"
y="195"
font-size="20"
fill="black"
transform="rotate(-90)"
transform-origin="20 195">
Sweep flag
</text>
<text x="120" y="40" font-size="20" fill="black">0</text>
<text x="270" y="40" font-size="20" fill="black">1</text>
<text x="30" y="120" font-size="20" fill="black">0</text>
<text x="30" y="270" font-size="20" fill="black">1</text>
</svg>
Bögen sind eine einfache Möglichkeit, Teile von Kreisen oder Ellipsen in Zeichnungen zu erstellen. Ein Tortendiagramm würde beispielsweise einen anderen Bogen für jedes Stück erfordern.
Beim Übergang von <canvas>
zu SVG können Bögen das Schwierigste sein, was man lernen muss, aber sie sind auch viel mächtiger. Volle Kreise und Ellipsen sind die einzigen Formen, die SVG-Bögen Schwierigkeiten beim Zeichnen haben. Da die Start- und Endpunkte für jeden Pfad, der um einen Kreis verläuft, derselbe Punkt sind, gibt es eine unendliche Anzahl von Kreisen, die gewählt werden könnten, und der tatsächlich Pfad ist nicht definiert. Es ist möglich, sie zu approximieren, indem die Start- und Endpunkte des Pfades leicht verschoben werden und dann ein weiterer Pfadabschnitt hinzugefügt wird. Zum Beispiel ist es möglich, einen Kreis mit einem Bogen für jeden Halbkreis zu erstellen. An diesem Punkt ist es oft einfacher, einen echten <circle>
- oder <ellipse>
-Knoten zu verwenden. Dieses interaktive Demo könnte helfen, die Konzepte hinter SVG-Bögen zu verstehen.