日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁(yè) > 編程 > HTML > 正文

canvas學(xué)習(xí)總結(jié)三之繪制路徑-線段

2024-08-26 00:21:19
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

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

基于路徑的繪制系統(tǒng)

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

使用這些繪制系統(tǒng)時(shí),你需要先定義一個(gè)路徑,然后再對(duì)其進(jìn)行描邊或填充,也可以描邊加填充這樣圖形才能顯示出來(lái)。

Canvas中的三種繪制方式:

canvas,繪制路徑,線段

繪制一條線段

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

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

通常兩點(diǎn)連一線因此繪制線段非常簡(jiǎn)單,通過(guò)moveTO()指定線的起點(diǎn),通過(guò)lineTo()移動(dòng)到另一個(gè)點(diǎn)。

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

然而這樣我們?cè)诋?huà)布中是看不見(jiàn)線段的,前面我們說(shuō)到基于路徑的繪制方法,必須要描邊或者填充。所以要想看到結(jié)果,我們必須還要使用stroke()方法。

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

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

canvas,繪制路徑,線段

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

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

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

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

改變線段的樣式

改變線段的寬度

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對(duì)象或者CanvasPattern對(duì)象給線段添加漸變色或圖案

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中的三種繪制方式中我們可以看出,第二行的弧形路徑是開(kāi)放路徑,最后一行的弧形是封閉路徑。那么封閉的路徑是怎么實(shí)現(xiàn)的呢?

下面我們來(lái)看看canvas中路徑繪制中兩個(gè)比較重要的方法

  • beginPath(): 清除當(dāng)前所有子路徑,以此來(lái)重置當(dāng)前路徑,重新規(guī)劃一條路徑。
  • closePath(): 用于封閉某段開(kāi)放路徑。不是必需的,如果圖形是已經(jīng)閉合了的,即當(dāng)前點(diǎn)為開(kāi)始點(diǎn),該函數(shù)什么也不做。

先繪制出一條折線

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,繪制路徑,線段

可以看出我們?cè)诋?huà)布中繪制了兩條路徑

注意:調(diào)用beginPath()之后,或者canvas剛建的時(shí)候,第一條路徑構(gòu)造命令通常被視為是moveTo()。所以我們?cè)诶L制圖形的時(shí)候一定要先使用beginPath()。

我們繼續(xù)修改我們的代碼

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()的位置不同,也會(huì)影響我們的圖形

注意:當(dāng)你調(diào)用fill()函數(shù)時(shí),所有沒(méi)有閉合的形狀都會(huì)自動(dòng)閉合,所以此時(shí)closePath()函數(shù)不是必須的。

但是調(diào)用stroke():如果你在stroke()方法之前只用closePath()會(huì)形成閉合路徑,如果在stroke()方法之后調(diào)用closePath()方法,此時(shí)圖形已經(jīng)繪制完成,當(dāng)前的繪制路徑已經(jīng)關(guān)閉,所以closePath()方法不起作用。

線段與像素邊界

先來(lái)看一個(gè)例子

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都是設(shè)置為1像素,但是上面的線段畫(huà)出的卻是兩像素。 

如果你在某2個(gè)像素的邊界處繪制一條1像素寬的線段,那么該線段實(shí)際會(huì)占據(jù)2個(gè)像素的寬度;

因?yàn)楫?dāng)你在像素邊界處繪制一條1像素寬度的垂直線段時(shí),canvas的繪圖環(huán)境對(duì)象會(huì)試著將半個(gè)像素畫(huà)在邊界中線的右邊,將另外半個(gè)像素畫(huà)在邊界中線的左邊。

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

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

canvas,繪制路徑,線段

網(wǎng)格的繪制

既然我們已經(jīng)明白了如何繪制真正的1像素的線段,那我們就開(kāi)始繪制網(wǎng)格

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,繪制路徑,線段

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

雖說(shuō)canvas規(guī)范沒(méi)有明文規(guī)定,不過(guò)所有瀏覽器的Canvas實(shí)現(xiàn)都使用了“抗鋸齒”技術(shù),以便創(chuàng)建出“亞像素”線段的繪制效果來(lái)

總結(jié)

