Вы делаете это путем создания одного пути с двумя дугами.
Вы рисуете один круг по часовой стрелке, а затем рисуете второй круг, идущий против часовой стрелки.Я не буду вдаваться в подробности этого, но то, как строятся пути, знает, как принять это за повод, чтобы заполнить эту часть пути.Подробнее о том, что он делает, вы можете этой статьи вики .
То же самое сработало бы, если бы вы рисовали прямоугольник в рамке.Вы рисуете коробку в одну сторону (по часовой стрелке), затем рисуете внутреннюю рамку в другую сторону (против часовой стрелки), чтобы получить эффект.
Вот код для пончика:
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();
Пример:
http://jsfiddle.net/Hnw6a/
Рисование только его «сегмента» может быть выполнено путем уменьшения пути (вам может потребоваться использовать Безье вместо дуги) или путем отсеченияобласть, край.Это действительно зависит от того, как именно вы хотите «сегмент»
Вот один пример: 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();