亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > HTML > 正文

canvas學習總結三之繪制路徑-線段

2024-08-26 00:21:19
字體:
來源:轉載
供稿:網友

Canvas繪圖環境中有些屬于立即繪制圖形方法,有些繪圖方法是基于路徑的。

立即繪制圖形方法僅有兩個strokeRect(),fillRect(),雖然strokezText(),fillText()方法也是立即繪制的,但是文本不算是圖形。

基于路徑的繪制系統

大多數繪制系統,如:SVG(Scalable Verctor Graphics, 可縮放的矢量圖形),Adobe Illustrator等,都是基于路徑的,

使用這些繪制系統時,你需要先定義一個路徑,然后再對其進行描邊或填充,也可以描邊加填充這樣圖形才能顯示出來。

Canvas中的三種繪制方式:

canvas,繪制路徑,線段

繪制一條線段

Canvas繪圖環境中,線段也是基于路徑繪制的,稱為線性路徑,創建線性路徑的方法:moveTO()與lineTo(),在創建路徑之后調用stroke()方法,才能在Canvas中畫出線段出來。

這就是前面我們所說的基于路徑的繪制方法,必須對其進行描邊或者填充;

通常兩點連一線因此繪制線段非常簡單,通過moveTO()指定線的起點,通過lineTo()移動到另一個點。

function drawLine(){    cxt.moveTo(50, 50);    cxt.lineTo(100, 100);}

然而這樣我們在畫布中是看不見線段的,前面我們說到基于路徑的繪制方法,必須要描邊或者填充。所以要想看到結果,我們必須還要使用stroke()方法。

因此我們把方法修改成下面這樣就會繪制出一條線段

function drawLine(){    cxt.moveTo(50, 50);    cxt.lineTo(200, 200);    cxt.stroke();}

canvas,繪制路徑,線段

我們只使用lineTo()也是能在畫布中繪制出線段的,我們把上面的代碼改成如下面所示,效果也是一樣的

function drawLine(){    cxt.lineTo(50, 50);    cxt.lineTo(200, 200);    cxt.stroke();}

總結下moveTo()與lineTo()的用法

  • moveTo(x,y): 將筆觸移動到指定的坐標x以及y上,向當前路徑中增加一條子路徑,該方法不會清除當前路徑中的任何子路徑。
  • lineTo(x,y): 繪制一條從當前位置到指定x以及y位置的直線,如果當前路徑中沒有子路徑,那么這個方法的行為與moveTo()一樣。如果當前路徑中存在子路徑,此方法會將你所指定的這個點加入子路徑中。

改變線段的樣式

改變線段的寬度

function= 14;    cxt.lineTo(50, 50);    cxt.lineTo(200, 200);    cxt.stroke();}

canvas,繪制路徑,線段

改變線段的顏色

function drawLine(){    cxt.lineWidth = 14;    cxt.strokeStyle = 'green';    cxt.lineTo(50, 50);    cxt.lineTo(200, 200);    cxt.stroke();}

canvas,繪制路徑,線段

我們還可以利用CanvasGradient對象或者CanvasPattern對象給線段添加漸變色或圖案

function drawLine(){    cxt.lineWidth = 14;    var gradient = cxt.createLinearGradient(0, 0, canvas.width/2, canvas.height/2);    gradient.addColorStop(0, 'blue');    gradient.addColorStop(0.5, 'purple');    gradient.addColorStop(1, 'yellow');    cxt.strokeStyle = gradient;    cxt.lineTo(50, 50);    cxt.lineTo(200, 200);    cxt.stroke();}

canvas,繪制路徑,線段

 beginPath()與closePath()

從上面canvas中的三種繪制方式中我們可以看出,第二行的弧形路徑是開放路徑,最后一行的弧形是封閉路徑。那么封閉的路徑是怎么實現的呢?