本節(jié)內(nèi)容主要講解canvas中路徑中線性路徑的繪制方法,主要是利用 moveTo()定義起點(diǎn),lineTo()定義終點(diǎn),stroke()描繪當(dāng)前路徑。這三個(gè)方法繪制線段

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

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

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

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

對(duì)canvas繪制圖形感興趣的同學(xué),請(qǐng)持續(xù)關(guān)注后續(xù)更新,如有不對(duì)的地方也請(qǐng)指出并多多交流。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到HTML教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
日韩视频1区| 中文字幕欧美亚洲| 91精品国产经典在线观看| 日韩中文字幕在线播放| 精品一二三四| 日韩精品免费观看视频| 久久99蜜桃精品久久久久小说| 精品国产乱码一区二区| 91欧美日韩麻豆精品| 欧美国产综合视频| 国产一卡2卡3卡四卡网站| 中文在线第一页| 一区二区三区在线播放欧美| 日韩精品视频网站| 日韩不卡高清视频| 999精品在线| av最新网址| 日韩国产成人| 日韩美女中文字幕| 国产激情久久久| 中文字幕日韩精品在线| 日韩精品在线播放| 九色蝌蚪视频在线| 欧美日韩亚洲视频| 中文字幕 亚洲视频| 国产婷婷一区二区| 国产欧美日韩久久| 国产视频一区三区| 国产成人精品网址| www.中文字幕在线观看| 亚洲黄在线观看| 99精品视频99| 久久riav| 91久久久久| 二区三区中文字幕| 欧美日韩中文字幕在线观看| 欧美性生交大片免费| 日韩精品在线免费看| 国产h片在线观看| 午夜福利一区二区三区| 欧美激情视频一区二区三区在线播放 | 久久精品国产视频| 精品日韩av| 伊人国产视频| 黄色片免费在线| 国产免费电影网站入口| 九七久久人人| 欧美日韩午夜精品| 欧美精品一区二区三区在线播放| 韩国v欧美v日本v亚洲| 视频一区三区| 亚洲欧美久久久| 91精品国产综合久久精品app| 亚洲欧美中文在线视频| 日韩精品乱码av一区二区| 顶级网黄在线播放| 午夜少妇久久久久久久久| 精品全国在线一区二区| 欧美日韩夫妻久久| aaa欧美日韩| 91蜜桃婷婷狠狠久久综合9色| 国产区日韩欧美| 在线国产三级| 欧美日韩999| 麻豆精品视频入口| 蜜桃精品视频| 国产丝袜欧美中文另类| 午夜亚洲一区| 91吃瓜在线观看| 亚洲乱码在线观看| 日韩激情一区| 国产乱码午夜在线视频| 午夜一区二区三区| 国产日韩免费| 日韩中文字幕第一页| а√天堂中文在线资源8| 免费精品国产自产拍在| 欧美wwww| 国产激情久久久| 亚洲一区资源| 91精品国产经典在线观看| 国产欧美日产一区| 久久夜色精品国产欧美乱极品| 一区二区在线观| a天堂中文在线官网在线| 久久精品视频免费看| 久久视频一区| 中文字幕欧美日韩在线不卡| 精品国产乱码久久久久久蜜臀 | 国产www.大片在线| 久久福利视频一区二区| 黄色视屏免费在线观看| 亚洲 欧美 精品| 色综合久久88色综合天天免费| 在线精品观看| 一区二区三区精品在线观看| 在线日韩中文| av高清一区| 精品一二三区视频| 欧美日韩中文字幕日韩欧美| 亚洲大片免费看| 国产一区在线精品| 婷婷中文字幕综合| 91精品在线观看视频| 日韩欧美国产一二三区| 欧美国产小视频| 日韩精品视频免费| 免费视频中文字幕| 国产婷婷一区二区| 免费精品国产自产拍观看| 国产欧美日韩精品综合| 91精品综合久久| 欧美日韩精品免费看| 欧美国产日韩综合| 欧美国产91| 国产日韩精品在线看| av手机天堂| 久久久精品午夜少妇| 日韩欧美在线精品| 91精品久久久久久蜜臀| 一区视频在线播放| 日韩欧美中文视频| 日本精品国语自产拍在线观看| 国产成人日日夜夜| 二区中文字幕| 久久99精品久久久久子伦| 亚洲羞羞网站| 欧美日韩中文字幕一区| 日韩精品一页| 国产欧美日韩最新| 日韩免费电影网站| 精品久久九九| 国产99在线 | 亚洲| 欧美日韩综合视频网址| 精品视频—区二区三区免费| 阿v免费在线观看| 国产欧美日韩综合| 中文字幕亚洲第一| 日韩高清不卡在线| 婷婷精品进入| 精品视频999| 一区二区不卡久久精品| 免费精品国产自产拍在| 天堂在线中文资源| www.eeuss影院| 高清中文字幕在线| 日韩精品丝袜在线| 午夜一区二区三区免费| 欧美精选午夜久久久乱码6080| 日韩欧美中文第一页| 欧美另类久久久品| 国产黄色在线观看| 91麻豆精品国产91久久久使用方法| 二区三区中文字幕| 91精品在线观看视频| 一区二区国产在线| 国产欧美日韩综合| 国产婷婷色一区二区三区在线| 日韩精品视频在线观看视频| 亚洲素人一区二区| 国产99在线 | 亚洲| √天堂资源中文www| 久久精品卡一| 精品人妻二区中文字幕| 亚洲黄在线观看| 中文在线视频观看| 美女黄a一级视频| 午夜一区二区三区| 亚洲欧美韩国综合色| 国产免费久久| 丰满少妇一区| 国产成人精品三级| 久久久久久久久综合| 国产久卡久卡久卡久卡视频精品| 国产在线精品日韩| 国产一区精品在线| 日韩中文字幕视频在线观看| 精品熟女一区二区三区| 国产不卡一区二区在线观看| 在线视频观看日韩| 亚洲福利精品在线| 国产小视频在线| 国产一级免费| 亚洲大胆人体av| 一级一片免费视频| 国产一区成人| 亚洲一区在线观看网站| 91精品国产综合久久久久久漫画 | 国产乱一区二区| 国产一级在线播放| 亚洲视频中文字幕| 中文字幕日韩亚洲| 亚洲 欧美 精品| 欧美日韩国产影片| 国产视频aaa| 欧美一级欧美三级在线观看| 亚洲女同中文字幕| 精品亚洲综合| 欧美日韩亚洲第一| 日韩不卡中文字幕| 日韩欧美中文视频| 国产区高清在线| 精品中文字幕在线| 欧美日韩综合在线观看| 亚洲综合中文字幕在线| 久久久精品国产99久久精品芒果| 中文字幕4区| 在线观看国产一级片| 免费国产h视频在线观看86| 91精品国产综合久久精品app| 91精品国产手机| 91精品久久久久久蜜臀| 亚洲二区自拍| 99色在线视频| 91精品蜜臀在线一区尤物| 欧美日韩中文在线| 中文字幕 欧美 日韩| 欧美日韩在线播放视频| 在线视频不卡国产V| 中文字幕在线亚洲| 国产蜜臀在线| 欧美国产综合在线V| 国产小视频免费在线网址| 精品久久久网| 国产蜜臀在线| 久久精品人妻一区二区三区| 国产亚洲视频中文字幕视频| 亚洲福利一区| 国产视频中文字幕在线观看| 国产在线不卡一区| 77777_亚洲午夜久久多人| 中文字幕亚洲区| 日本亚洲视频在线| 亚洲免费专区| 欧美日韩一级视频| 久久久精品国产免费观看同学| 91最新在线| 精品午夜av| 日韩欧美国产免费| 久久精品国产2020观看福利| 日韩精品视频在线| 国产网站欧美日韩免费精品在线观看 | 日韩欧美久久| 欧美日韩综合高清一区二区| 日韩欧美一级视频| 日韩一级二级三级| 亚洲午夜久久| 国产乱码在线观看| 福利在线国产| 欧美日韩国产在线看| a天堂中文在线官网在线| 中文字幕日韩欧美在线| 91精品国产综合久久福利 | 一区二区国产在线| 欧美日韩在线不卡一区| 91精品无人成人www| 国产一卡二卡3卡4卡四卡在线| 欧美一级在线观看| 本道综合精品| 日韩视频在线一区| 色综合天天综合网天天狠天天| www在线播放| 一区二区三区在线|网站| 欧美 日韩 国产在线| 欧美日韩999| 玖玖在线免费视频| 国内精品99| 国产成人精品三级| 欧美日韩国产综合久久| 国产999在线观看| www中文字幕在线观看| 欧美日韩综合在线| 日韩中文字幕亚洲| 国产在线中文字幕| 色综合天天性综合| 欧美日韩国产在线| 午夜黄色小视频| 色99中文字幕| 久99久视频| 日韩免费电影网站| 91精品国产高清| 中文天堂资源在线| 日韩视频免费直播| 国产在线第一页| 国产久卡久卡久卡久卡视频精品| www.三级.com| 欧美日韩视频在线| 国产精品视频福利一区二区| 91精品婷婷国产综合久久| 在线一区免费| 麻豆精品视频入口| 国产欧美日韩视频| 一区二区三区高清在线| 国产乱码午夜在线视频| 欧美在线视频二区| 91精品在线观| 一级片免费网站| 亚洲精品中文字幕乱码三区不卡| 国产资源在线观看| 一级片免费在线| 国产黄色在线播放| 日韩你懂的电影在线观看| 精品日韩av一区二区| 日韩美女视频一区二区在线观看| 国产永久在线观看| 亚洲福利在线视频| 精品在线一区二区| 精品乱子伦一区二区| 日韩国产成人| 久久久精品国产免费观看同学| 国产真实乱子伦精品视频| 九九视频精品免费| 欧美日韩乱国产| 日韩精品视频在线观看免费| 一区二区在线观| 国产偷国产偷亚洲清高网站| 欧美日韩91| 国产三级做爰在线观看| 欧美日韩国产中字| 在线观看免费国产小视频| 一区二区三区高清在线| 久久手机免费观看| 国产激情久久久| 精品在线99| 日韩精品手机在线| 亚洲欧洲国产视频| 亚洲一区在线视频观看| av首页在线| 精品日韩av一区二区| 精品av中文字幕在线毛片| 伊人网站在线| 国产成人精品999| 欧美日韩国产综合久久| 日韩在线视频中文字幕| 日韩一级二级三级| 中文 欧美 日韩| 中文字幕在线播放一区| √天堂资源中文www| 欧美日韩精品在线播放| 欧美在线亚洲一区| 97天天综合网| 国产欧美日韩不卡| 日韩在线中文字幕| 欧美 日韩 国产 在线观看| 国产高清一级片| 日韩在线高清视频| 二区中文字幕| 一级片免费在线播放| 亚洲欧美999| 久久精品网站免费观看| 最近高清中文在线字幕在线观看1| 亚洲成年人影院在线| 中文字幕国产欧美| 国产字幕在线看| av一卡二卡| www.eeuss影院| xxxxx性| 午夜国产在线视频| 91久久精品国产91久久| 欧美日韩精品是欧美日韩精品| 日韩在线视频一区| 精品综合久久久久| 国产高清在线观看| 国产在线第一页| 亚洲第一页中文字幕| 日韩精品一二三四区| 五月天久久比比资源色| 亚洲美女视频一区| 欧美日韩中国免费专区在线看| 久久香蕉精品| 色99中文字幕| 国产成人va亚洲电影| 精品视频—区二区三区免费| 国产亚洲一区字幕| 99精品免费观看| 中文字幕欧美日韩| 91精品国产乱码久久蜜臀| 午夜国产视频| 国产成人精品免费网站| 91精品国产91久久| 欧美日韩免费视频| 中文亚洲欧美| 中文字幕亚洲视频| 欧美另类专区| 视频一区二区不卡| 欧美日韩综合高清一区二区| 一区二区日韩免费看| 亚洲国产福利视频| 人成在线免费视频| 天天摸日日摸狠狠添| 国产成人精品999| 色国产在线视频| 国产www.大片在线| 最近高清中文在线字幕在线观看1| 亚洲高清视频一区| 欧美国产综合在线V| 欧美日韩久久久| 久久久精品欧美| 日韩区欧美区| 国产一卡2卡3卡4卡网站免费|