Platzhalter

 
Platzhalter PlatzhalterPlatzhalter

Grafikpfade in SVG

Platzhalter
 
  Startseite
  eBook-Projekt
  Web-Lexikon
  Bücher bestellen
   
  Design-Theorie
  Design-Praxis
  Promotion
  HTML/XML-Praxis
  Projekt-Management
  Webmaster-Praxis
  Fragen & Antworten
  Technik-Ecke
   
  Portal/Links
  Buch-Rezensionen
  Software
  Impressum
PlatzhalterPlatzhalter







 

Platzhalter SVG bietet eine stattliche Anzahl vordefinierter Grafikobjekte: Rechtecke, Quadrate, Kreise und viele mehr. Wenn Sie jedoch ein komplexes Objekt darstellen wollen, kann das mit den vordefinierten Bauteilen ein mühsames oder sogar unmögliches Unterfangen werden. Deshalb gibt es in SVG noch eine weitere Möglichkeit, Formen zu definieren: die Pfade.

Was sind Pfade?


Pfade bestehen aus einer Anzahl verschiedener Anweisungen. Diese Anweisungen geben an, wohin der Zeichen-Cursor sich bewegen soll und was er dabei tun. Pfade sind also vergleichbar mit einer Art Zeichenanweisungen für einen Stift: z.B. "Gehe nach links oben. Zeichne nun eine 10cm lange Linie nach rechts. Gehe nun 3 cm nach unten und zeichne noch eine solche Linie". Kennt übrigens noch jemand die Programmiersprache LOGO? Das Igel-Konzept dort ist nämlich sehr ähnlich.

Die einzelnen Anweisungen bestehen aus einem Buchstaben, der ihre Funktion kennzeichnet. Es folgen Koordinaten ("Argumente" genannt), die das Ziel der Anweisung angeben, also z.B. wohin eine Linie gezeichnet werden soll oder wohin der Zeichen-Cursor gehen soll.

Die Start-Koordinaten dagegen entsprechen immer der aktuellen Cursor-Position (manchmal auch als "aktueller Punkt" bezeichnet). Ist der Anweisungs-Buchstabe in Großschrift, so werden die Ziel-Koordinaten als absolut angesehen. Will man relative Koordinaten (also ausgehend von den Start-Koordinaten) verwenden, so nimmt man Kleinbuchstaben.

Wenn wir es mit Koordinaten-Paaren (damit ist gemeint, dass eine X- und Y-Koordinate zusammengehörig angegeben werden) zu tun haben, können die beiden Koordinaten mit einem Komma oder einem Leerzeichen getrennt werden - wobei wir uns hier grundsätzlich fürs Leerzeichen entschieden haben.

Erste Schritte


Pfade werden mit dem <path>-Tag definiert. Das Attribut d enthält die oben angesprochenen Anweisungen.

Bevor wir jedoch erklären, welche Anweisungen es gibt und wie diese eingesetzt werden, zum Einstieg einige simple Beispiel-Pfade

Dieser Code hier zeichnet z.B. zwei einfache Linien in Blau:


<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/PR-SVG-20010904/DTD/svg10.dtd">
<svg>
<path d="M 100 100 L 200 200 L 300 200" stroke="blue" stroke-width="3" fill="none" />
</svg>

Diesen Code in neuem Fenster anzeigen

Zur Erklärung: der Befehl M positioniert den Cursor auf den angegebenen Koordinaten, der Befehl L zeichnet von dort aus eine Linie.

Das gleiche Bild, nur diesmal mit relativen Angaben bei den Linien-Befehlen:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/PR-SVG-20010904/DTD/svg10.dtd">
<svg>
<path d="M 100 100 l 100 100 l 100 0" stroke="blue" stroke-width="3" fill="none" />
</svg>

Diesen Code in neuem Fenster anzeigen

Ihnen schon bekannte Befehle, z.B. zum Einstellen des Rahmens, funktionieren auch mit Pfaden. Wenn Sie fill nicht auf none setzen, wird der SVG-Interpreter die Fläche füllen wollen und dazu eine Verbindung zwischen der ersten und letzten Cursor-Position herstellen. Genau das wollen wir hier aber nicht.

Horizontale/vertikale Linien


Der L-Befehl erwartet ein Koordinatenpaar, um den Zielpunkt festzusetzen. Einfacher funktionieren dagegen die H- und V-Kommandos, die horizontale bzw. vertikale Linien zeichnen. Sie benötigen deshalb auch nur eine Koordinate als Argument.

