Você deseja usar o comando elíptico A
rc . Infelizmente para você, isso exige que você especifique as coordenadas cartesianas (x, y) dos pontos inicial e final, em vez das coordenadas polares (raio, ângulo) que você possui, portanto, é necessário fazer algumas contas. Aqui está uma função JavaScript que deve funcionar (embora eu não a tenha testado) e espero que seja bastante auto-explicativa:
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];
}
Quais ângulos correspondem a quais posições do relógio dependerão do sistema de coordenadas; apenas troque e / ou negue os termos sin / cos, conforme necessário.
O comando arc possui estes parâmetros:
rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y
Para o seu primeiro exemplo:
rx
= ry
= 25 e x-axis-rotation
= 0, pois você deseja um círculo e não uma elipse. Você pode calcular as coordenadas iniciais (que você deve M
dedicar) e as coordenadas finais (x, y) usando a função acima, produzindo (200, 175) e aproximadamente (182.322, 217.678), respectivamente. Dadas essas restrições até agora, na verdade existem quatro arcos que podem ser desenhados, então as duas bandeiras selecionam uma delas. Acho que você provavelmente deseja desenhar um pequeno arco (significado large-arc-flag
= 0), na direção do ângulo decrescente (significado sweep-flag
= 0). Todos juntos, o caminho SVG é:
M 200 175 A 25 25 0 0 0 182.322 217.678
Para o segundo exemplo (supondo que você queira ir na mesma direção e, portanto, um arco grande), o caminho SVG é:
M 200 175 A 25 25 0 1 0 217.678 217.678
Novamente, eu não testei isso.
(editar 2016-06-01) Se, como @clocksmith, você está se perguntando por que eles escolheram essa API, dê uma olhada nas notas de implementação . Eles descrevem duas possíveis parametrizações de arco, "parametrização de ponto final" (a que eles escolheram) e "parametrização central" (que é como o que a pergunta usa). Na descrição da "parametrização do terminal", eles dizem:
Uma das vantagens da parametrização do ponto de extremidade é que ela permite uma sintaxe de caminho consistente na qual todos os comandos de caminho terminam nas coordenadas do novo "ponto atual".
Então, basicamente, é um efeito colateral dos arcos serem considerados parte de um caminho maior, em vez de seu próprio objeto separado. Suponho que, se o seu renderizador SVG estiver incompleto, ele poderá pular qualquer componente do caminho que não saiba como renderizar, desde que saiba quantos argumentos eles levam. Ou talvez ele permita a renderização paralela de diferentes pedaços de um caminho com muitos componentes. Ou talvez tenham feito isso para garantir que os erros de arredondamento não se acumulem ao longo de um caminho complexo.
As notas de implementação também são úteis para a pergunta original, pois possuem mais pseudocódigo matemático para a conversão entre as duas parametrizações (o que eu não percebi quando escrevi essa resposta pela primeira vez).
arcSweep
variável está realmente controlando olarge-arc-flag
parâmetro svg A. No código acima, o valor para osweep-flag
parâmetro é sempre zero.arcSweep
provavelmente deve ser renomeado para algo comolongArc
.