Si desidera utilizzare il comando ellittico A
rc . Sfortunatamente per te, questo richiede di specificare le coordinate cartesiane (x, y) dei punti iniziale e finale piuttosto che le coordinate polari (raggio, angolo) che hai, quindi devi fare un po 'di matematica. Ecco una funzione JavaScript che dovrebbe funzionare (anche se non l'ho ancora testata) e che spero sia abbastanza autoesplicativa:
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];
}
Quali angoli corrispondono a quali posizioni dell'orologio dipenderanno dal sistema di coordinate; basta scambiare e / o negare i termini sin / cos secondo necessità.
Il comando arc ha questi parametri:
rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y
Per il tuo primo esempio:
rx
= ry
= 25 e x-axis-rotation
= 0, poiché vuoi un cerchio e non un'ellisse. Puoi calcolare sia le coordinate iniziali (che dovresti eventualmente M
) sia le coordinate finali (x, y) usando la funzione sopra, producendo (200, 175) e circa (182.322, 217.678), rispettivamente. Dati questi vincoli finora, in realtà ci sono quattro archi che potrebbero essere disegnati, quindi le due bandiere ne selezionano uno. Immagino che probabilmente vuoi disegnare un arco piccolo (significato large-arc-flag
= 0), nella direzione dell'angolo decrescente (significato sweep-flag
= 0). Tutti insieme, il percorso SVG è:
M 200 175 A 25 25 0 0 0 182.322 217.678
Per il secondo esempio (supponendo che intendi andare nella stessa direzione, e quindi un arco di grandi dimensioni), il percorso SVG è:
M 200 175 A 25 25 0 1 0 217.678 217.678
Ancora una volta, non li ho testati.
(modifica 2016-06-01) Se, come @clocksmith, ti stai chiedendo perché abbiano scelto questa API, dai un'occhiata alle note di implementazione . Descrivono due possibili parametrizzazioni dell'arco, la "parametrizzazione dell'endpoint" (quella che hanno scelto) e la "parametrizzazione centrale" (che è come ciò che utilizza la domanda). Nella descrizione di "parametrizzazione endpoint" si dice:
Uno dei vantaggi della parametrizzazione dell'endpoint è che consente una sintassi del percorso coerente in cui tutti i comandi del percorso terminano nelle coordinate del nuovo "punto corrente".
Quindi fondamentalmente è un effetto collaterale degli archi considerati come parte di un percorso più ampio piuttosto che il loro oggetto separato. Suppongo che se il tuo renderer SVG è incompleto potrebbe semplicemente saltare qualsiasi componente del percorso che non sa come eseguire il rendering, purché sappia quanti argomenti prendono. O forse abilita il rendering parallelo di blocchi diversi di un percorso con molti componenti. O forse lo hanno fatto per assicurarsi che gli errori di arrotondamento non si accumulassero lungo un percorso complesso.
Le note di implementazione sono utili anche per la domanda originale, poiché hanno più pseudocodici matematici per la conversione tra le due parametrizzazioni (cosa che non ho realizzato quando ho scritto per la prima volta questa risposta).
arcSweep
variabile sta effettivamente controllando illarge-arc-flag
parametro svg A. Nel codice sopra, il valore per ilsweep-flag
parametro è sempre zero.arcSweep
dovrebbe probabilmente essere rinominato in qualcosa del generelongArc
.