lo si fa facendo un unico percorso con due archi.
Si disegna un cerchio in senso orario, quindi si disegna un secondo cerchio in senso antiorario. Non entrerò nei dettagli di questo, ma il modo in cui i percorsi sono costruiti sa di prendere questo come una ragione per sviare quella parte del percorso. Per maggiori dettagli su ciò che fa puoi this wiki article.
Lo stesso funzionerebbe se steste disegnando un rettangolo "incorniciato". Disegna una casella in un modo (in senso orario), quindi disegna la scatola interna nell'altro senso (in senso antiorario) per ottenere l'effetto.
Ecco il codice per una ciambella:
var can = document.getElementById('canvas1');
var ctx = can.getContext('2d');
// Pay attention to my last argument!
//ctx.arc(x,y,radius,startAngle,endAngle, anticlockwise);
ctx.beginPath()
ctx.arc(100,100,100,0,Math.PI*2, false); // outer (filled)
ctx.arc(100,100,55,0,Math.PI*2, true); // inner (unfills it)
ctx.fill();
Esempio:
http://jsfiddle.net/Hnw6a/
Disegno solo un "segmento" di esso può essere fatto facendo il percorso più piccola (potrebbe essere necessario usa beziers invece di arc), o usando una regione di clipping. Dipende molto da come esattamente si vuole un "segmento"
Ecco un esempio: http://jsfiddle.net/Hnw6a/8/
// half doughnut
ctx.beginPath()
ctx.arc(100,100,100,0,Math.PI, false); // outer (filled)
ctx.arc(100,100,55,Math.PI,Math.PI*2, true); // outer (unfills it)
ctx.fill();
aha! questo sembra proprio quello di cui ho bisogno, grazie! –
Invece di riempire e svuotare, perché non accarezzare con una larghezza di grasso? – Phrogz
@Phrogz Potresti volere che il bordo e il riempimento siano colori diversi. –