Pregunta corta: usando la ruta SVG, podemos dibujar el 99.99% de un círculo y aparece, pero cuando es el 99.99999999% de un círculo, entonces el círculo no aparecerá. ¿Cómo se puede arreglar?
La siguiente ruta SVG puede dibujar el 99.99% de un círculo: (pruébelo en http://jsfiddle.net/DFhUF/1381/ y vea si ve 4 arcos o solo 2 arcos, pero tenga en cuenta que si es IE, es renderizado en VML, no SVG, pero tiene el problema similar)
M 100 100 a 50 50 0 1 0 0.00001 0
Pero cuando es 99.99999999% de un círculo, ¿entonces nada se mostrará?
M 100 100 a 50 50 0 1 0 0.00000001 0
Y eso es lo mismo con el 100% de un círculo (sigue siendo un arco, ¿no es así, solo un arco muy completo?)
M 100 100 a 50 50 0 1 0 0 0
¿Cómo se puede arreglar eso? La razón es que uso una función para dibujar un porcentaje de un arco, y si necesito un "caso especial" de 99.9999% o 100% de arco para usar la función de círculo, sería una tontería.
Nuevamente, un caso de prueba en jsfiddle usando RaphaelJS está en http://jsfiddle.net/DFhUF/1381/
(y si es VML en IE 8, incluso el segundo círculo no se mostrará ... debe cambiarlo a 0,01)
Actualizar:
Esto se debe a que estoy representando un arco para una puntuación en nuestro sistema, por lo que 3.3 puntos obtienen 1/3 de un círculo. 0.5 obtiene medio círculo, y 9.9 puntos obtienen el 99% de un círculo. Pero, ¿qué pasa si hay puntajes de 9.99 en nuestro sistema? ¿Tengo que verificar si está cerca del 99.999% de un círculo y usar una arc
función o una circle
función en consecuencia? Entonces, ¿qué pasa con una puntuación de 9.9987? ¿Cuál usar? Es ridículo necesitar saber qué tipo de puntajes se asignarán a un "círculo demasiado completo" y cambiar a una función de círculo, y cuando sea "un cierto 99.9%" de un círculo o un puntaje de 9.9987, use la función de arco .
Respuestas:
Lo mismo para el arco de XAML. ¡Solo cierra el arco del 99,99% con
Z
ay tienes un círculo!fuente
z
al final y listo. Es posible que deba eliminar ceros, por ejemplo, en el último Chrome que tuve que escribir0.0001
para que funcione. Si está buscando dónde colocar la cadena de ruta, busque Rutas en MDN .Sé que es un poco tarde en el juego, pero recordé esta pregunta de cuando era nuevo y tenía un dilema similar, y accidentalmente encontré la solución "correcta", si alguien todavía está buscando una:
En otras palabras, esto:
se puede lograr como un camino con esto:
El truco consiste en tener dos arcos, el segundo retomando donde quedó el primero y usando el diámetro negativo para volver al punto de inicio del arco original.
La razón por la que no se puede hacer como un círculo completo en un arco (y solo estoy especulando) es porque le diría que dibuje un arco de sí mismo (digamos 150,150) para sí mismo (150,150), que representa como "¡oh, ya estoy allí, no es necesario un arco!".
Los beneficios de la solución que estoy ofreciendo son:
Nada de esto importaría si solo permitieran que las rutas de texto acepten formas. Pero creo que están evitando esa solución ya que los elementos de forma como el círculo técnicamente no tienen un punto de "inicio".
Demostración de jsfiddle: http://jsfiddle.net/crazytonyi/mNt2g/
Actualizar:
Si está utilizando la ruta para una
textPath
referencia y desea que el texto se represente en el borde exterior del arco, usaría el mismo método exacto pero cambiaría el indicador de barrido de 0 a 1 para que trate el exterior del camino como la superficie en lugar del interior (piense1,0
como alguien sentado en el centro y dibujando un círculo a su alrededor, mientras1,1
que alguien caminando por el centro a una distancia de radio y arrastrando su tiza a su lado, si eso es de ayuda). Aquí está el código como arriba pero con el cambio:fuente
En referencia a la solución de Anthony, aquí hay una función para obtener el camino:
fuente
Un enfoque totalmente diferente:
En lugar de jugar con rutas para especificar un arco en svg, también puede tomar un elemento circular y especificar un trazo-dasharray, en pseudocódigo:
Su simplicidad es la principal ventaja sobre el método de ruta de arco múltiple (p. Ej., Al crear scripts solo se conecta un valor y ya está listo para cualquier longitud de arco)
El arco comienza en el punto más a la derecha y se puede desplazar usando una transformación de rotación.
Nota: Firefox tiene un error extraño en el que se ignoran las rotaciones de más de 90 grados o más. Entonces, para comenzar el arco desde arriba, use:
fuente
stroke-dasharray="0 10cm 5cm 1000cm"
esto es posible evitar la transformaciónAdobe Illustrator utiliza curvas bezier como SVG, y para círculos crea cuatro puntos. Puede crear un círculo con dos comandos de arco elíptico ... pero luego, para un círculo en SVG, usaría un
<circle />
:)fuente
circle
, consulte la Actualización en la pregunta.arc
para crear un círculo completo usando el arco izquierdo y el arco derecho? Por lo tanto, el arco no puede dibujar un círculo completo ... para hacerloarc
, se necesitan dos caminosEs una buena idea usar dos comandos de arco para dibujar un círculo completo.
por lo general, uso elipse o elemento circular para dibujar un círculo completo.
fuente
Sobre la base de las respuestas de Anthony y Anton, incorporé la capacidad de rotar el círculo generado sin afectar su apariencia general. Esto es útil si está utilizando la ruta para una animación y necesita controlar dónde comienza.
fuente
Para aquellos como yo que buscaban atributos de elipse para la conversión de ruta:
fuente
Escrito como una función, se ve así:
fuente
<circle>
, usted tiene que cambiar la dirección de este, sur, oeste, norte:"M" + cx + "," + cy + "m" + (r) + ",0" + "a" + r + "," + r + " 0 1,1 " + (-r * 2) + ",0" + "a" + r + "," + r + " 0 1,1 " + (r * 2) + ",0"
La ventaja es questroke-dashoffset
, ystartOffset
ahora funciona de la misma manera.Estas respuestas son demasiado complicadas.
Una forma más sencilla de hacer esto sin crear dos arcos o convertirlos a diferentes sistemas de coordenadas.
Esto supone que su área de lienzo tiene ancho
w
y altoh
.Simplemente use la bandera de "arco largo", para que se llene la bandera completa. Luego haga que los arcos sean 99.9999% del círculo completo. Visualmente es lo mismo. Evite la bandera de barrido simplemente comenzando el círculo en el punto más a la derecha del círculo (un radio directamente horizontal desde el centro).
fuente
Otra forma sería usar dos curvas Cubic Bezier. Eso es para personas con iOS que usan pocketSVG que no reconoce el parámetro svg arc.
C x1 y1, x2 y2, xy (o c dx1 dy1, dx2 dy2, dx dy)
El último conjunto de coordenadas aquí (x, y) es donde desea que termine la línea. Los otros dos son puntos de control. (x1, y1) es el punto de control para el inicio de su curva, y (x2, y2) para el punto final de su curva.
fuente
Hice un jsfiddle para hacerlo aquí:
enlace
todo lo que necesita hacer es cambiar la entrada de console.log y obtener el resultado en la consola
fuente