SVG Vektorgrafik

Abschnitt 2

Pfade, Gruppen und Transformationen

0 von 12 Übungen erledigt

Pfade

Neben den Grundformen gibt es noch das sogenannte Pfad-Objekt <path>. Dieses ist sehr vielfältig einsetzbar und es lassen sich damit unter anderem alle Grundformen aus Abschnitt 1 auch als Pfad erzeugen. Ein Pfad ist durch ein einziges Attribut definiert.

d
Eine Liste von Punkten und anderen Informationen darüber, wie der Pfad gezeichnet werden soll.

Sie können sich einen Pfad als Anleitung für einen Zeichenstift vorstellen: Der Stift wird an eine Stelle gesetzt und dann Stück für Stück über das Papier geführt. Jeder Befehl beginnt mit einem Buchstaben. Ein grosser Buchstabe bedeutet dabei immer absolute Koordinaten, ein kleiner Buchstabe relative Koordinaten — also die Verschiebung gegenüber der aktuellen Position des Stiftes.

MoveTo und LineTo

Der MoveTo-Befehl erlaubt es, den virtuellen Zeichenstift an eine beliebige Position zu setzen.

M x,y
Setzt die Position des Stiftes auf die Position (x, y).
m x,y
Setzt die Position des Stiftes von der aktuellen Position aus x Einheiten nach rechts und y Einheiten nach unten. Man spricht hier von relativen Koordinaten.

Der Befehl LineTo erlaubt es, geradlinige Striche zu malen.

L x,y
Zeichnet von der aktuellen Position des Stiftes eine gerade Linie bis zum Punkt (x, y).
x,y
Eine Abkürzung für L x,y. Wird kein Steuerbefehl vor den Koordinaten eines Punktes angegeben, wird der letzte Befehl wiederholt; nach einem MoveTo ist das ein LineTo.
l dx,dy
Zeichnet von der aktuellen Position aus eine geradlinige Linie um dx Einheiten nach rechts und dy Einheiten nach unten. (relative Koordinaten)
H x und V y
Zeichnen eine waagrechte beziehungsweise senkrechte Linie. Es braucht nur eine Koordinate, die andere bleibt unverändert.

Beispiel


							
Listing 1. MoveTo- und LineTo-Befehl (lineto.svg)
Zwei Striche: Der zweite nutzt die Abkürzung ohne Buchstaben.

Beispiel


							
Listing 2. MoveTo- und LineTo-Befehl mit relativen Koordinaten (lineto-relative.svg)
Derselbe Aufbau, aber mit kleinen Buchstaben: Die Zahlen sind jetzt Verschiebungen.

Pfad schliessen

Der Befehl closePath schliesst den aktuellen Pfad.

Z
Schliesst den aktuellen Pfad.

Beispiel


							
Listing 3. Pfad schliessen (closepath.svg)
Der Pfad zeichnet nur zwei Seiten — das Z ergänzt die dritte und macht das Dreieck füllbar.

Quadratische Bézierkurven

Quadratische Bézierkurven sind Kurven, die durch zwei gegebene Punkte verlaufen und die durch einen Kontrollpunkt beeinflusst werden. Man kann sich das so vorstellen, dass die geradlinige Verbindung zwischen den gegebenen Punkten «in Richtung» des Kontrollpunkts gezogen wird. Wie dies mathematisch genau funktioniert, ist hier nicht unser Thema — Genaueres finden Sie zum Beispiel bei Martin Janecke, «Quadratische Funktion → Bézierkurve».

Drei Beispiele von quadratischen Bézierkurven. Die dünnen Linien gehören nicht zur Kurve; sie zeigen nur, wo der Kontrollpunkt liegt. Der Kontrollpunkt muss nicht zwischen den beiden Punkten liegen.
Q xc yc x y
Verbindet die aktuelle Position mit dem Punkt (x, y) mit einer quadratischen Bézierkurve mit dem Kontrollpunkt (xc, yc).
q xc yc x y
Analog mit relativen Koordinaten.
T x y
Verbindet die aktuelle Position mit dem Punkt (x, y) mit einer quadratischen Bézierkurve. Falls das letzte Stück des Pfades auch eine quadratische Bézierkurve ist, wird der letzte Kontrollpunkt an der aktuellen Position gespiegelt und das Resultat als Kontrollpunkt verwendet. Andernfalls wird die aktuelle Position selbst als Kontrollpunkt benutzt.
t x y
Analog mit relativen Koordinaten.

