Vorschlag Element polarPath

Autor: dr.o.hoffmann@gmx.de
2008-08-01, 2008-08-14, 2008-08-17, 2008-09-03, 2009-06-27

Kurzzusammenfassung

In SVG 1.1 sind Pfadkommandos nur in kartesischen Koordinaten verfügbar. Für diverse Probleme sind Polarkoordinaten für Autoren bequemer und die Zahl der Listenpunkte im Attribut values einer Animation von Pfaddaten für solche Probleme kann dramatisch reduziert werden.
Daher wird mit diesem Vorschlag für das Element polarPath das Konzept der Bézierkurven einfach auf Polarkoordinaten erweitert oder alternativ werden zusätzliche Kommandos für das Element path eingeführt.

Element polarPath - Allgemeine Anmerkungen

Das Element polarPath entspricht dem Element path mit denselben Attributen und demselben Verhalten, nur die Kommandoglyphen und ihre Bedeutung werden verändert, um Polarkoordinaten verwenden zu können. Andere Glyphen als für das Attribut d von path werden nur verwendet, um in einem zweiten Vorschlag die Kommandos zusammenfügen zu können. Kommandos sind verfügbar in kleinen Buchstaben für relative Koordinaten und in großen für absolute Koordinaten, wie für das Element path. Polarkoordinaten werden mit der radialen Komponente zuerst angegeben, dann folgt die Winkelkomponente in Grad.
Im folgenden wird die radiale Komponente r genannt und die Winkelkomponente φ. Der Laufparameter u eines einzelnen Fragmentes geht von 0 bis 1. Mit kartesischen Koordinatenpaaren, gegeben mit dem P/p Kommando (px,py), erfolgt die Transformation zu Koordinaten im Nutzerkoordinatensystem wie folgt:
x = r cos(φ) + px
y = r sin(φ)+ py

Kommandos des Attributes d des Elementes polarPath

P/p Kommando

Mit dem Kommando P/p wird das Zentrum oder der Ursprungspunkt für die Polarkoordinaten angegeben, welches dahinter folgt. Dies Zentrum wird in kartesischen Koordinaten angegeben, zum Beispiel P 100 200 bedeutet ein Zentrum bei (100,200) im Nutzerkoordinatensystem. P/p kennzeichnet den Beginn eines neuen Unterpfades. Falls polarPath ohne vorheriges P/p angegeben wird, wird das Zentrum angenommen als (0,0).

N/n Kommando

N/n 'nächster' Kommando entspricht exakt dem M/m des Elementes path und bedeutet eine Bewegung zur angegebenen Position und den Beginn eines neuen Unterpfades. Falls mehrere Koordinatenpaare nach dem Kommando N/n folgen, werden die anschließenden Paare behandelt als implizite Kommandos I/i (siehe unten). Falls das Kommando N/n vor anderen Polarkoordinaten fehlt, wird das Anfangskoordinatenpaar als '0 0' angenommen, aber Autoren sollten immer ein Anfangskoordinatenpaar angeben.

I/i Kommando

Kommando I/i ermöglicht es, einfache affine Spiralfragmente anzugeben. Falls (ra, φa) der aktuelle Punkt ist und (re, φe) das Koordinatenpaar nach dem Kommando I, beschreibt das eine Kurve mit folgender Parametrisierung mit dem Laufparameter u von 0 bis 1:
(r,φ)(u) = (1 - u) (ra, φa) + u (re, φe).
Beim Kommando i wird der aktuelle Punkt ra, φa zu den relativen Koordinaten addiert, wie üblich vor dieser Parametrisierung.
Falls mehr als ein Koordinatenpaar angegeben ist, wird eine Polyspirale gezeichnet. Am Ende des Kommandos wird der neue aktuelle Punkt auf die letzten Koordinaten gesetzt.

J/j Kommando

Kommando J/j ermöglicht es, ein quadratisches Bézier-Fragment anzugeben. Es werden zwei Koordinatenpaare erwartet, die dem Kommando folgen, ober aber ein multipler Satz von zwei Koordinatenpaaren. Falls (ra, φa) der aktuelle Punkt ist und (rc, φc) der Kontrollpunkt direkt nach dem Kommando J/j und (re, φe) das zweite Koordinatenpaar nach dem Kommando J, beziehungsweise das erste Paar eines solchen Doubletts, beschreibt das eine Kurve mit folgender Parametrisierung mit dem Laufparameter u von 0 bis 1:
(r,φ)(u) = (1 - u)2 (ra, φa) + 2u(1 - u) (rc, φc) + u2 (re, φe).
Beim Kommando j wird der aktuelle Punkt ra, φa zu den relativen Koordinaten addiert, wie üblich vor dieser Parametrisierung.
Falls mehr als ein Koordinatenpaar angegeben ist, wird eine Polykurve gezeichnet. Am Ende des Kommandos wird der neue aktuelle Punkt auf die letzten Koordinaten gesetzt.

K/k Kommando