下面我們來看看canvas中路徑繪制中兩個比較重要的方法

  • beginPath(): 清除當前所有子路徑,以此來重置當前路徑,重新規劃一條路徑。
  • closePath(): 用于封閉某段開放路徑。不是必需的,如果圖形是已經閉合了的,即當前點為開始點,該函數什么也不做。

先繪制出一條折線

function drawLine(){    cxt.strokeStyle = 'green';    cxt.lineWidth = 2;    cxt.moveTo(50, 50);    cxt.lineTo(50, 150);    cxt.lineTo(150, 150);    cxt.stroke();}

canvas,繪制路徑,線段

修改上面例子中的代碼在代碼中添加beginPath()與closePath()方法

function drawLine(){    //描邊三角形    cxt.strokeStyle = 'green';    cxt.lineWidth = 2;    cxt.beginPath();    cxt.moveTo(50, 50);    cxt.lineTo(50, 150);    cxt.stroke();    cxt.beginPath();    cxt.lineTo(150, 150);    cxt.lineTo(150, 250);    cxt.stroke();  cxt.closePath();}

canvas,繪制路徑,線段

可以看出我們在畫布中繪制了兩條路徑

注意:調用beginPath()之后,或者canvas剛建的時候,第一條路徑構造命令通常被視為是moveTo()。所以我們在繪制圖形的時候一定要先使用beginPath()。

我們繼續修改我們的代碼

function drawLine(){    //描邊三角形    cxt.strokeStyle = 'green';    cxt.lineWidth = 2;    cxt.beginPath();    cxt.moveTo(50, 50);    cxt.lineTo(50, 150);    cxt.lineTo(150, 150);    cxt.closePath();    cxt.stroke();    //折線    cxt.translate(150, 0);    cxt.strokeStyle = 'red';    cxt.lineWidth = 2;    cxt.beginPath();    cxt.moveTo(50, 50);    cxt.lineTo(50, 150);    cxt.lineTo(150, 150);    cxt.stroke();    cxt.closePath();    //綠色填充三角形    cxt.translate(150, 0);    cxt.fillStyle = 'green';    cxt.lineWidth = 2;    cxt.beginPath();    cxt.moveTo(50, 50);    cxt.lineTo(50, 150);    cxt.lineTo(150, 150);    cxt.fill();    cxt.closePath();    //紅色填充三角形    cxt.translate(150, 0);    cxt.fillStyle = 'red';    cxt.lineWidth = 2;    cxt.beginPath();    cxt.moveTo(50, 50);    cxt.lineTo(50, 150);    cxt.lineTo(150, 150);    cxt.closePath();    cxt.fill();}

canvas,繪制路徑,線段

從上面的例子我們可以看出closePath()的位置不同,也會影響我們的圖形

注意:當你調用fill()函數時,所有沒有閉合的形狀都會自動閉合,所以此時closePath()函數不是必須的。

但是調用stroke():如果你在stroke()方法之前只用closePath()會形成閉合路徑,如果在stroke()方法之后調用closePath()方法,此時圖形已經繪制完成,當前的繪制路徑已經關閉,所以closePath()方法不起作用。

線段與像素邊界

先來看一個例子

function drawLine(){    //描邊三角形    cxt.lineWidth = 1;    cxt.beginPath();    cxt.moveTo(50, 50);    cxt.lineTo(450, 50);    cxt.stroke();    cxt.beginPath();    cxt.moveTo(50.5, 150.5);    cxt.lineTo(450.5, 150.5);    cxt.stroke();}

canvas,繪制路徑,線段

從圖中我們可以看出,我們將兩條線段的lineWidth都是設置為1像素,但是上面的線段畫出的卻是兩像素。 

如果你在某2個像素的邊界處繪制一條1像素寬的線段,那么該線段實際會占據2個像素的寬度;

因為當你在像素邊界處繪制一條1像素寬度的垂直線段時,canvas的繪圖環境對象會試著將半個像素畫在邊界中線的右邊,將另外半個像素畫在邊界中線的左邊。

然而,在一個整像素的范圍內繪制半個像素寬的線段是不可能的,所以在左右兩個方向上的半個像素都被擴展為1個像素。

另外一方面,繪制在兩個像素之間,這樣的話,中線左右兩端的那半個像素就不會延伸,它們結合起來恰好占據1個像素的寬度。所以說,如果要繪制一條真正1像素寬度的線段,你必須將該線段繪制在某兩個像素之間

canvas,繪制路徑,線段

網格的繪制

既然我們已經明白了如何繪制真正的1像素的線段,那我們就開始繪制網格

function drawLine(stepx, stepy){    cxt.lineWidth = 0.5;    cxt.strokeStyle = 'green';    //繪制豎線    for(var i= stepx + 0.5; i< cxt.canvas.width; i+= stepx){        cxt.beginPath();        cxt.moveTo(i, 0);        cxt.lineTo(i, cxt.canvas.height);        cxt.stroke();    }    //繪制橫線    for(var i= stepy + 0.5; i< cxt.canvas.height; i+= stepy){        cxt.beginPath();        cxt.moveTo(0, i);        cxt.lineTo(cxt.canvas.width, i);        cxt.stroke();    }}drawLine(10, 10);

canvas,繪制路徑,線段

上面例子中我們將線段繪制在兩個像素之間的像素上,而且繪制出來的線段僅有0.5像素寬,

雖說canvas規范沒有明文規定,不過所有瀏覽器的Canvas實現都使用了“抗鋸齒”技術,以便創建出“亞像素”線段的繪制效果來

總結

本節內容主要講解canvas中路徑中線性路徑的繪制方法,主要是利用 moveTo()定義起點,lineTo()定義終點,stroke()描繪當前路徑。這三個方法繪制線段

canvas中繪制路徑有兩個重要的方法,beginPath()與closePath()。繪制圖形之前先調用beginPath()是繪制多個圖形必要的步驟。

closePath()在使用fill()時是可以省略的,而且還要注意closePath()方法的調用位置。

繪制線段時我們可以使用 lineWidth改變線段的寬度,strokeStyle改變線段的顏色。

弄清楚線段的像素邊界,這樣我們才能繪制出真正的1像素線寬的線段。

對canvas繪制圖形感興趣的同學,請持續關注后續更新,如有不對的地方也請指出并多多交流。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到HTML教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕免费精品一区| 亚洲精品久久久久| 欧美精品在线视频观看| 国产精品亚洲激情| 成人精品在线观看| 国产伦精品免费视频| 色一区av在线| 日韩大片免费观看视频播放| 欧洲成人性视频| 国产在线视频2019最新视频| 精品久久久久久国产| 欧美精品在线免费播放| 久久精品国产久精国产一老狼| 欧美成人精品在线观看| 色妞在线综合亚洲欧美| 久久99久国产精品黄毛片入口| 色悠久久久久综合先锋影音下载| 久久亚洲欧美日韩精品专区| 粗暴蹂躏中文一区二区三区| 日韩av快播网址| 日本三级久久久| 亚洲黄页网在线观看| 色哟哟入口国产精品| 亚洲国产精品专区久久| 伊人男人综合视频网| 97婷婷大伊香蕉精品视频| 日韩欧美一区二区三区久久| 欧美成人精品一区二区| 91香蕉电影院| 日韩中文字幕av| 久久黄色av网站| 91在线高清视频| 97久久精品视频| 日本精品一区二区三区在线| 国产精品jizz在线观看麻豆| 国产精品久久久久久影视| 亚洲欧美日韩天堂| 久热在线中文字幕色999舞| 日韩在线观看你懂的| 亚洲xxx视频| 亚洲尤物视频网| 国产在线播放不卡| 久久久亚洲国产天美传媒修理工| 欧美中文字幕视频在线观看| 欧美影院在线播放| 韩剧1988在线观看免费完整版| 日韩在线视频线视频免费网站| 国产精品一区久久久| 精品福利在线观看| 欧美孕妇孕交黑巨大网站| 中文字幕日韩有码| 欧美大片在线影院| 成人午夜高潮视频| 国产精品一区专区欧美日韩| 91精品视频观看| 丝袜情趣国产精品| 亚洲小视频在线观看| 免费91麻豆精品国产自产在线观看| 97视频在线观看亚洲| 成人免费视频a| 亚洲精品成人网| 日韩欧美在线免费| 欧美一级电影久久| 久久久在线视频| 中文字幕日韩欧美在线视频| 久久久www成人免费精品张筱雨| 91av在线不卡| 人人澡人人澡人人看欧美| 成人动漫网站在线观看| 欧美日韩国产在线看| 欧美在线视频在线播放完整版免费观看| 欧美大尺度在线观看| 国产精品自产拍高潮在线观看| 久久中文字幕在线视频| 日韩成人av一区| 亚洲视频在线免费看| 成人福利网站在线观看| 久久久中文字幕| 日韩一区在线视频| 91av视频在线观看| 激情懂色av一区av二区av| 日韩av手机在线观看| 国产精品成人免费视频| 77777亚洲午夜久久多人| 热re91久久精品国99热蜜臀| 欧美怡春院一区二区三区| 国产精品狼人色视频一区| 国产精品白嫩初高中害羞小美女| 国产97在线观看| 欧美精品videofree1080p| 亚洲欧美色图片| 中文欧美日本在线资源| 亚洲国产日韩欧美综合久久| 欧美激情视频播放| 国产精品香蕉国产| 成人性生交大片免费看视频直播| 亚洲国产精品电影在线观看| 亚洲精品第一页| 欧洲美女免费图片一区| 日韩av免费看网站| 在线播放日韩专区| 91免费版网站入口| 欧美高清视频免费观看| 亚洲成年人在线播放| 亚洲最新在线视频| 久久精品视频中文字幕| 亚洲最大福利视频网| 在线视频欧美日韩精品| 日韩性生活视频| 日韩综合视频在线观看| 国产精品大片wwwwww| 97超碰蝌蚪网人人做人人爽| 色偷偷91综合久久噜噜| 成人免费高清完整版在线观看| 91色琪琪电影亚洲精品久久| 精品久久久久久久久久国产| 中文日韩电影网站| 久久久av一区| 免费不卡在线观看av| 精品视频在线播放| 久久久亚洲网站| 精品少妇v888av| 欧美午夜美女看片| 欧美国产激情18| 欧美另类极品videosbestfree| 亚洲天堂色网站| 亚洲高清一二三区| 国产区亚洲区欧美区| 秋霞成人午夜鲁丝一区二区三区| 97国产一区二区精品久久呦| 国外色69视频在线观看| 日韩av片免费在线观看| 精品动漫一区二区| 欧美极品少妇xxxxⅹ喷水| 深夜福利国产精品| 日韩av电影在线播放| 国产99视频在线观看| 国产欧美久久久久久| 日韩免费不卡av| 亚洲欧美一区二区三区久久| 久久久久久国产免费| 91精品视频大全| 日韩中文字幕免费看| 日本一区二区三区在线播放| 久久777国产线看观看精品| 日韩视频免费观看| 中文字幕精品视频| 久久精品电影一区二区| 国产亚洲综合久久| 69**夜色精品国产69乱| 亚洲国产天堂久久综合网| 国产一区二区免费| 国产精品爱啪在线线免费观看| 欧美激情喷水视频| 成人av在线天堂| 国产精品久久久久久久久久| 国产精品va在线播放我和闺蜜| 欧美又大又硬又粗bbbbb| 国产精品h在线观看| 91精品中国老女人| 欧美成人精品h版在线观看| 51视频国产精品一区二区| 亚洲变态欧美另类捆绑| 91成人在线视频|