Sie möchten den elliptischen A
Befehl rc verwenden . Leider müssen Sie dafür die kartesischen Koordinaten (x, y) der Start- und Endpunkte und nicht die Polarkoordinaten (Radius, Winkel) angeben, die Sie haben. Sie müssen also etwas rechnen. Hier ist eine JavaScript-Funktion, die funktionieren sollte (obwohl ich sie noch nicht getestet habe) und die hoffentlich ziemlich selbsterklärend ist:
function polarToCartesian(centerX, centerY, radius, angleInDegrees) {
var angleInRadians = angleInDegrees * Math.PI / 180.0;
var x = centerX + radius * Math.cos(angleInRadians);
var y = centerY + radius * Math.sin(angleInRadians);
return [x,y];
}
Welche Winkel welchen Taktpositionen entsprechen, hängt vom Koordinatensystem ab. Tauschen und / oder negieren Sie einfach die sin / cos-Begriffe nach Bedarf.
Der Befehl arc hat folgende Parameter:
rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y
Für Ihr erstes Beispiel:
rx
= ry
= 25 und x-axis-rotation
= 0, da Sie einen Kreis und keine Ellipse wollen. M
Mit der obigen Funktion können Sie sowohl die Startkoordinaten (zu denen Sie übergehen sollten ) als auch die Endkoordinaten (x, y) berechnen. Dies ergibt (200, 175) bzw. ungefähr (182.322, 217.678). Angesichts dieser Einschränkungen können tatsächlich vier Bögen gezeichnet werden, sodass die beiden Flags einen davon auswählen. Ich vermute, Sie möchten wahrscheinlich einen kleinen Bogen (Bedeutung large-arc-flag
= 0) in Richtung des abnehmenden Winkels (Bedeutung sweep-flag
= 0) zeichnen . Insgesamt lautet der SVG-Pfad:
M 200 175 A 25 25 0 0 0 182.322 217.678
Für das zweite Beispiel (vorausgesetzt, Sie meinen die gleiche Richtung und damit einen großen Bogen) lautet der SVG-Pfad:
M 200 175 A 25 25 0 1 0 217.678 217.678
Auch diese habe ich nicht getestet.
(Bearbeiten des 01.06.2016) Wenn Sie sich wie bei @clocksmith fragen, warum sie diese API gewählt haben, lesen Sie die Implementierungshinweise . Sie beschreiben zwei mögliche Bogenparametrisierungen, "Endpunktparametrisierung" (die von ihnen gewählte) und "Mittelparametrisierung" (wie in der Frage verwendet). In der Beschreibung der "Endpunktparametrisierung" heißt es:
Einer der Vorteile der Endpunktparametrisierung besteht darin, dass eine konsistente Pfadsyntax ermöglicht wird, bei der alle Pfadbefehle in den Koordinaten des neuen "aktuellen Punkts" enden.
Im Grunde ist es ein Nebeneffekt, wenn Bögen als Teil eines größeren Pfades betrachtet werden und nicht als eigenständiges Objekt. Ich nehme an, wenn Ihr SVG-Renderer unvollständig ist, kann er einfach alle Pfadkomponenten überspringen, die er nicht rendern kann, solange er weiß, wie viele Argumente er benötigt. Oder es ermöglicht das parallele Rendern verschiedener Abschnitte eines Pfads mit vielen Komponenten. Oder vielleicht haben sie es getan, um sicherzustellen, dass sich auf der Länge eines komplexen Pfades keine Rundungsfehler gebildet haben.
Die Implementierungshinweise sind auch für die ursprüngliche Frage nützlich, da sie mehr mathematischen Pseudocode für die Konvertierung zwischen den beiden Parametrisierungen enthalten (was mir beim ersten Schreiben dieser Antwort nicht klar war).
arcSweep
Variable tatsächlich denlarge-arc-flag
Parameter svg A steuert . Im obigen Code ist der Wert für densweep-flag
Parameter immer Null.arcSweep
sollte wahrscheinlich in so etwas umbenannt werdenlongArc
.