Kommando K/k ermöglicht es, ein kubisches Bézier-Fragment anzugeben. Es werden drei Koordinatenpaare erwartet, die dem Kommando folgen, ober aber ein multipler Satz von drei Koordinatenpaaren. Falls (ra, φa) der aktuelle Punkt ist und (rc, φc) der erste Kontrollpunkt direkt nach dem Kommando K/k, beziehungsweise das erste Paar eines Tripletts, (rd, φd) der zweite Kontrollpunkt und (re, φe) das dritte Koordinatenpaar, beschreibt das eine Kurve mit folgender Parametrisierung mit dem Laufparameter u von 0 bis 1:
(r,φ)(u) = (1 - u)3 (ra, φa) + 3u(1 - u)2 (rc, φc) + + 3u2(1 - u) (rd, φd) + u3 (re, φe).
Beim Kommando k wird der aktuelle Punkt ra, φa zu den relativen Koordinaten addiert, wie üblich vor dieser Parametrisierung.
Falls mehr als ein Koordinatenpaar angegeben ist, wird eine Polykurve gezeichnet. Am Ende des Kommandos wird der neue aktuelle Punkt auf die letzten Koordinaten gesetzt.

F/f Kommando

Das Kommando F/f ist die Kurzform des quadratischen Bézier-Fragmentes entsprechend dem Kommando T/t in kartesischen Koordinaten.

G/g Kommando

Das Kommando G/g ist die Kurzform des kubischen Bézier-Fragmentes entsprechend dem Kommando S/s in kartesischen Koordinaten.

R/r Kommando

R/r entspricht dem Kommando Z/z, allerdings wird mit diesem Kommando der polare Pfad mit einer affinen Spirale geschlossen, wobei das erste Koordinatenpaar des aktuellen Unterpfades als Endpunkt der Spirale genommen wird, zu der sie gemalt wird. Bedingt durch die Mehrdeutigkeit der Konversion von Polarkoordinaten nach kartesischen Koordinaten, gibt es mehrere Wege, um eine Spirale zum ersten Koordinatenpaar des aktuellen Unterpfades zu malen, daher haben R/r bis zu vier zusätzliche Parameter, hier p0, p1, p2, p3 genannt. Nicht angegebene Parameter werden als 0 angenommen. Autoren wird empfohlen, nur ganze Zahlen für die ersten zwei Parameter zu verwenden und 0 oder 1 für die anderen beiden, siehe Formeln unten, falls etwas anderes angegeben ist, wird das zu einer ganzen Zahl konvertiert (floor ist die nächste ganze Zahl gleich oder kleiner als die gegebene Zahl).
Das Kommando hat die Aufgabe, eine Spirale vom aktuellen Punkt zum Anfangspunkt zum Unterpfad zu malen. Der aktuelle Winkel ψ zum Malen wird vom aktuellen Winkel φc auf folgende Weise bestimmt: ψ = φc + floor(p0)*360 Grad.
Der Anfangswinkel ι zum Malen wird vom Anfangswinkel φi auf folgende Weise bestimmt: ι = φi + floor(p1)*360 Grad.
Der dritte und vierte Parameter sind dazu gedacht, das Vorzeichen von r zu ändern, bevor die Spirale gemalt wird. Das aktuelle r wird bestimmt vom aktuellen rc in folgender Weise:
r = - rc und φ = ψ -180 Grad, falls der dritte Parameter nicht 0 ist, entsprechend das anfängliche rin = - ri und φin = ι -180 Grad, falls der vierte Parameter nicht 0 ist. Falls der dritte beziehungsweise vierte Parameter 0 ist, bleibt das entsprechende Koordinatenpaar unverändert.

Beispiele für Pfadfragmente in Polarkoordinaten

Die folgenden Skripte zeigen (zufällige) Beispiele für Pfadfragmente in Polarkoordinaten, für affine, quadratische und kubische Kurven in Form einer Näherung mit den aktuellen kartesischen Kommandos des Elementes path mit kubischen Bézierkurven. Aufgrund des typisch freundlichen Verhaltens von Bézierkurven ist solch eine Näherung leicht automatisch in guter Qualtität zu berechnen. Falls es keine anderen Ideen für eine bessere Darstellungsstrategie gibt, kann eine solche Näherung verwendet werden, um in Polarkoordinaten angegebene Pfadfragmente darzustellen. Das Element desc der Skriptausgabe beschreibt mehr Details (in deutsch und englisch) über verfügbare GET-Parameter, um spezielle, nicht zufällige Beispiele zu erzeugen.
Die Näherung ist in rot und grün angegeben, bei einer guten Näherung bedeckt die grüne Kurve die rote. Grauer Text zeigt die GET-Parameter, grüner Text die Pfadkommandos zur Approximation in kartesischen Koordinaten.

Affine Spirale (Quelltext affine Spirale).

Quadratisches polares Fragment (Quelltext quadratisches polares Fragment).

Kubisches polares Fragment (Quelltext kubisches polares Fragment).

Das Interpretieren des Attributwertes und die Kombination von Kommandos kann mit folgendem Skript getestet werden. Es enthält ein paar mehr Beispiele: Teste polarPath (Quelltext des Modules zur Erzeugung der Näherung des polarPath).