Der Befehl T ist genau das, was wir für eine «Wellenlinie» brauchen: Jedes neue Stück setzt die Kurve glatt fort, ohne dass wir den Kontrollpunkt erneut ausrechnen müssen.

Beispiel


							
Listing 4. Pfad (path.svg)
Ein q und zwei t ergeben eine Wellenlinie aus drei Bögen.

Pierre Bézier (1910–1999) entwickelte diese Kurven bei Renault für den Autobau.

Kubische Bézierkurven

Neben den quadratischen gibt es auch kubische Bézierkurven. Diese funktionieren ähnlich, verwenden aber zwei Kontrollpunkte — einen für jedes Ende der Kurve. Damit lassen sich Formen zeichnen, die sich unterwegs in die andere Richtung krümmen, was mit einer quadratischen Kurve nicht möglich ist.

C x1 y1 x2 y2 x y
Verbindet die aktuelle Position mit dem Punkt (x, y). Dabei ist (x1, y1) der Kontrollpunkt für den Anfang und (x2, y2) derjenige für das Ende der Kurve.
S x2 y2 x y
Wie C, aber der erste Kontrollpunkt wird gespiegelt — analog zu T bei den quadratischen Kurven.
c und s
Analog mit relativen Koordinaten.

Beispiel


							
Listing 5. Kubische Bézierkurve (cubic-bezier.svg)
Beide Kontrollpunkte liegen oben: Die Kurve startet und endet senkrecht.

Elliptische Bögen

Mit dem Befehl A (beziehungsweise a) lassen sich Kreis- und Ellipsenbögen zeichnen. Das ist der Befehl mit den meisten Parametern, denn durch zwei Punkte und zwei Radien sind immer vier verschiedene Bögen möglich; zwei Schalter wählen den gewünschten aus.

A rx ry phi lf sf x y
Zeichnet von der aktuellen Position aus einen elliptischen Bogen bis zum Punkt (x, y).
rx
Die Länge der horizontalen Halbachse.
ry
Die Länge der vertikalen Halbachse.
phi
Der Winkel, um den die Ellipse gedreht ist. Für einen Kreisbogen spielt er keine Rolle, wir setzen ihn dann auf 0.
lf
Das large-arc-flag. Mit 1 wird der längere der beiden möglichen Bögen gezeichnet, mit 0 der kürzere.
sf
Das sweep-flag. Es bestimmt, auf welcher Seite der Verbindungslinie der Bogen liegt.
Wirkung des sweep-flags: Beide Bögen haben dieselben Endpunkte und denselben Radius.
Wirkung des large-arc-flags: der kürzere und der längere der beiden Bögen.

Ein häufiger Anwendungsfall ist ein Kreissektor, also ein «Tortenstück»: Vom Mittelpunkt mit L an den Rand, mit A entlang des Kreises und mit Z zurück zum Mittelpunkt.

Befehl Bedeutung
M x y Stift an (x, y) setzen, ohne zu zeichnen
L x y Gerade Linie nach (x, y)
H x Waagrechte Linie
V y Senkrechte Linie
Q xc yc x y Quadratische Bézierkurve
T x y Quadratische Bézierkurve, Kontrollpunkt gespiegelt
C x1 y1 x2 y2 x y Kubische Bézierkurve
S x2 y2 x y Kubische Bézierkurve, Kontrollpunkt gespiegelt
A rx ry phi lf sf x y Elliptischer Bogen
Z Pfad schliessen

Übersicht über die Pfadbefehle. Der kleine Buchstabe bedeutet jeweils dasselbe mit relativen Koordinaten.

Bemerkung

Es empfiehlt sich, wenn immer sinnvoll, mit relativen Koordinaten zu arbeiten. So wird es zum Beispiel wesentlich einfacher, einen ganzen Pfad zu verschieben.


							
Listing 6. Mehrmals die gleiche verschobene Kurve (translate.svg)
Nur die vier M-Befehle unterscheiden sich — der Rest der Kurve ist viermal derselbe Text.

