Vous souhaitez utiliser la commande rc elliptiqueA
. Malheureusement pour vous, cela vous oblige à 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) que vous avez, vous devez donc faire des calculs. Voici une fonction JavaScript qui devrait fonctionner (même si je ne l'ai 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];
}
Quels angles correspondent à quelles positions d'horloge dépendront du système de coordonnées; échangez simplement et / ou annulez 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 (auxquelles vous devriez M
aller) et les coordonnées de fin (x, y) en utilisant la fonction ci-dessus, ce qui donne respectivement (200, 175) et environ (182,322, 217,678). Compte tenu de ces contraintes jusqu'à présent, il y a en fait quatre arcs qui pourraient être dessinés, donc les deux drapeaux en sélectionnent l'un. Je suppose que vous voulez probablement dessiner un petit arc (signifiant large-arc-flag
= 0), dans le sens de l'angle décroissant (signifiant sweep-flag
= 0). Dans l'ensemble, 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 vouliez 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 œil aux notes d'implémentation . Ils décrivent deux paramétrisations possibles de l'arc, la «paramétrisation du point final» (celle qu'ils ont choisie) et la «paramétrage du centre» (qui est comme ce que la question utilise). Dans la description de "paramétrage des points de terminaison", ils disent:
L'un des avantages du paramétrage des points de terminaison est qu'il permet une syntaxe de chemin cohérente dans laquelle toutes les commandes de chemin se terminent par les coordonnées du nouveau "point courant".
Donc, fondamentalement, c'est un effet secondaire des arcs étant considérés comme faisant partie d'un chemin plus large plutôt que comme leur propre objet séparé. Je suppose que si votre moteur de rendu SVG est incomplet, il pourrait simplement ignorer tous les composants du chemin qu'il ne sait pas rendre, tant qu'il sait combien d'arguments ils prennent. Ou peut-être que cela permet le rendu parallèle de différents morceaux d'un chemin avec de nombreux composants. Ou peut-être l'ont-ils fait pour s'assurer que les erreurs d'arrondi ne se sont pas accumulées le long d'un chemin complexe.
Les notes d'implémentation sont également utiles pour la question originale, car elles ont un pseudo-code plus mathématique pour la conversion entre les deux paramétrisations (ce que je n'avais pas réalisé lorsque j'ai écrit cette réponse pour la première fois).
arcSweep
variable contrôle en fait lelarge-arc-flag
paramètre svg A. Dans le code ci-dessus, la valeur dusweep-flag
paramètre est toujours zéro.arcSweep
devrait probablement être renommé en quelque chose commelongArc
.