Beispiel:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/PR-SVG-20010904/DTD/svg10.dtd">
<svg>
<path d="M 300 300 h 100 v -200" stroke="blue" stroke-width="3" fill="none" />
</svg>

Diesen Code in neuem Fenster anzeigen

Hier gut zu sehen: relative Koordinaten, die natürlich auch negativ sein können.

Pfade abkürzen


Die beiden obigen Code-Beispiele enthalten noch viel Redundanz. Tatsächlich könnten Sie z.B. den zweiten L-Befehl (nicht aber das dazugehörige Koordinatenpaar) einfach weglassen. Der Interpreter würde dann aus dem Kontext erschließen, dass Sie den Befehl wiederholen wollen. Auch die Leerzeichen zwischen Koordinaten und Buchstaben sind nicht unbedingt nötig:
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/PR-SVG-20010904/DTD/svg10.dtd">
<svg>
<path d="M100 100L200 200 300 200" stroke="blue" stroke-width="3" fill="none" />
</svg>

Diesen Code in neuem Fenster anzeigen

Wir sind der Meinung, dass einige zusätzliche Leerzeichen nicht schaden können, und sei es nur aus Gründen der Übersichtlichkeit. Sie sollten jedoch auch die Kurz-Notationen kennen und verstehen, denn im Internet werden diese gerne verwendet.

Andere Befehle


Pfad abschließen


Der Z-Befehl (Schreibweise unwichtig) beendet einen Pfad und zieht eine Linie zum ersten Koordinatenpaar. Wirkung ist also, dass aus einem Pfad eine unterbrechungsfreie Form wird. Er erwartet keine zusätzlichen Koordinaten.

Wenn Sie ihn in unser bisheriges Beispiel einbinden, wird eine dritte Linie angezeigt:


<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/PR-SVG-20010904/DTD/svg10.dtd">
<svg>
<path d="M 100 100 L 200 200 L 300 200 Z" stroke="blue" stroke-width="3" fill="none" />
</svg>

Diesen Code in neuem Fenster anzeigen

Kubische Bézier-Kurven


Der Befehl für kubische Bézier-Kurven ist C. Kubische Bézier-Kurven werden definiert durch ein Viereck, dessen Koordinaten Sie angeben müssen. Die Kurve wird dann sozusagen ins Viereck gezeichnet.

Deswegen müssen Sie auch drei Koordinaten-Paare an den C-Befehl anschließen. Die ersten beiden Paare sind Kontrollpunkte, also sozusagen Ecken des Vierecks. Das dritte Paar gibt den Zielort der Kurve an. Begonnen wird sie an der aktuellen Cursor-Position.

Die Syntax des Befehls ist also C x1 y1 x2 y2 x3 y3.

Zum Verständnis des Befehls ist es sicher hilfreich, wenn Sie sich den Code auch einmal im SVG-Viewer ansehen.

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/PR-SVG-20010904/DTD/svg10.dtd">
<svg>
<!-- Der Kurven-Pfad -->
<path d="M 200 200 C 200 100 400 100 400 400" stroke="blue" stroke-width="3" fill="none"/>
<!-- zur Verdeutlichung im Viewer -->
<line x1="200" y1="200" x2="200" y2="100" stroke="gray" stroke-width="2" />
<text x="200" y="110" fill="gray">200, 100</text>

<line x1="200" y1="100" x2="400" y2="100" stroke="gray" stroke-width="2" />
<text x="400" y="110" fill="gray">400, 100</text>

<line x1="400" y1="100" x2="400" y2="400" stroke="gray" stroke-width="2" />
<text x="400" y="410" fill="gray">400, 400</text>

<line x1="400" y1="400" x2="200" y2="200" stroke="gray" stroke-width="2" />
<text x="200" y="210" fill="gray">200, 200</text>

</svg>

Diesen Code in neuem Fenster anzeigen

Sie können kubische Bézier-Kurven auch mit dem Kommando S erzeugen. Die Syntax für diesen Befehl ist S x2 y2 x3 y3. Sie haben sicher bemerkt, dass hier das erste Koordinatenpaar x1 y1 fehlt. Es wird bei Verwendung des S-Befehls berechnet, indem das x2 y2-Paar des vorangegangen Befehls an der aktuellen Cursorposition gespiegelt wird.

Daher macht dieser Befehl nur Sinn, wenn ein anderer S- oder C-Befehl vorangegangen ist. Ist dem nicht so, dann wird das x1 y1-Paar mit dem aktuellen Punkt gleichgesetzt.

