Canvas實(shí)用技巧及案例2

canvas實(shí)用技巧及案例2

本次來介紹一下實(shí)心圓與線圓及各種弧線的制作方法,首先科普一下相關(guān)知識
arc()方法可以創(chuàng)建用于制作圓形和部分圓形

語法:arc(x,y,radius,startAngle,endAngle,anticlockwise);  

其中x為圓心x軸坐標(biāo),y為圓心y軸的坐標(biāo),radius為圓形的半徑,startAngle為圓形開始角度,endAngle為圓形結(jié)束的角度,anticlockwise判斷是順時針還是逆時針,如何是true為逆時針畫圓,false則為順時針畫圓。

arcTo() 方法在畫布上創(chuàng)建介于兩個切線之間的弧/曲線。

語法:arcTo(x1,y1,x2,y2,r);

x1:弧的起點(diǎn)的 x 坐標(biāo)。y1:弧的起點(diǎn)的 y 坐標(biāo)。x2:弧的終點(diǎn)的 x 坐標(biāo)。y2:弧的終點(diǎn)的 y 坐標(biāo)。r:弧的半徑。

quadraticCurveTo() 方法通過使用表示二次貝塞爾曲線的指定控制點(diǎn),向當(dāng)前路徑添加一個點(diǎn)。
二次貝塞爾曲線需要兩個點(diǎn)。第一個點(diǎn)是用于二次貝塞爾計算中的控制點(diǎn),第二個點(diǎn)是曲線的結(jié)束點(diǎn)。曲線的開始點(diǎn)是當(dāng)前路徑中最后一個點(diǎn)。如果路徑不存在,那么請使用 beginPath() 和 moveTo() 方法來定義開始點(diǎn)。

img_quadraticcurve.gif

開始點(diǎn):
moveTo(20,20)

控制點(diǎn):
quadraticCurveTo(20,100,200,20)

結(jié)束點(diǎn):
quadraticCurveTo(20,100,200,20)

語法:quadraticCurveTo(cpx,cpy,x,y);

cpx:
貝塞爾控制點(diǎn)的 x 坐標(biāo)。
cpy:
貝塞爾控制點(diǎn)的 y 坐標(biāo)。
x:
結(jié)束點(diǎn)的 x 坐標(biāo)。
y:
結(jié)束點(diǎn)的 y 坐標(biāo)。

bezierCurveTo() 方法通過使用表示三次貝塞爾曲線的指定控制點(diǎn),向當(dāng)前路徑添加一個點(diǎn)。
三次貝塞爾曲線需要三個點(diǎn)。前兩個點(diǎn)是用于三次貝塞爾計算中的控制點(diǎn),第三個點(diǎn)是曲線的結(jié)束點(diǎn)。曲線的開始點(diǎn)是當(dāng)前路徑中最后一個點(diǎn)。如果路徑不存在,那么請使用 beginPath() 和 moveTo() 方法來定義開始點(diǎn)。

img_beziercurve.gif

開始點(diǎn):
moveTo(20,20)

控制點(diǎn) 1:
bezierCurveTo(20,100,200,100,200,20)

控制點(diǎn) 2:
bezierCurveTo(20,100,200,100,200,20)

結(jié)束點(diǎn):
bezierCurveTo(20,100,200,100,200,20)

語法:bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y);

其中
cp1x:
第一個貝塞爾控制點(diǎn)的 x 坐標(biāo)。
cp1y:
第一個貝塞爾控制點(diǎn)的 y 坐標(biāo)。
cp2x:
第二個貝塞爾控制點(diǎn)的 x 坐標(biāo)。
cp2y:
第二個貝塞爾控制點(diǎn)的 y 坐標(biāo)。
x:
結(jié)束點(diǎn)的 x 坐標(biāo)。
y:
結(jié)束點(diǎn)的 y 坐標(biāo)。

如果理解起來有難度的話,咱們來寫點(diǎn)代碼就知道什么意思了。首先咱們來繪制實(shí)心圓,代碼如下:
首先還是先在body里面寫上canvas標(biāo)簽,并配置相應(yīng)寬高

<canvas id="aaa" width="900" height="500""></canvas>

然后在javascript里寫

        var c = document.getElementById("aaa");
        var context = c.getContext('2d');

工作結(jié)后開始繪制圓啦。注意!以上步驟是在canvas畫布上畫東西的必要操作!

            //繪制實(shí)心圓
            context.beginPath();
            context.fillStyle = "red";
            context.arc(151,151,150,0,2*Math.PI,true);
            context.closePath();
            context.fill();
canvas_shixinyuan.png

繪制線圓,要注意,繪制下一個圖形前要隱藏上一個圖形的代碼哦

            //繪制線圓 
            context.strokeStyle="#1B8DCC";
            context.arc(151,151,150,0,2*Math.PI,true);
            context.stroke();  
canvas_xianyuan.png