Gruppieren und Transformieren

Sobald eine Zeichnung aus mehr als ein paar Formen besteht, möchten wir mehrere Formen gemeinsam behandeln. Dafür gibt es das <g>-Tag (für group). Attribute, die wir an der Gruppe setzen, gelten für alle Formen darin — wir müssen sie also nur einmal schreiben. Setzt eine Form das Attribut selbst, gewinnt die Form.

Beispiel


							
Listing 7. Gemeinsame Attribute für eine Gruppe (group.svg)
Alle drei Formen erben Füllung, Randfarbe und Randbreite von der Gruppe.

Der eigentliche Grund für Gruppen ist aber das Attribut transform. Damit verschieben, drehen und skalieren wir eine Form oder eine ganze Gruppe, ohne alle Koordinaten neu ausrechnen zu müssen:

translate(dx, dy)
Verschiebt um dx nach rechts und dy nach unten.
rotate(winkel)
Dreht um den Ursprung (0, 0). Der Winkel wird in Grad angegeben, und weil die y-Achse nach unten zeigt, dreht ein positiver Winkel im Uhrzeigersinn. Mit rotate(winkel, cx, cy) drehen wir stattdessen um den Punkt (cx, cy).
scale(faktor)
Streckt vom Ursprung aus. Mit scale(fx, fy) können wir in x- und y-Richtung unterschiedlich strecken.

Beispiel


							
Listing 8. Verschieben, drehen und skalieren (transform.svg)
Viermal dasselbe Rechteck: unverändert (grau), verschoben (rot), verschoben und gedreht (blau), verschoben und gestreckt (grün).

Bemerkung

Schreiben wir mehrere Transformationen in ein Attribut, so werden sie von rechts nach links angewendet. Bei transform="translate(100,0) rotate(45)" wird also zuerst gedreht und dann verschoben. Das ist etwas anderes als zuerst verschieben und dann drehen — probieren Sie es aus! Mehr dazu finden Sie bei w3schools, SVG-Transformationen.

Einzelne Elemente benennen und nutzen

Bilder bestehen oft aus mehreren gleichen oder mindestens ähnlichen Teilen. Es ist daher sinnvoll, wenn wir gewisse Objekte mit einem Namen versehen und diese dann wiederverwenden.

Wir können dazu, wie in HTML, einzelne Objekte mit einer ID versehen und diese dann wieder verwenden. Dafür verwenden wir das Tag <use>.

Als Beispiel ist hier eine entsprechende Variante der Grafik von Listing 6.

Beispiel


							
Listing 9. Kurve mehrmals benutzen (translate-improved.svg)
Dasselbe Bild wie vorher — die Kurve steht aber nur noch einmal im Code.

In den meisten Fällen ist es jedoch ratsam, zunächst einen Prototyp des betreffenden Objektes zu erstellen, welcher anschliessend in einem zweiten Schritt gezeichnet wird, sobald das Objekt aufgerufen und mit Attributen ergänzt wird.

Für die Umsetzung der obigen Anforderungen ist das <defs>-Tag erforderlich. Dieses ermöglicht die Definition von Objekten sowie deren Benennung, wobei eine direkte Zeichnung erst nach Aufruf der Objekte mittels des <use>-Tags erfolgt. Bei Aufruf können zudem zusätzliche Optionen angegeben werden.

Beispiel


							
Listing 10. Objekte vordefinieren (defs-example.svg)
Ein Dreieck, dreimal benutzt: verschoben, gedreht und je in einer anderen Farbe.

Ein <use>-Tag versteht neben transform auch die Attribute x und y. Diese verschieben die Kopie — was Sie sich als abgekürztes translate merken können.

Clipping

Clipping ist eine Methode, bei der man einen Teil des Bildes zeigt und den Rest versteckt. Diese Methode wird oft bei Profilbildern verwendet. Dabei wird das Bild mit einem Kreis überlagert. Nur der Teil, der innerhalb des Kreises liegt, wird angezeigt. Man sagt dazu auch masking. Das wird aber mehr bei Rastergrafiken verwendet, weil die Maske dort sagt, welche Pixel gezeichnet werden und welche nicht. Bei Vektorgrafiken wird geometrisch bestimmt, was gezeichnet wird. Deshalb spricht man dort von Clipping.

