Abschnitt 2
Pfade, Gruppen und Transformationen
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 einemMoveToist das einLineTo. 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 xundV y- Zeichnen eine waagrechte beziehungsweise senkrechte Linie. Es braucht nur eine Koordinate, die andere bleibt unverändert.
Beispiel
Beispiel
Pfad schliessen
Der Befehl closePath schliesst den aktuellen Pfad.
Z- Schliesst den aktuellen Pfad.
Beispiel
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».
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
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 zuTbei den quadratischen Kurven. cunds- Analog mit relativen Koordinaten.
Beispiel
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.
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.
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
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
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
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
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
Übungen
Zeichnen Sie ein grün gefülltes Sechseck mit violettem Rand.
Lösungsvorschlag
Zeichnen Sie einen fünfzackigen rot gefüllten Stern.
Lösungsvorschlag
Erstellen Sie die folgende SVG-Grafik.
Hinweis
Verwenden Sie Bézierkurven.
Lösungsvorschlag
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.
Lösungsvorschlag
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.
Lösungsvorschlag
Zeichnen Sie eine Verkehrsampel. Die drei Lampen sollen ihre gemeinsamen Attribute von einer Gruppe erben.
Lösungsvorschlag
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
- Listing 10 auf dieser Seite.
- w3schools, SVG-Transformationen
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.
Lösungsvorschlag
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.
Lösungsvorschlag
Erstellen Sie das Bild der Schnittmenge von zwei Kreisen.
Lösungsvorschlag
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.