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

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

canvas 如何繪制線段的實(shí)現(xiàn)方法

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

學(xué)習(xí)canvas,首先得知道如何去繪制線段,然后才能通過(guò)很多簡(jiǎn)單的線段去實(shí)現(xiàn)比較復(fù)雜的圖形,比如常見(jiàn)的圖表,柱狀圖,折線圖等都是通過(guò)一段一段的線段實(shí)現(xiàn)的。

基礎(chǔ)知識(shí)

canvas 的基礎(chǔ)知識(shí)不算多,主要掌握如何繪制線段,圖形,圖片,文本等。canvas可以在瀏覽器中繪制,也可以借助 node-canvas在node服務(wù)端繪制簡(jiǎn)單的圖片。本文只記錄在瀏覽器中繪制,至于在node端如何繪制,自己可以去查看相關(guān)資料。

在瀏覽器中繪制,就先在html中定義canvas元素,默認(rèn)寬高是300 * 150,可以通過(guò)widthheight設(shè)置。注意canvas元素樣式寬高和canvas繪圖畫(huà)布寬高不是一個(gè)東西,這塊將在以后說(shuō)的。

<canvas id="canvas">  <p>當(dāng)前瀏覽器不支持canvas,請(qǐng)升級(jí)瀏覽器</p></canvas>

在繪制之前,我們要先獲取當(dāng)前canvas的2d繪制上下文context,后續(xù)總是通過(guò)操作context來(lái)進(jìn)行繪制。

let canvas = document.querySelector('#canvas');if (!canvas) {  throw new Error('can not find canvas element');}// 注意2d.參數(shù)必須是小寫(xiě)的;// 通過(guò)設(shè)置參數(shù)為webgl,可以獲取3d繪制上下文let ctx = canvas.getContext('2d');

注:后續(xù)示例中會(huì)忽略上面的代碼片段,直接使用 ctx 變量表示canvas的2d繪制上下文。

再來(lái)看看canvas 2d繪制中的坐標(biāo)系統(tǒng),當(dāng)前canvas元素左上角為坐標(biāo)原點(diǎn)(0,0),水平向右為X軸正方向,垂直向下為Y軸正方向,如下圖。可以通過(guò)平移(translate),旋轉(zhuǎn)(rotate),縮放(scale)來(lái)操作坐標(biāo)系,實(shí)現(xiàn)一些動(dòng)畫(huà),這部分將在動(dòng)畫(huà)知識(shí)部分詳細(xì)講解。

canvas,繪制,線段

線段

在繪制一條簡(jiǎn)單的線段時(shí),一般會(huì)先設(shè)置線段的樣式,比如,顏色,線條寬度,線條端點(diǎn)樣式等,我們通過(guò)設(shè)置strokeStyle來(lái)設(shè)置ctx的全局繪制樣式,可以是rgba或合法的16進(jìn)制顏色值,或者漸變對(duì)象等。如下代碼簡(jiǎn)單的繪制了一條從(10,10)到(50,60)的,寬度為10的,紅色的線段。

ctx.strokeStyle = 'red';ctx.lineWidth = 10;ctx.moveTo(10, 10);ctx.lineTo(50, 60);ctx.stroke();

canvas,繪制,線段

先看看與繪制線段相關(guān)的方法以及屬性,

相關(guān)屬性:

  • lineCap,該值告訴瀏覽器如何繪制線段的端點(diǎn),可選值為以下三個(gè)之一:butt,round,square。默認(rèn)為butt。
  • lineWidth,該值決定了線段的像素寬度。必須為非負(fù),非無(wú)窮,默認(rèn)為1.0。
  • lineJoin,決定了兩條線段相交時(shí)如何繪制焦點(diǎn),只有當(dāng)兩條線段方向不同時(shí),才會(huì)生效??扇≈担篵evel,round,miter。默認(rèn)值是miter。
  • miterLimit,告訴瀏覽器如何繪制miter形式的線段焦點(diǎn),只有當(dāng)lineJoin='miter'有效,默認(rèn)為10.0。
  • lineDashOffset,設(shè)置虛線偏移量,默認(rèn)為0.0。