Beispiel dazu:
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/PR-SVG-20010904/DTD/svg10.dtd">
<svg>
<!-- Der Kurven-Pfad -->
<path d="M 200 200 C 200 100 400 100 400 400 S 600 700 600 200" stroke="blue" stroke-width="3" fill="none"/>

<!-- zur Verdeutlichung im Viewer -->
<line x1="200" y1="200" x2="200" y2="100" stroke="gray" stroke-width="2" />
<text x="200" y="110" fill="gray">200, 100</text>

<line x1="200" y1="100" x2="400" y2="100" stroke="gray" stroke-width="2" />
<text x="400" y="110" fill="gray">400, 100</text>

<line x1="400" y1="100" x2="400" y2="400" stroke="gray" stroke-width="2" />
<text x="400" y="410" fill="gray">400, 400</text>

<line x1="400" y1="400" x2="200" y2="200" stroke="gray" stroke-width="2" />
<text x="200" y="210" fill="gray">200, 200</text>
</svg>

Diesen Code in neuem Fenster anzeigen

Der entsprechende Abschnitt der W3C-SVG-Spezifikation enthält viele andere gute Beispiele.

Quadratische Bézier-Kurven


Der Q-Befehl zeichnet eine quadratische Bézier-Kurve. Der SVG-Interpreter erwartet zwei dem Kommando folgende Koordinatenpaare: einen Kontrollpunkt und einen Endpunkt für die Kurve. Als Startpunkt wird die aktuelle Cursor-Position genommen. Die Syntax des Befehls ist also Q x1 y1 x2 y2.

Wenn Sie sich dieses Beispiel im Viewer ansehen, wird Ihnen alles klar werden:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/PR-SVG-20010904/DTD/svg10.dtd">
<svg>
<!-- Der Kurven-Pfad -->
<path d="M 300 300 Q 350 200 400 300" stroke="blue" stroke-width="3" fill="none"/>
<!-- Erklärungslinien -->
<text x="300" y="290" fill="gray">300, 300</text>

<line x1="300" y1="300" x2="350" y2="200" stroke="gray" stroke-width="2" />
<text x="350" y="190" fill="gray">x1 y1</text>

<line x1="350" y1="200" x2="400" y2="300" stroke="gray" stroke-width="2" />
<text x="400" y="290" fill="gray">x2 y2</text>
</svg>

Diesen Code in neuem Fenster anzeigen

Den gleichen Spiegelungs-Mechanismus wie bei den kubischen Bézier-Kurven gibt es auch bei den quadratischen. Der Befehl lautet hier T und benötigt nur noch ein Koordinatenpaar.

Ellipsen-Bögen


Ellipsen-Bögen werden mit dem Befehl A erzeugt. Das dahinterstehende Prinzip ist simpel: ausgehend vom aktuellen Punkt wird zu einem anderen Punkt mit den Koordinaten x1, y1 ein ellipsenförmiger Bogen gezogen. Um die Form des Bogens zu beeinflussen, gibt es verschiedene Parameter:

  • r1 und r2: zwei Radi. Sie beeinflussen also die Form und Größe des Bogens.

  • rotation: gibt an, wie der Ellipsen-Bogen relativ zum Koordinatensystem gedreht werden soll (meist nur sichtbar, wenn r1 einen anderen Wert hat als r2).

  • large: es gibt insg. vier Prinzipien, nach denen ein Bogen zwischen zwei Punkten gezeichnet werden kann. Zwei davon ergeben sich aus der Möglichkeit, festzulegen, ob man die lange oder kurze Verbindung gezeichnet haben möchte (siehe dazu auch folgende Beispiele). Eine "1" steht hier für die lange Verbindung, eine "0" für die kurze.

  • Die anderen beiden Prinzipien resultieren aus der Möglichkeit, einen Bogen entweder "hingekrümmt" oder "weggekrümmt" darzustellen. Das entsprechende Argument heißt sweep. Die beiden Möglichkeiten werden wieder durch eine "1" bzw. "0" ausgedrückt.



Die Gesamt-Syntax des Befehls ist A r1 r2 rotation large sweep x1 y1.

Kompliziert? Dann sehen Sie sich doch einmal die folgenden Beispiele in Ihrem SVG-Viewer an, das wird helfen!

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/PR-SVG-20010904/DTD/svg10.dtd">
<svg>
<!-- sweep- und large-Variationen -->
<path d="M50,150 a 50 50 0 1 0 50 -50 " fill="none" stroke="blue" stroke-width="5" />

<path d="M250,150 a 50 50 0 1 1 50 -50 " fill="none" stroke="blue" stroke-width="5" />

<path d="M450,150 a 50 50 0 0 0 50 -50 " fill="none" stroke="blue" stroke-width="5" />