Um dies zu bewerkstelligen, nutzen wir das <clipPath>-Tag und versehen es mit einer ID. Diese ID geben wir anschliessend dem Objekt, das beschnitten werden soll, im Attribut clip-path mit — und zwar in der Form clip-path="url(#meine-id)".

Beispiel


							
Listing 11. Beispiel von Clipping (clipping-example.svg)
Der blaue Umriss zeigt das ganze Dreieck; rot gefüllt ist nur der Teil innerhalb des Kreises.

Übungen

Erstellen Sie die folgende SVG-Grafik.

Das Ziel.
Lösungsvorschlag

									
Lösungsvorschlag (stairs.svg)

Zeichnen Sie ein grün gefülltes Sechseck mit violettem Rand.

Das Ziel.
Lösungsvorschlag

									
Lösungsvorschlag (hexagon.svg)

Zeichnen Sie einen fünfzackigen rot gefüllten Stern.

Das Ziel.
Lösungsvorschlag

									
Lösungsvorschlag (star.svg)

Erstellen Sie die folgende SVG-Grafik.

Hinweis

Verwenden Sie Bézierkurven.

Das Ziel.
Lösungsvorschlag

									
Lösungsvorschlag (eight.svg)

Zeichnen Sie ein Herz mit kubischen Bézierkurven.

Hinweis

Beginnen Sie unten an der Spitze und arbeiten Sie sich über die linke Seite nach oben. Eine Hälfte besteht aus zwei Kurven.

Das Ziel.
Lösungsvorschlag

									
Lösungsvorschlag (heart.svg)

Zeichnen Sie ein Kreisdiagramm mit den drei Anteilen 50 %, 25 % und 25 %.

Hinweis

Jedes Tortenstück ist ein eigener Pfad aus einer Linie, einem Bogen und Z. Überlegen Sie zuerst, wo die Grenzen zwischen den Sektoren auf dem Kreis liegen.

Das Ziel.
Lösungsvorschlag

									
Lösungsvorschlag (pie-chart.svg)

Zeichnen Sie eine Verkehrsampel. Die drei Lampen sollen ihre gemeinsamen Attribute von einer Gruppe erben.

Das Ziel.
Lösungsvorschlag

									
Lösungsvorschlag (traffic-light.svg)

Erstellen Sie eine SVG-Grafik, in der Sie ein Dreieck mit Hilfe des <defs>-Tags definieren und 4-mal in verschiedenen Farben wiederverwenden. Die Dreiecke sollen alle verschoben und rotiert sein.

Hinweis

Zeichnen Sie eine Blume mit sechs gleichen Blütenblättern. Definieren Sie ein Blütenblatt genau einmal und drehen Sie die Kopien um die Blütenmitte.

Hinweis

Legen Sie die Blütenmitte in den Ursprung. Dann dreht rotate von sich aus um den richtigen Punkt.

Das Ziel.
Lösungsvorschlag

									
Lösungsvorschlag (flower.svg)

Zeichnen Sie die olympischen Ringe. Definieren Sie dazu einen Ring genau einmal und verwenden Sie ihn fünf Mal mit unterschiedlicher Farbe.

Hinweis

Ein Ring ist ein Kreis mit fill="none". Die Farbe geben Sie erst beim <use>-Tag an.

Das Ziel.
Lösungsvorschlag

									
Lösungsvorschlag (olympic-rings.svg)

Erstellen Sie das Bild der Schnittmenge von zwei Kreisen.

Das Ziel.
Lösungsvorschlag

									
Lösungsvorschlag (circle-intersection.svg)

Zeichnen Sie fünf farbige waagrechte Streifen und beschneiden Sie diese so, dass nur der Teil innerhalb eines Sterns sichtbar bleibt. Der Stern soll zusätzlich mit einer schwarzen Umrisslinie versehen sein.

Hinweis

Definieren Sie den Stern in einem <defs>-Tag. So können Sie ihn sowohl im <clipPath> als auch für den Umriss verwenden.

Das Ziel.
Lösungsvorschlag

									
Lösungsvorschlag (star-stripes.svg)