Vous voulez utiliser le elliptique A
commande rc . Malheureusement pour vous, cela nécessite de spécifier les coordonnées cartésiennes (x, y) des points de départ et d'arrivée plutôt que les coordonnées polaires (rayon, angle) dont vous disposez, ce qui vous oblige à faire quelques calculs. Voici une fonction JavaScript qui devrait fonctionner (bien que je ne l'aie pas testée) et qui, je l'espère, est assez explicite :
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];
}
Les angles correspondant aux positions de l'horloge dépendent du système de coordonnées ; il suffit de permuter et/ou de nier les termes sin/cos si nécessaire.
La commande arc a ces paramètres :
rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y
Pour votre premier exemple :
rx
= ry
=25 et x-axis-rotation
=0, puisque vous voulez un cercle et non une ellipse. Vous pouvez calculer à la fois les coordonnées de départ (que vous devriez utiliser) et les coordonnées de fin. M
ove to) et les coordonnées finales (x, y) en utilisant la fonction ci-dessus, ce qui donne (200, 175) et environ (182,322, 217,678), respectivement. Compte tenu de ces contraintes jusqu'à présent, il y a en fait quatre arcs qui pourraient être dessinés, donc les deux drapeaux sélectionnent l'un d'entre eux. Je suppose que vous voulez probablement dessiner un petit arc (c'est-à-dire large-arc-flag
=0), dans le sens d'un angle décroissant (signifiant sweep-flag
=0). Au total, le chemin SVG est :
M 200 175 A 25 25 0 0 0 182.322 217.678
Pour le deuxième exemple (en supposant que vous voulez dire aller dans la même direction, et donc un grand arc), le chemin SVG est :
M 200 175 A 25 25 0 1 0 217.678 217.678
Encore une fois, je ne les ai pas testés.
(edit 2016-06-01) Si, comme @clocksmith, vous vous demandez pourquoi ils ont choisi cette API, jetez un coup d'œil à l' notes d'application . Ils décrivent deux paramétrisations possibles de l'arc, la "paramétrisation du point final" (celle qu'ils ont choisie) et la "paramétrisation du centre" (qui ressemble à celle utilisée dans la question). Dans la description de la "paramétrisation du point final", ils disent :
L'un des avantages de la paramétrisation du point d'arrivée est qu'elle permet une syntaxe de parcours cohérente dans laquelle toutes les commandes de parcours se terminent par les coordonnées du nouveau "point courant".
En fait, il s'agit d'un effet secondaire des arcs qui sont considérés comme faisant partie d'un chemin plus large plutôt que comme un objet distinct. Je suppose que si votre moteur de rendu SVG est incomplet, il pourrait simplement sauter tous les composants de chemin qu'il ne sait pas comment rendre, tant qu'il sait combien d'arguments ils prennent. Ou peut-être que cela permet un rendu parallèle de différentes parties d'un chemin avec de nombreux composants. Ou peut-être ont-ils fait cela pour s'assurer que les erreurs d'arrondi ne s'accumulent pas sur la longueur d'un chemin complexe.
Les notes de mise en œuvre sont également utiles pour la question initiale, car elles contiennent un pseudocode plus mathématique pour la conversion entre les deux paramétrages (ce que je n'avais pas réalisé lorsque j'ai écrit cette réponse pour la première fois).