<path d="M650,150 a 50 50 0 0 1 50 -50 " fill="none" stroke="blue" stroke-width="5" />

<!-- ein Tortendiagramm -->

<path d="M100,450 a 100 100 0 1 0 100 -100 v 100 h -100" fill="SkyBlue" stroke="Black" stroke-width="2" />
<text x="220" y="490" font-family="Arial" font-size="14pt">75%</text>

<!-- ein Planetensystem -->
<path d="M400,500 a 150 50 1 1 0 10 -10 " fill="none" stroke="black" stroke-width="1" />
<path d="M410,490 a 10 10 1 1 0 1 1 " fill="blue" stroke="black" stroke-width="1" />
<path d="M550,500 a 20 20 1 1 0 1 1 " fill="yellow" stroke="black" stroke-width="1" />
<!-- Erklärungslinien, -texte -->
<text x="50" y="20" font-family="Arial" font-size="14pt">
Div. Variationen, nur mit unterschiedlichen Parametern:
</text>

<text x="50" y="220">
large = 1
</text>
<text x="50" y="240">
sweep = 0
</text>

<text x="250" y="220">
large = 1
</text>
<text x="250" y="240">
sweep = 1
</text>

<text x="450" y="220">
large = 0
</text>
<text x="450" y="240">
sweep = 0
</text>

<text x="650" y="220">
large = 0
</text>
<text x="650" y="240">
sweep = 1
</text>

<text x="50" y="300" font-family="Arial" font-size="14pt">
Mit den Ellipsen kann man auch wunderbar Tortendiagramme darstellen:
</text>

<text x="400" y="400" font-family="Arial" font-size="14pt">
Oder auch andere Dinge:
</text>

</svg>

Diesen Code in neuem Fenster anzeigen

Fazit


Mit SVG-Pfaden können Sie praktisch beliebige Objekte in SVG darstellen. Wahrscheinlich ist es auch kein Fehler, zumindest die Grundformen in einem SVG-Grafikprogramm zu erstellen, das erleichtert die Arbeit ungemein. Zum Abschluss noch ein letztes Beispiel:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/PR-SVG-20010904/DTD/svg10.dtd">
<svg>
<defs>
<filter id="blur">
<feGaussianBlur in="SourceGraphic" stdDeviation="1"/>
</filter>
<filter id="blur2">
<feGaussianBlur in="SourceGraphic" stdDeviation="4"/>
</filter>
</defs>

<rect x="300" y="30" height="400" width="150" stroke="black" stroke-width="1" fill="LightSkyBlue" fill-opacity="0.5" />
<rect x="100" y="150" height="200" width="400" stroke="black" stroke-width="1" fill="#EEEEEE"/>
<rect x="50" y="100" height="100" width="100" stroke="black" stroke-width="1" fill="Salmon" fill-opacity="0.5" />

<path d="M200,200 a 50 50 0 1 0 50 50 " fill="none" stroke="blue" stroke-width="5" filter="url(#blur2)" />
<path d="M200,250 l 40 -80 l 40 80 m -80 -30 h 100 l 20 80 l 20 -50 l 20 50 l 20 -80 h 100 m -60 0 m 0 30 v -80 q 100 40 0 80" fill="none" stroke="blue" stroke-width="3" filter="url(#blur)"/>
</svg>

Diesen Code in neuem Fenster anzeigen

Autor: Alexander Dilthey | Erstmalig veröffentlicht: 27.11.2002 | Einen Artikel schreiben?

 

Artikelreihe SVG
SVG-Tutorial
SVG-Dateien in HTML einbinden
SVG-Animation und -Interaktion
Review: Jasc Webdraw 1.02

Neue Artikel

Rezension: Entwurfsmuster von Kopf bis Fuß
Rezension: Webdesign mit CSS
AJAX - XML und JavaScript in Schönheit vereint?
Rich Email - Flash im Newsletter
Screen Reader Usability
Comment Spam und CAPTCHAs
Logfile-Analyse selbst gemacht - ein Perl-Beispiel

Partnerprogramm




Kommentar

Ist die Freiheit der Informationsgesellschaft in Gefahr?
Derzeit leben wir in einer relativ freien Welt. Doch sind derzeit Tendenzen erkennbar, die Freiheit des Individuums den Interessen der Großindustrie zu opfern. Ein Kommentar.

Druckversion
Sie wollen diese Seite ausdrucken? Dafür haben wir eine spezielle Druckversion ohne grafische Elemente entwickelt!



Einführung in CSS bei HTMLWorld.