鍍金池/ 教程/ HTML/ Ch10 使用切點繪制圓弧
Ch22 最后的API
Ch14 旋轉變換
Ch19 全局陰影與圖像合成
Ch12 三次貝塞爾曲線
Ch4 多線條組成圖形
Ch7 填充顏色
Ch6 線條的屬性
Ch20 裁剪和繪制圖像
CANVAS——Draw on the Web
Ch18 文本對齊與度量
Ch8 填充樣式
Ch15 縮放變換
Ch9 繪制標準圓弧
Ch2 開始前的準備
Ch16 矩陣變換
Ch3 從線段開始
Ch10 使用切點繪制圓弧
Ch21 非零環(huán)繞原則
Ch11 二次貝塞爾曲線
Ch5 繪制矩形
Ch17 文本顯示與渲染
Ch1 HTML5簡介
Ch13 平移變換

Ch10 使用切點繪制圓弧

arcTo()介紹

arcTo()方法接收5個參數,分別是兩個切點的坐標和圓弧半徑。這個方法是依據切線畫弧線,即由兩個切線確定一條弧線。 具體如下。

arcTo(x1,y1,x2,y2,radius)

這個函數以給定的半徑繪制一條弧線,圓弧的起點與當前路徑的位置到(x1, y1)點的直線相切,圓弧的終點與(x1, y1)點到(x2, y2)的直線相切。因此其通常配合moveTo()lineTo()使用。其能力是可以被更為簡單的arc()替代的,其復雜就復雜在繪制方法上使用了切點。

使用切點繪制弧線

下面的案例我把切線也繪制出來了,看的更清楚一些。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>繪制弧線</title>
    <style>
        body { background: url("./images/bg3.jpg") repeat; }
        #canvas { border: 1px solid #aaaaaa; display: block; margin: 50px auto; }
    </style>
</head>
<body>
<div id="canvas-warp">
    <canvas id="canvas">
        你的瀏覽器居然不支持Canvas?!趕快換一個吧??!
    </canvas>
</div>

<script>
    window.onload = function(){
        var canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 600;
        var context = canvas.getContext("2d");
        context.fillStyle = "#FFF";
        context.fillRect(0,0,800,600);

        drawArcTo(context, 200, 200, 600, 200, 600, 400, 100);
    };

    function drawArcTo(cxt, x0, y0, x1, y1, x2, y2, r){
        cxt.beginPath();
        cxt.moveTo(x0, y0);
        cxt.arcTo(x1, y1, x2, y2, r);

        cxt.lineWidth = 6;
        cxt.strokeStyle = "red";
        cxt.stroke();

        cxt.beginPath();
        cxt.moveTo(x0, y0);
        cxt.lineTo(x1, y1);
        cxt.lineTo(x2, y2);

        cxt.lineWidth = 1;
        cxt.strokeStyle = "#0088AA";
        cxt.stroke();

    }
</script>
</body>
</html>

演示 10-1

運行結果:

繪制弧線

這個案例也很好說明了arcTo()的各個關鍵點的作用。為了更清楚的解釋,我再標注一個分析圖。

arcTo()詳解

這里注意一下,arcTo()繪制的起點是(x0, y0),但(x0, y0)不一定是圓弧的切點。真正的arcTo()函數只傳入(x1, y1)和(x2, y2)。其中(x1, y1)稱為控制點,(x2, y2)是圓弧終點的切點,它不一定在圓弧上。但(x0, y0)一定在圓弧上。

有一點點繞,下面我們改變drawArcTo()函數的參數來試驗一下。

  • (x2, y2)不一定在弧線上: drawArcTo(context, 200, 100, 600, 100, 600, 400, 400);

(x2, y2)不一定在弧線上

  • (x0, y0)一定在弧線上: drawArcTo(context, 400, 100, 600, 100, 600, 400, 400);

(x0, y0)一定在弧線上

挺有意思的,它為了經過(x0, y0)直接將切點和(x0, y0)連接起來形成線段。好執(zhí)著的弧線……

繪制微信對話框

大家可以嘗試著使用Canvas繪制一下微信聊天界面,作為練習與鞏固。

微信對話框

這里使用到了繪制矩形,繪制圓角矩形,繪制多線條圖形,填充顏色的一些知識。還有一些 Canvas文本API 我們并沒有說到,所以大家只要能繪制出一個大概的界面就算合格了。能夠繪制出來,也就基本掌握了Canvas API。

其實上述對話是生成出來的——“微信界面生成器網頁版”,可謂是微商神器。是不是非常的酷?

微信生成器網頁版

這只是暑假花兩天時間寫的最初版本,還尚未達到發(fā)布的地步,在我寫本節(jié)的時候,這個網頁的界面還正在優(yōu)化中。大家可以嘗試自己動手做做,也可以關注和參考我的這個小項目github:微信界面生成器。本節(jié)就不再重復給出界面代碼了。

好了,學到這里基本上已經學完了所有基本的Canvas繪圖的api,大家拿起自己的畫筆,自由的發(fā)揮吧!

上一篇:Ch15 縮放變換下一篇:Ch6 線條的屬性