Dado un círculo centrado en (200.200), radio 25, ¿cómo dibujo un arco de 270 grados a 135 grados y uno que vaya de 270 a 45 grados?
0 grados significa que está justo en el eje x (el lado derecho) (lo que significa que es la posición de las 3 en punto) 270 grados significa que es la posición de las 12 en punto y 90 significa que es la posición de las 6 en punto
En términos más generales, ¿qué es un camino para un arco para parte de un círculo con
x, y, r, d1, d2, direction
sentido
center (x,y), radius r, degree_start, degree_end, direction
arcSweep
variable en realidad controla ellarge-arc-flag
parámetro svg A. En el código anterior, el valor delsweep-flag
parámetro siempre es cero.arcSweep
probablemente debería cambiarse de nombre a algo asílongArc
.endAngle - 0.0001
si no, no se representará el arco completo.Desea usar el comando elíptico
A
rc . Desafortunadamente para usted, esto requiere que especifique las coordenadas cartesianas (x, y) de los puntos inicial y final en lugar de las coordenadas polares (radio, ángulo) que tiene, por lo que debe hacer algunos cálculos. Aquí hay una función de JavaScript que debería funcionar (aunque no la he probado), y que espero sea bastante clara:Qué ángulos corresponden a qué posiciones de reloj dependerán del sistema de coordenadas; simplemente intercambie y / o niegue los términos sin / cos según sea necesario.
El comando de arco tiene estos parámetros:
Para tu primer ejemplo:
rx
=ry
= 25 yx-axis-rotation
= 0, ya que desea un círculo y no una elipse. Puede calcular tanto las coordenadas iniciales (a las que debeM
dirigirse) como las coordenadas finales (x, y) utilizando la función anterior, obteniendo (200, 175) y aproximadamente (182.322, 217.678), respectivamente. Dadas estas restricciones hasta ahora, en realidad hay cuatro arcos que podrían dibujarse, por lo que las dos banderas seleccionan uno de ellos. Supongo que probablemente quieras dibujar un arco pequeño (significadolarge-arc-flag
= 0), en la dirección del ángulo decreciente (significadosweep-flag
= 0). Todos juntos, la ruta SVG es:Para el segundo ejemplo (suponiendo que se refiere a ir en la misma dirección, y por lo tanto un arco grande), la ruta SVG es:
De nuevo, no he probado estos.
(editar 2016-06-01) Si, como @clocksmith, se pregunta por qué eligieron esta API, eche un vistazo a las notas de implementación . Describen dos posibles parametrizaciones de arco, "parametrización de punto final" (la que eligieron) y "parametrización central" (que es como lo que usa la pregunta). En la descripción de "parametrización de punto final" dicen:
Básicamente, es un efecto secundario de los arcos que se consideran parte de una ruta más grande en lugar de su propio objeto separado. Supongo que si su renderizador SVG está incompleto, podría omitir cualquier componente de ruta que no sepa cómo renderizar, siempre que sepa cuántos argumentos toman. O tal vez permite la representación paralela de diferentes fragmentos de una ruta con muchos componentes. O tal vez lo hicieron para asegurarse de que los errores de redondeo no se acumularan a lo largo de una ruta compleja.
Las notas de implementación también son útiles para la pregunta original, ya que tienen más pseudocódigo matemático para la conversión entre las dos parametrizaciones (que no me di cuenta cuando escribí esta respuesta por primera vez).
fuente
large-arc-flag
se debe alternar de 0 a 1 podría introducir algún error.Modifiqué ligeramente la respuesta de opsb e hice un relleno de soporte para el sector circular. http://codepen.io/anon/pen/AkoGx
JS
HTML
fuente
centerX
,centerY
por ejemplo , a 100.viewBox="0 0 500 500"
Esta es una pregunta antigua, pero el código me pareció útil y me ahorró tres minutos para pensar :) Así que agrego una pequeña expansión a la respuesta de @opsb .
Si desea convertir este arco en un segmento (para permitir el relleno), podemos modificar ligeramente el código:
y ahi tienes!
fuente
Las respuestas de @ opsb son claras, pero el punto central no es exacto, además, como señaló @Jithin, si el ángulo es 360, entonces no se dibuja nada.
@Jithin solucionó el problema de 360, pero si seleccionó menos de 360 grados, obtendrá una línea que cierra el bucle de arco, que no es obligatorio.
Lo arreglé y agregué algo de animación en el código a continuación:
fuente
Quería comentar sobre la respuesta de @Ahtenus, específicamente sobre el comentario de Ray Hulha diciendo que el codepen no muestra ningún arco, pero mi reputación no es lo suficientemente alta.
La razón de que este codepen no funcione es que su html está defectuoso con un ancho de trazo de cero.
Lo arreglé y agregué un segundo ejemplo aquí: http://codepen.io/AnotherLinuxUser/pen/QEJmkN .
El html:
El CSS relevante:
El javascript:
fuente
Una imagen y algo de Python
Solo para aclarar mejor y ofrecer otra solución.
Arc
ElA
comando [ ] usa la posición actual como punto de partida, por lo queMoveto
primero debe usar el comando [M].Entonces los parámetros de
Arc
son los siguientes:Si definimos por ejemplo el siguiente archivo svg:
Establecerá el punto de inicio con
M
el punto final con los parámetrosxf
yyf
deA
.Estamos buscando círculos, así que establecemos la
rx
igualdad dery
hacerlo, básicamente, ahora intentaremos encontrar todos los círculos de radiorx
que se cruzan con el punto inicial y final.Puedes tener una explicación más detallada en esta publicación que escribí.
fuente
Nota para los buscadores de respuestas (quién también era yo): si usar el arco no es obligatorio , una solución mucho más simple para dibujar un círculo parcial es usar
stroke-dasharray
SVG<circle>
.Divida la matriz de guiones en dos elementos y escale su rango al ángulo deseado. El ángulo de inicio se puede ajustar usando
stroke-dashoffset
.Ni un solo coseno a la vista.
Ejemplo completo con explicaciones: https://codepen.io/mjurczyk/pen/wvBKOvP
fuente
La función original polarToCartesian de wdebeaum es correcta:
Inversión de los puntos de inicio y final utilizando:
Es confuso (para mí) porque esto revertirá la bandera de barrido. Utilizando:
con el sweep-flag = "0" dibuja arcos "normales" en sentido contrario a las agujas del reloj, lo que creo que es más sencillo. Ver https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths
fuente
Una ligera modificación a la respuesta de @ opsb. No podemos dibujar un círculo completo con este método. es decir, si damos (0, 360) no dibujará nada en absoluto. Entonces, se hizo una ligera modificación para arreglar esto. Podría ser útil mostrar puntuaciones que a veces alcanzan el 100%.
fuente
Versión ES6:
fuente
const d = `M ${start.x} ${start.y} A ${radius} ${radius} 0 ${largeArc} 0 ${end.x} ${end.y}`
Componente ReactJS basado en la respuesta seleccionada:
fuente
puede usar el código JSFiddle que hice para la respuesta anterior:
https://jsfiddle.net/tyw6nfee/
todo lo que necesita hacer es cambiar el código de la última línea console.log y darle su propio parámetro:
fuente