Étant donné un cercle centré à (200 200), rayon 25, comment dessiner un arc de 270 degrés à 135 degrés et un qui va de 270 à 45 degrés?
0 degré signifie qu'il est juste sur l'axe x (le côté droit) (ce qui signifie qu'il est en position 3 heures) 270 degrés signifie qu'il est en position 12 heures et 90 signifie qu'il est en position 6 heures
Plus généralement, qu'est-ce qu'un chemin pour un arc pour une partie d'un cercle avec
x, y, r, d1, d2, direction
sens
center (x,y), radius r, degree_start, degree_end, direction
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
.endAngle - 0.0001
sinon, l'arc complet ne sera pas rendu.Vous souhaitez utiliser la commande rc elliptique
A
. 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: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:
Pour votre premier exemple:
rx
=ry
= 25 etx-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 devriezM
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 (signifiantlarge-arc-flag
= 0), dans le sens de l'angle décroissant (signifiantsweep-flag
= 0). Dans l'ensemble, le chemin SVG est: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:
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:
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).
la source
large-arc-flag
doit être basculé de 0 à 1 pourrait introduire un bug.J'ai légèrement modifié la réponse d'opsb et j'ai fait un remplissage de support pour le secteur du cercle. http://codepen.io/anon/pen/AkoGx
JS
HTML
la source
centerX
,centerY
à 100 par exemple.viewBox="0 0 500 500"
C'est une vieille question, mais je l' ai trouvé le code utile et m'a sauvé trois minutes de la pensée :) Je suis en ajoutant une petite extension à @opsb de réponse .
Si vous souhaitez convertir cet arc en une tranche (pour permettre le remplissage), nous pouvons modifier légèrement le code:
et voilà!
la source
Les réponses de @ opsb sont claires, mais le point central n'est pas précis, de plus, comme l'a noté @Jithin, si l'angle est de 360, alors rien n'est dessiné du tout.
@Jithin a résolu le problème de 360, mais si vous sélectionnez moins de 360 degrés, vous obtiendrez une ligne fermant la boucle d'arc, ce qui n'est pas obligatoire.
J'ai corrigé cela et ajouté une animation dans le code ci-dessous:
la source
Je voulais commenter la réponse de @Ahtenus, en particulier le commentaire de Ray Hulha disant que le codepen ne montre aucun arc, mais ma réputation n'est pas assez élevée.
La raison pour laquelle ce codepen ne fonctionne pas est que son html est défectueux avec une largeur de trait de zéro.
Je l'ai corrigé et ajouté un deuxième exemple ici: http://codepen.io/AnotherLinuxUser/pen/QEJmkN .
Le html:
Le CSS pertinent:
Le javascript:
la source
Une image et du Python
Juste pour mieux clarifier et proposer une autre solution.
Arc
LaA
commande [ ] utilise la position actuelle comme point de départ, vous devez donc d'abord utiliser laMoveto
commande [M].Ensuite, les paramètres de
Arc
sont les suivants:Si on définit par exemple le fichier svg suivant:
Vous définissez le point de départ avec
M
le point d'arrivée avec les paramètresxf
etyf
deA
.Nous recherchons des cercles, donc nous définissons comme
rx
égal à lery
faire essentiellement maintenant, il essaiera de trouver tous les cercles de rayonrx
qui croisent le point de départ et le point final.Vous pouvez avoir une explication plus détaillée dans ce post que j'ai écrit.
la source
Remarque pour les demandeurs de réponses (que j'étais aussi) - si l'utilisation d'arc n'est pas obligatoire , une solution beaucoup plus simple pour dessiner un cercle partiel consiste à utiliser
stroke-dasharray
SVG<circle>
.Divisez le tableau de tirets en deux éléments et mettez leur plage à l'échelle à l'angle souhaité. L'angle de départ peut être ajusté à l'aide de
stroke-dashoffset
.Pas un seul cosinus en vue.
Exemple complet avec explications: https://codepen.io/mjurczyk/pen/wvBKOvP
la source
La fonction originale polarToCartesian de wdebeaum est correcte:
Inversion des points de départ et d'arrivée en utilisant:
Est déroutant (pour moi) car cela inversera le drapeau de balayage. En utilisant:
avec le sweep-flag = "0" dessine des arcs "normaux" dans le sens antihoraire, ce qui, je pense, est plus simple. Voir https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths
la source
Une légère modification de la réponse de @ opsb. Nous ne pouvons pas dessiner un cercle complet avec cette méthode. c'est-à-dire que si nous donnons (0, 360), il ne tirera rien du tout. Donc une légère modification a été apportée pour résoudre ce problème. Il peut être utile d'afficher des scores qui atteignent parfois 100%.
la source
Version ES6:
la source
const d = `M ${start.x} ${start.y} A ${radius} ${radius} 0 ${largeArc} 0 ${end.x} ${end.y}`
Composant ReactJS basé sur la réponse sélectionnée:
la source
vous pouvez utiliser le code JSFiddle que j'ai créé pour la réponse ci-dessus:
https://jsfiddle.net/tyw6nfee/
tout ce que vous avez à faire est de changer le code de la dernière ligne console.log et de lui donner votre propre paramètre:
la source