在 HTML5 Canvas 中,我們可以通過 arc 方法來繪制圓形:
// context.arc(x, y, r, sAngle, eAngle, counterclockwise);
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
ctx.arc(100, 100, 50, 0, 2 * Math.PI);
ctx.fill();
但如何繪制一個扇形呢?是不是簡單地修改結束角度 2 * Math.PI 就可以了呢?
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
ctx.arc(100, 100, 50, 0, 1.5 * Math.PI);
ctx.fill();
然而,我們會看到一個不符合我們預期的圖形:

因為在 arc 方法是用來創建一條弧線的,而如果直接將弧線的起點和終點閉合,再進行填充,自然繪制出的是上面的圖形了。
知道了原因,要解決就很簡單了,只要讓這條弧線與圓心進行閉合,就剛好形成了一個扇形:
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
// 開始一條新路徑
ctx.beginPath();
// 位移到圓心,方便繪制
ctx.translate(100, 100);
// 移動到圓心
ctx.moveTo(0, 0);
// 繪制圓弧
ctx.arc(0, 0, 50, 0, Math.PI * 1.5);
// 閉合路徑
ctx.closePath();
ctx.fill();

這里的重點在於 moveTo 和 closePath,將路徑的起點設置在圓心,而最后閉合路徑,正好就成為了一個扇形。
代碼也可以抽取為通用的方法,如下:
CanvasRenderingContext2D.prototype.sector = function(x, y, radius, sAngle, eAngle, counterclockwise) {
this.beginPath();
this.translate(x, y);
this.moveTo(0, 0);
this.arc(0, 0, radius, sAngle, eAngle, counterclockwise);
this.closePath();
return this;
};
來自藍飛技術部落格