相關(guān)方法:

  • beginPath,將當(dāng)前路徑之中的所有子路徑都要清除掉,以此來(lái)重置當(dāng)前路徑。一般在繪制閉合圖形時(shí)要先調(diào)用。
  • closePath ,顯示的封閉某段路徑。該方法用于封閉圓弧路徑以及由曲線或線段所創(chuàng)建的開(kāi)放路徑。
  • moveTo,移動(dòng)當(dāng)前繪制點(diǎn)到指定的坐標(biāo)。
  • lineTo,從上一個(gè)點(diǎn)繪制一條到指定坐標(biāo)點(diǎn)的線段。
  • setLineDash,用來(lái)設(shè)置虛線的方法,參數(shù)是一個(gè)數(shù)組,表明繪制實(shí)線的長(zhǎng)度,以及實(shí)線之間的間隙的長(zhǎng)度。

試試用設(shè)置不同的lineCap 值來(lái)繪制同樣的線段

ctx.lineWidth = 10;ctx.textAlign = 'center';let colors = ['red', 'green', 'blue'];let lineCaps = ['butt', 'round', 'square'];for (let [index, lc] of lineCaps.entries()) {  ctx.strokeStyle = colors[index]; //設(shè)置線段的顏色  ctx.lineCap = lc; // 設(shè)置lineCap  ctx.beginPath(); // 清空當(dāng)前路徑  ctx.moveTo(10, 20 + 20 * index);  ctx.lineTo(50, 20 + 20 * index);  ctx.stroke();  ctx.fillText(lc, 80, 25 + 20 * index);}

canvas,繪制,線段

從上圖結(jié)果可以看出,再將lineCap設(shè)置為round 和square時(shí)會(huì)在原線段的兩端加上一定長(zhǎng)度的端點(diǎn),只不過(guò)round是圓弧樣式,square是矩形樣式。需要注意的一點(diǎn)是,在canvas繪制上下文中同一時(shí)刻只能存在一個(gè)當(dāng)前路徑,為了繪制不同的線段,必須在每次繪制之前調(diào)用beginPath()來(lái)清空當(dāng)前路線,開(kāi)始新的路徑。

再來(lái)試試用不同的lineJoin值來(lái)繪制兩個(gè)線段焦點(diǎn)處的樣式

ctx.lineWidth = 20;ctx.textAlign = 'center';ctx.lineCap = 'butt';let colors = ['red', 'green', 'blue'];let lineJoins = ['bevel', 'round', 'miter'];for (let [index, lj] of lineJoins.entries()) {  ctx.strokeStyle = colors[index]; //設(shè)置線段的顏色  ctx.lineJoin = lj; //設(shè)置lineJoin  ctx.beginPath(); //清空當(dāng)前路徑  ctx.moveTo(10 + 80 * index, 20);  ctx.lineTo(50 + 80 * index, 20);  ctx.lineTo(50 + 80 * index, 60);  ctx.stroke();  ctx.fillText(lj, 40 + 80 * index, 80);}

canvas,繪制,線段

可以看到,三種lineJoin在處理兩條線段的焦點(diǎn)處的不同。其中,在設(shè)置lineJoin="miter"時(shí),通過(guò)設(shè)置miterLimit屬性可以設(shè)置斜接線的長(zhǎng)度與二分之一線寬的最大比值,當(dāng)超過(guò)這個(gè)比值時(shí),則lineJoin會(huì)采用bevel方式。

canvas不僅可以繪制實(shí)線,還可以繪制虛線。繪制虛線,通過(guò)設(shè)置lineDashOffset屬性和調(diào)用setLineDash()方式。

ctx.lineWidth = 10;ctx.textAlign = 'center';ctx.setLineDash([8, 8]); //表示實(shí)線部分8個(gè)像素,間隙部分8個(gè)像素let colors = ['red', 'green', 'blue'];let lineDashOffsets = [1, 2, 4];for (let [index, ldOffset] of lineDashOffsets.entries()) {  ctx.strokeStyle = colors[index]; //線段顏色  ctx.lineDashOffset = ldOffset; //設(shè)置了偏移量  ctx.beginPath();  ctx.moveTo(10, 20 + 20 * index);  ctx.lineTo(100, 20 + 20 * index);  ctx.stroke();  ctx.fillText(`lineDashOffset:${ldOffset}`, 160, 25 + 20 * index);}

canvas,繪制,線段

從圖可以看到lineDashOffset就是設(shè)置的開(kāi)始繪制虛線的偏移量。setLineDash()方法,接受一個(gè)數(shù)組參數(shù),如果數(shù)組個(gè)數(shù)是奇數(shù),則會(huì)默認(rèn)把當(dāng)前數(shù)組元素復(fù)制一份,使之變成偶數(shù)。從第0個(gè)元素,表示實(shí)線部分長(zhǎng)度,第1個(gè)元素,表示間隙部分長(zhǎng)度,第2個(gè)元素,表示實(shí)線部分長(zhǎng)度,第3個(gè)元素,表示間隙部分長(zhǎng)度,如果到數(shù)組最后一個(gè)元素了,又會(huì)從頭開(kāi)始,以此類(lèi)推。

ctx.lineWidth = 10;ctx.textAlign = 'center';let colors = ['red', 'green', 'blue', 'gray'];let lineDashes = [[20, 20], [40, 40], [20, 40], [20, 40, 20]];for (let [index, ld] of lineDashes.entries()) {  ctx.strokeStyle = colors[index]; //設(shè)置顏色  ctx.setLineDash(ld); //設(shè)置lineDash  ctx.beginPath();  ctx.moveTo(10, 20 + 20 * index);  ctx.lineTo(171, 20 + 20 * index);  ctx.stroke();  ctx.fillText(`lineDashes:[${ld}]`, 240, 25 + 20 * index);}

canvas,繪制,線段

let lineDashOffset = 0; //初始lineDashOffsetctx.strokeStyle = 'green';function animate() {  if (lineDashOffset > 25) {    lineDashOffset = 0;  }  ctx.clearRect(0, 0, width, height); //清空當(dāng)前canvas  ctx.lineDashOffset = -lineDashOffset; //設(shè)置lineDashOffset  ctx.setLineDash([4, 4]); // 設(shè)置實(shí)線長(zhǎng)度和間隙長(zhǎng)度  ctx.rect(20, 20, 100, 100); //繪制一個(gè)矩形  ctx.stroke(); //對(duì)canvas當(dāng)前路徑描邊  lineDashOffset += 1; //lineDashOffset偏移加1  window.requestAnimationFrame(animate); //用瀏覽器幀速率來(lái)反復(fù)執(zhí)行animate函數(shù)}animate();

canvas,繪制,線段

小結(jié)

繪制線段時(shí),要理解canvas當(dāng)前路徑概念,某一時(shí)刻,canvas中當(dāng)前路徑只有一條,在開(kāi)始新的路徑時(shí),必須調(diào)用beginPath()。可以通過(guò)設(shè)置lineWidth,lineCap,lineJoin設(shè)置線段的繪制樣式。在描邊線段時(shí),可以通過(guò)strokeStyle來(lái)設(shè)置線段的顏色。

canvas中不僅可以繪制實(shí)線,還可以通過(guò)lineDashOffsetsetLineDash()來(lái)繪制虛線。

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


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到HTML教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
50一60岁老妇女毛片| 中文字幕在线国产| 草莓视频性福宝| 一级成人免费视频| 欧美h版在线观看| h文在线观看免费| 宇都宫紫苑在线播放| 国产美女在线精品免费观看| 国产成人福利在线| www.五月婷婷.com| 欧美国产日韩一区二区| 免费亚洲电影| 一本大道久久a久久精二百| 国产自产一区二区| 看黄网站在线| 91麻豆成人久久精品二区三区| 视频在线精品一区| 自拍偷拍你懂的| 成人精品3d动漫| 欧美精品一卡| 国产伦精品一区二区三区视频青涩| 国产一级二级在线| 性一交一乱一伧国产女士spa| 在线观看美女av| 青青色在线视频| 三年片大全在线观看大全有哪些| 男女高潮又爽又黄又无遮挡| 国产婷婷一区二区| 免费成人午夜视频| 欧美日韩在线视频观看| 欧美xxx在线| 亚洲女人在线观看| 国产精品久久久久aaaa| 亚洲国产高清在线观看视频| 三级黄色录像视频| 婷婷综合久久一区二区三区| 国产精品一区一区三区| 午夜私人影院在线观看| 国产精品久久久久久户外露出| 在线免费观看不卡av| 国产一二三视频| www成人免费| 免费黄色片视频| 农村妇女精品一区二区| 波多野结衣有码| 暖暖日本在线观看| 中文字幕人妻一区二区| 日韩欧美天堂| 婷婷五月在线视频| 成人性色av| 美美女免费毛片| 中文字幕av不卡在线| 欧美亚视频在线中文字幕免费| 欧美一级片在线观看| 国产一区二区91| 五月天天在线| 午夜精品久久久久久久白皮肤| 午夜视频在线瓜伦| 亚洲啪啪av| 色综合一本到久久亚洲91| 香蕉久久免费电影| 污污的视频免费| 日本综合一区二区三区| 国产精品臀控福利在线观看| av电影院在线看| 日韩欧美国产麻豆| 久久久久久久999精品视频| 色呦呦一区二区| 国产aⅴ超薄肉色丝袜交足| 欧美成人三级在线播放| 欧美一区二区三区红桃小说| 久久www人成免费看片中文| 国产精品久久久久影院日本| 最近2019中文免费高清视频观看www99| 天天舔天天操天天干| 看黄网站在线| 三级精品视频| aaa一级毛片| 亚洲国产精品一区二区尤物区| 中文字幕永久免费视频| 中文字字幕在线中文乱码电影| 可以www视频| 偷拍视频一区二区三区| 精品一二三区视频| 亚洲视频在线观看视频| 少妇久久久久久| 91麻豆精品国产91久久久久久久久| 看片网址国产福利av中文字幕| 久久中文字幕无码| 精品99视频| 亚洲AV无码精品自拍| 伊人久久大香线蕉综合75| 粉嫩av一区二区三区免费野| 朝桐光av一区二区三区| 日韩精品免费观看| 国产不卡视频一区二区三区| 国产精品激情av电影在线观看| 91精品国产综合久久小美女| 九九九伊在线综合永久| 你懂的一区二区三区| **精品中文字幕一区二区三区| 欧美精品二区三区四区免费看视频| 夜夜嗨av一区二区三区四季av| 日本韩国欧美精品大片卡二| jizzzz日本| 精品国产91久久久久久老师| 欧美大尺度激情区在线播放| 亚洲综合三区| eeuss影院网站免费观看| 26uuu日韩精品一区二区| 免费看美女视频在线网站| 国产av无码专区亚洲av毛网站| 天天操天天干天天做| 日韩精品一区在线视频| eeuss鲁丝片eeuss影院| 激情自拍一区| 亚洲av无码乱码国产精品| 男人舔女人下面高潮视频| jizz国产在线观看| 亚洲一区二区久久久久久久| 亚洲一区二区三区中文字幕| 免费在线观看一区| 偷拍精品精品一区二区三区| 日韩一级黄色片| 日韩美女毛茸茸| 欧美性free免费| 亚洲 国产 欧美 日韩| 久久久久久久久久久久久久久99| 国产精品一区二区91| 婷婷五月综合缴情在线视频| 在线精品视频一区二区| 樱花草在线观看www| 日本少妇全体裸体洗澡| 成av人免费青青久| 久久99热这里只有精品| 少妇高潮一区二区三区99| 情趣视频网站在线免费观看| 99在线观看免费视频精品观看| 中文字幕国产亚洲| 美腿丝袜在线亚洲一区| 欧美亚洲成人网| 国产成人综合在线视频| av电影在线观看完整版一区二区| 91免费小视频| 亚洲图片欧美综合| 亚洲国产另类久久久精品极度| 91精品国产高清一区二区三区| www亚洲天堂| av综合电影网站| 超级白嫩亚洲国产第一| 亚洲精品无吗| 蜜桃视频无码区在线观看| 亚洲 欧美 视频| 国产资源精品在线观看| 中文字幕日韩精品无码内射| 小日子的在线观看免费第8集| japan高清日本乱xxxx| 三级在线电影| 日本一区二区三区免费看| 国产小视频在线高清播放| 国产精品臀控福利在线观看| 日本一区二区三区精品| 国产欧美久久久精品免费| 日韩女优人人人人射在线视频| 黄色一区二区视频| 69**夜色精品国产69乱| 久久久久久国产免费| 99久久精品免费看国产免费软件| 久久亚洲精品小早川怜子| 亚洲一区二区在| 欧美大片一区二区| 国产精品久久久久久亚洲调教| 国产激情自拍| 99这里都是精品| 99re国产精品| 色狠狠久久av五月综合|| 日日橹狠狠爱欧美超碰| 五月久久久综合一区二区小说| 国产在线观看a视频| av在线精品| 日韩欧美久久一区| 欧美视频中文在线看| 在线免费毛片| 免费白浆视频| 影音先锋中文在线视频| 亚洲美女av网站| 国产黄大片在线观看画质优化| 精品久久久久一区二区国产| 久久精品99久久久| 热这里只有精品| 亚洲国产精彩中文乱码av在线播放| 欧美乱妇高清无乱码| 四虎精品一区二区永久在线观看| 又色又爽又黄无遮挡的免费视频| 九义人在线观看完整免费版电视剧| 国语自产偷拍精品视频偷| 91福利在线看| 91精品国自产在线| 亚洲精品日韩在线观看| 日本少妇全体裸体洗澡| 欧美精品欧美极品欧美激情| 中文字幕在线不卡一区二区三区| 久久av免费一区| 国产精品久久久久av蜜臀| 国产稀缺精品盗摄盗拍| 在线视频国产区| 免费成人在线观看| 免费一区二区三区| 国产小视频自拍| 国产麻豆精品在线观看| 欧美专区日韩专区| 国产自产自拍视频在线观看| 全球中文成人在线| 黄页免费在线观看视频| 亚洲欧美日韩专区| 欧美爱爱小视频| ...av二区三区久久精品| 五月天色综合| 亚洲国产视频一区| 日韩免费视频线观看| 女海盗2成人h版中文字幕| 在线日韩av| 最近免费中文字幕视频2019| 一区二区三国产精华液| 亚洲系列另类av| 久草在线免费福利资源| 国产精品毛片一区视频播| 白浆在线视频| 久久99蜜桃| 色狠狠一区二区三区| 欧美少妇一区二区三区| 成人观看网站a| 欧美激情99| 午夜精品毛片| 国产精品区一区二区三在线播放| 国产精品丝袜一区二区| 国内精品视频在线播放| 欧美最猛性xxxx高清| 国产一二三区在线视频| 国产黑丝一区二区| 欧美日韩无遮挡| 亚洲欧洲美洲国产香蕉| 亚欧精品在线视频| 可以免费在线观看的av| 欧美一级大片| 久久天天躁狠狠躁夜夜躁2014| 91九色在线免费视频| 97精品国产97久久久久久粉红| 欧美aⅴ在线观看| 日本中文字幕电影在线观看| 99综合精品久久| 动漫3d精品一区二区三区乱码| 亚洲欧美另类在线视频| 国产精品羞羞答答| 天堂av一区二区三区| 在线欧美福利| 国产一区二区伦理| 国产美女高潮一区二区三区| www.狠狠lu| 久久影院理伦片| 亚洲第一搞黄网站| 欧美另类色图| 美女网站色精品尤物极品姐弟| 91在线免费看| 欧美高清视频看片在线观看| 日韩你懂的在线观看| 中文字幕国产亚洲| xxxx日本少妇| 国产91对白在线播放| 男人天堂电影网| 日韩福利在线播放| 海角社区69精品视频| 亚洲区综合中文字幕日日| 在线观看三级视频欧美| 国产精品久久久久9999| 成人午夜在线视频| 欧美日韩999| 粉嫩av性色av蜜臀av网站| 中文字幕亚洲电影| 在线看一区二区| 国产精品免费看久久久无码| 久久成人18免费观看| 99热国内精品| 中文字幕日韩精品有码视频| 国产精品对白一区二区三区| 国产免费a视频| 日本一级免费视频| 色欲综合视频天天天| 日韩精品视频在线观看网址| 亚洲v在线观看| 欧美日韩精品一区二区在线播放| 国产一区二区视频在线免费观看| 91精品国产91久久久久游泳池| 亚洲AV无码成人精品区东京热| 麻豆精品视频入口| 国产欧美精品一区二区色综合朱莉| 中文字幕乱码中文乱码51精品| 国产精品成人网站| 中文字幕一区二区av| 亚洲欧美日韩综合国产aⅴ| 麻豆精品国产| 国产又黄又爽又猛免费app| 国产色噜噜噜91在线精品| 青青草综合在线| 欧美性69xxxx肥| 国产精品视频色| 秋霞在线视频| av女优在线| 亚洲精品免费在线| 97秋霞电影网| 九九夜夜操妹子| 91精选在线观看| 国产aⅴ超薄肉色丝袜交足| 久久久久亚洲精品成人网小说| xxxx性欧美黑人| 神马影院午夜我不卡影院| 女人另类性混交zo| 日本a在线天堂| 最近日韩中文字幕| 久久精品国产68国产精品亚洲| 国产精品一区久久久| 国产欧美一区二区三区久久| 水蜜桃免费高清视频在线播放| 日皮视频在线免费观看| 鲁大师影院一区二区三区| 国产乱精品一区二区三区| 免费观看亚洲视频大全| 日本一区二区免费电影|