注意:本文屬於《html5 Canvas繪制圖形入門詳解》系列文章中的一部分。如果你是html5初學者,僅僅閱讀本文,可能無法較深入的理解canvas,甚至無法順暢地通讀本文。請點擊上述鏈接以了解使用html5 canvas繪制圖形的完整內容。
在html5中,CanvasRenderingContext2D
對象也提供了專門用於繪制圓形或弧線的方法,請參考以下屬性和方法介紹:
arc(x, y, radius, startRad, endRad, anticlockwise)
-
在canvas畫布上繪制以坐標點
(x,y)
為圓心、半徑為radius
的圓上的一段弧線。這段弧線的起始弧度是startRad
,結束弧度是endRad
。這里的弧度是以x軸正方向(時鍾三點鍾)為基准、進行順時針旋轉的角度來計算的。anticlockwise
表示是以逆時針方向還是順時針方向開始繪制,如果為true
則表示逆時針,如果為false
則表示順時針。anticlockwise
參數是可選的,默認為false
,即順時針。
arcTo(x1, y1, x2, y2, radius)
-
這個方法將利用當前端點、端點1
(x1,y1)
和端點2(x2,y2)
這三個點所形成的夾角,然后繪制一段與夾角的兩邊相切並且半徑為radius
的圓上的弧線。一般情況下,繪制弧線的開始位置是當前端點,結束位置是端點2,並且弧線繪制的方向就是連接這兩個端點的最短圓弧的方向。此外,如果當前端點不在所指定的圓上,本方法還將繪制一條從當前端點到弧線起點的直線。由於詳細介紹
arcTo()
方法的篇幅較多,請移步至這里查看arcTo()的詳細用法。
在了解了canvas繪制弧線的上述API之后,我們就一起來看看如何使用arc()
繪制弧線。我們已經知道,arc()
接收的第4個和第5個參數表示繪制弧線的開始弧度和結束弧度。相信各位讀者在學校的數學或幾何課程上都學過弧度,弧度是一種角度單位。弧長等於半徑的弧,其所對的圓心角就是1弧度。我們還知道,半徑為r
的圓,其周長為2πr
。在具備這些幾何知識的前提下,我們就可以使用arc()
方法繪制弧線了。
使用canvas繪制弧線
現在,我們就來繪制一條半徑為50px的圓的1/4弧線。
-
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>HTML5 Canvas繪制弧線入門示例</title> 6 </head> 7 <body> 8 9 <!-- 添加canvas標簽,並加上紅色邊框以便於在頁面上查看 --> 10 <canvas id="myCanvas" width="400px" height="300px" style="border: 1px solid red;"> 11 您的瀏覽器不支持canvas標簽。 12 </canvas> 13 14 <script type="text/javascript"> 15 //獲取Canvas對象(畫布) 16 var canvas = document.getElementById("myCanvas"); 17 //簡單地檢測當前瀏覽器是否支持Canvas對象,以免在一些不支持html5的瀏覽器中提示語法錯誤 18 if(canvas.getContext){ 19 //獲取對應的CanvasRenderingContext2D對象(畫筆) 20 var ctx = canvas.getContext("2d"); 21 22 //開始一個新的繪制路徑 23 ctx.beginPath(); 24 //設置弧線的顏色為藍色 25 ctx.strokeStyle = "blue"; 26 var circle = { 27 x : 100, //圓心的x軸坐標值 28 y : 100, //圓心的y軸坐標值 29 r : 50 //圓的半徑 30 }; 31 //沿着坐標點(100,100)為圓心、半徑為50px的圓的順時針方向繪制弧線 32 ctx.arc(circle.x, circle.y, circle.r, 0, Math.PI / 2, false); 33 //按照指定的路徑繪制弧線 34 ctx.stroke(); 35 } 36 </script> 37 </body> 38 </html>
對應的顯示效果如下圖:運行代碼
如上所示,我們設置了繪制的弧線的所在圓的圓心坐標為(100,100)
,半徑為50px。由於一個半徑為r
的圓的周長為2πr
,也就是說,一個完整的圓,其所對應的弧度為2π
(換算成常規角度就是360°),所以我們想要畫一個圓的1/4弧線,只要弧度為π/2(即90°)就可以了。在上面的代碼中,我們使用了JavaScript中表示π的常量Math.PI
。
此外,在上面的代碼中,我們還設置了繪制弧線的方向為順時針方向(false
)。由於起始弧度為0,結束弧度為π/2,因此弧線將從x軸的正方向開始沿着順時針方向繪制,從而得到上面的圖形。如果我們將上述代碼中的弧線繪制方向改為逆時針,會有什么樣的效果呢?
-
1 <script type="text/javascript"> 2 //獲取Canvas對象(畫布) 3 var canvas = document.getElementById("myCanvas"); 4 //簡單地檢測當前瀏覽器是否支持Canvas對象,以免在一些不支持html5的瀏覽器中提示語法錯誤 5 if(canvas.getContext){ 6 //獲取對應的CanvasRenderingContext2D對象(畫筆) 7 var ctx = canvas.getContext("2d"); 8 9 //開始一個新的繪制路徑 10 ctx.beginPath(); 11 //設置弧線的顏色為藍色 12 ctx.strokeStyle = "blue"; 13 var circle = { 14 x : 100, //圓心的x軸坐標值 15 y : 100, //圓心的y軸坐標值 16 r : 50 //圓的半徑 17 }; 18 //沿着坐標點(100,100)為圓心、半徑為50px的圓的逆時針方向繪制弧線 19 ctx.arc(circle.x, circle.y, circle.r, 0, Math.PI / 2, true); 20 //按照指定的路徑繪制弧線 21 ctx.stroke(); 22 } 23 </script>
對應的顯示效果如下:運行代碼
使用canvas繪制圓形
當我們學會了繪制弧線之后,舉一反三,我們想要繪制圓形自然也不在話下,只需要將上述代碼的結束弧度改為2π即可。
-
1 <script type="text/javascript"> 2 //獲取Canvas對象(畫布) 3 var canvas = document.getElementById("myCanvas"); 4 //簡單地檢測當前瀏覽器是否支持Canvas對象,以免在一些不支持html5的瀏覽器中提示語法錯誤 5 if(canvas.getContext){ 6 //獲取對應的CanvasRenderingContext2D對象(畫筆) 7 var ctx = canvas.getContext("2d"); 8 9 //開始一個新的繪制路徑 10 ctx.beginPath(); 11 //設置弧線的顏色為藍色 12 ctx.strokeStyle = "blue"; 13 var circle = { 14 x : 100, //圓心的x軸坐標值 15 y : 100, //圓心的y軸坐標值 16 r : 50 //圓的半徑 17 }; 18 //以canvas中的坐標點(100,100)為圓心,繪制一個半徑為50px的圓形 19 ctx.arc(circle.x, circle.y, circle.r, 0, Math.PI * 2, true); 20 //按照指定的路徑繪制弧線 21 ctx.stroke(); 22 } 23 </script>
對應的顯示效果如下:運行代碼
備注:arc()
方法中的起始弧度參數startRad
和結束弧度參數endRad
都是以弧度為單位,即使你填入一個數字,例如360,仍然會被看作是360弧度。將上述代碼的結束弧度設為360會產生什么用的后果呢?這就要看繪制的方向了(即anticlockwise
參數的值),如果是順時針繪制(false
),則將繪制出一個完整的圓形;如果是逆時針繪制,大於2π的弧度將被轉換為一個弧度相等、但不大於2π的弧度。例如,將上述代碼中的結束弧度設為3π(Math.PI * 3
),如果anticlockwise
為false
,將會顯示為一個完整的圓形,如果為true
,則其顯示效果與設為π時的顯示效果一致。