Alternative Vorschläge

Alternativ zum neuen Element polarPath kann auch das aktuelle Element path erweitert werden, wobei die Kommandos von oben verwendet werden. Dies erfordert manchmal eine Transformation des aktuellen Punktes (x,y) von kartesischen zu Polarkoordinaten. Weil r nicht auf nicht negative Werte beschränkt ist und φ nicht auf einen eingeschränkten Bereich begrenzt ist, ist das Kommando P/p durch zwei weitere Parameter zu erweitern, eines ist die Anzahl der Umdrehungen, die zum unten berechneten Winkel hinzuaddiert werden und ein boolscher Indikator, ob r positiv oder negativ zu nehmen ist. Daher hat das Kommando P/p vier Parameter:
P px py t fr
fr ist entweder 0 oder 1. Alles andere wird zu 1 konvertiert.
Zuerst wird (px,py) abgezogen:
(sx,sy)= (x,y) - (px,py)
r = (2fr -1)*(sx2 + sy2)1/2
φ = 0 falls r 0 ist (mit noch einem weiteren Parameter könnte dies auch vom Autor angegeben werden, wenn notwendig), sonst
φ = v acos(sx/r) + t*360; v ist 1, falls (2fr -1)*sy nicht negativ ist, sonst ist v -1.

Ein dritter Ansatz könnte sein, überhaupt keine neuen Kommandos zu verwenden, nur das Kommando P/p, um ein Umschalten zwischen kartesischen und Polarkoordinaten anzuzeigen. Um zurück zu kartesischen Koordinaten schalten zu können, kann ein weiterer boolscher Indikator fc beim Kommando P/p verwendet werden:
P px py t fr fc
fc ist entweder 0 oder 1. Alles andere wird zu 1 konvertiert.
fc=1 gibt an, daß der folgende Pfad in kartesischen Koordinaten angegeben ist, fc=0 gibt an, daß es sich um Polarkoordinaten handelt. Überhaupt kein P/p bedeutet kartesische Koordinaten.

Diskussion der verschiedenen Vorschläge

Normalerweise, wenn es bequemer für einen Autor ist, ein Problem in Polarkoordinaten zu lösen, gibt es keine Notwendigkeit, zwischen kartesischen und Polarkoordinaten zu wechseln, daher ist es kein großes Problem, zwei Elemente zu haben, und zwei Elemente sind besser hinsichtlich der Rückwärtskompatibilität, weil alte Darstellungsprogramme wenigstens das Element path darstellen können. Nur ein Element zu verwenden, führt zu mehr Flexibilität für den Autor, auch wenn es nicht oft passieren mag, daß zwischen beiden Systemen gewechselt werden muß. Wie auch immer, in Polarkoordinaten sind nur radiale Linien einfach anzugeben, manchmal mag ein Autor auch anderen Linien brauchen. Wenn nur das Kommando P/p neu eingeführt wird, um zwischen den Systemen zu wechseln, ist das eine minimalistische und elegante Lösung, aber Autoren müssen dann aufpassen, daß die Bedeutung derselben Kommandos stark vom vorausgehenden Kommando P/p abhängt, andere Kommandos oder die Koordinaten selbst kennzeichnen den Wechsel nicht.

Mit diesen Kommandos, speziell mit I/i kann eine Archimedische Spirale direkt spezifiziert werden, das Kommando I/i deckt bereits eine größere Gruppe von Kurven ab, allerdings decken diese neuen Kommandos nicht andere spezifischen Sorten von Spiralen ohne weitere Berechnungen oder Näherungen ab, etwa Lituus, logarithmische Spirale, hyperbolische Spirale, eine Spirale, einem beliebigen Potenzgesetz folgend oder eine Klothoide werden nicht direkt abgedekct, aber mit Ausnahme der Klothoide vereinfacht eine Notation in Polarkoordinaten das Problem bereits.

Die Animation von Pfaddaten betreffend, ist es immer erforderlich, sehr viele Listenwerte im Attribut values einer Animation zu notieren, wenn kartesische Koordinaten für ein Problem verwendet werden müssen, welches mehr Bezug zu Polarkoordinaten hat, um eine brauchbare Näherung zu bekommen. Mit diesem Vorschlag können solche gewaltigen Datensätze zumindest für diese Klasse von Problemen vermieden werden. Wenn die Anzeige im Darstellungsprogramm mit einer Konversion zurück in kartesische Koordinaten realisiert wird, ist es natürlich wichtig, daß dies für jeden Animationsinterpolationsschritt getan wird, der angezeigt wird, nicht nur für die Listenpunkte von values, welche nur Endpunkte der Animation sind.

Referenzen

  1. Dieser Vorschlag auf englisch
  2. Vorschlag für das Element polar, eine einfache Methode, um reguläre und irreguläre Polygone, Sterne Blumen, raffinierte polare Objekte zu spezifizieren, zweidimensionale Rotationssymmetrien und gebrochene Symmetrien zu erforschen.
  3. Projektseite des Autors
  4. Kapitel path vonSVG 1.1