高能來了!!!用之前所說的圓的制作方式,再利用貝塞爾二次元及三次元曲線,咱們來繪制一片葉子,先看效果圖

canvas_yezi.png

以下部分是代碼

        //繪制葉子  
        context.moveTo(100,300);
        context.arcTo(100,0,400,100,200);   //繪制圓弧
        context.stroke();
        
        context.moveTo(100,300);
        context.bezierCurveTo(150,230,350,350,364,88);  //貝塞爾三次元曲線
        context.stroke();
        
        context.moveTo(100,300);
        context.quadraticCurveTo(150,180,364,88);   //貝塞爾二次元曲線
        context.stroke();
        
        context.moveTo(130,250);
        context.quadraticCurveTo(160,200,250,265);
        context.stroke();
        
        context.moveTo(190,190);
        context.quadraticCurveTo(220,150,340,195);
        context.stroke();
        
        context.moveTo(230,160);
        context.quadraticCurveTo(220,130,250,84);
        context.stroke();
        
        context.moveTo(150,225);
        context.quadraticCurveTo(130,200,180,115);
        context.stroke();
        //繪制葉子結(jié)束  

怎么樣,你自己的葉子做出來了嗎,你可以改改里面的數(shù)值看看效果怎么樣哦。如果上面的做完了,可以看下面的,用所知道的知識來繪制一個線性八卦圖和實(shí)心黑白八卦圖,最終結(jié)果如下

canvas_bianxianbagua.png

canvas_shixinbagua.png

以下為線性八卦圖代碼

        //繪制線性八卦圖
        context.beginPath();
        context.arc(150,150,150,0,2*Math.PI,true);  //繪制外圓
        context.moveTo(150,0);
        context.bezierCurveTo(0,150,300,150,150,300);  //繪制S形曲線
        context.stroke();
        context.closePath();
        
        context.beginPath();
        context.arc(200,75,20,0,2*Math.PI,true);    //繪制小圓
        context.stroke();
        context.closePath();
        
        context.beginPath();
        context.arc(100,225,20,0,2*Math.PI,true);   //繪制小圓
        context.stroke();
        context.closePath();
        //繪制線性八卦圖結(jié)束

以下為實(shí)心黑白八卦圖代碼,實(shí)心八卦圖全是通過用arc()方法畫圓組合而成,兩個黑白半圓,兩個黑白半小圓,兩個黑白整圓

        //實(shí)心八卦圖
        context.beginPath();
        context.fillStyle = '#000';
        context.arc(200,200,200,1.5*Math.PI,0.5*Math.PI,true);//黑半圓
        context.closePath();
        context.fill();
        context.beginPath();
        context.fillStyle = '#eee';
        context.arc(200,200,200,1.5*Math.PI,0.5*Math.PI,false);//白半圓
        context.closePath();
        context.fill();
        context.beginPath();
        context.fillStyle = '#000';
        context.arc(200,300,100,0.5*Math.PI,1.5*Math.PI,true);//黑小半圓
        context.closePath();
        context.fill();
        context.beginPath();
        context.fillStyle = '#eee';
        context.arc(200,100,100,0.5*Math.PI,1.5*Math.PI,false);//白小半圓
        context.closePath();
        context.fill();
        context.beginPath();
        context.fillStyle = '#000';
        context.arc(200,100,20,0,2*Math.PI,false);//黑小整圓
        context.closePath();
        context.fill();
        context.beginPath();
        context.fillStyle = '#eee';
        context.arc(200,300,20,0,2*Math.PI,false);//白小整圓
        context.closePath();
        context.fill();
        //實(shí)心八卦圖繪制結(jié)束  

看懂了嗎?如果有什么不懂得可以給我發(fā)郵箱或者關(guān)注我的微博私聊我哦,相信我是有耐心給你解答的!【這是一個斜眼笑的表情】
文章轉(zhuǎn)自https://royalzhao.github.io/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 一:canvas簡介 1.1什么是canvas? ①:canvas是HTML5提供的一種新標(biāo)簽 ②:HTML5 ...
    GreenHand1閱讀 4,707評論 2 32
  • 一、canvas簡介 1.1 什么是canvas?(了解) 是HTML5提供的一種新標(biāo)簽 Canvas是一個矩形區(qū)...
    Looog閱讀 3,953評論 3 40
  • 一、簡介 HTML5 中的定義:“它是依賴分辨率的位圖畫布,你可以在 canvas 上面繪制任何圖形,甚至加載照片...
    destiny0904閱讀 10,572評論 1 4
  • 【canvas】 《2.6.5 面向?qū)ο蠡A(chǔ)復(fù)習(xí)補(bǔ)充:》 創(chuàng)建對象的方式: * var o = { name: '...
    夜幕小草閱讀 387評論 0 0
  • 談?wù)勜惾麪柷€ 最近在做項目的時候,需要用到一個動畫,非常簡單的動畫,簡單到就是直接對一個View做平移… 然而雖...
    雨潤聽潮閱讀 6,047評論 1 16