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:
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];
}
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:
rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y
Para tu primer ejemplo:
rx
= ry
= 25 y x-axis-rotation
= 0, ya que desea un círculo y no una elipse. Puede calcular tanto las coordenadas iniciales (a las que debe M
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 (significado large-arc-flag
= 0), en la dirección del ángulo decreciente (significado sweep-flag
= 0). Todos juntos, la ruta SVG es:
M 200 175 A 25 25 0 0 0 182.322 217.678
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:
M 200 175 A 25 25 0 1 0 217.678 217.678
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:
Una de las ventajas de la parametrización del punto final es que permite una sintaxis de ruta coherente en la que todos los comandos de ruta terminan en las coordenadas del nuevo "punto actual".
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).
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
.