polarPath
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.
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
d
des Elementes polarPath
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 '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.
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.
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.
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.
Das Kommando F/f ist die Kurzform des quadratischen Bézier-Fragmentes entsprechend dem Kommando T/t in kartesischen Koordinaten.
Das Kommando G/g ist die Kurzform des kubischen Bézier-Fragmentes entsprechend dem Kommando S/s in kartesischen Koordinaten.
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.
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).
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.
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.
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.path
vonSVG 1.1