久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

如何繪制路徑-線段

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

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

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

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

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();  }

如何繪制路徑-線段

我們只使用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();  }

如何繪制路徑-線段

改變線段的顏色

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

如何繪制路徑-線段

我們還可以利用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();  }

如何繪制路徑-線段

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();  }

如何繪制路徑-線段

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

cxt.strokeStyle = 'green'= 250, 5050, 150150, 150150, 250  cxt.closePath();
}

如何繪制路徑-線段

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

注意:調用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();  }

如何繪制路徑-線段

從上面的例子我們可以看出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();  }

如何繪制路徑-線段

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

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

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

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

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

如何繪制路徑-線段

網格的繪制

既然我們已經明白了如何繪制真正的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);

如何繪制路徑-線段

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

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

總結

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

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

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

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

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

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
99久久久久| 国产激情综合| 国产乱论精品| 欧美在线首页| 精品国产欧美| 嫩草伊人久久精品少妇av杨幂| 亚洲日韩视频| 亚洲精品免费观看| 亚洲1区在线观看| 亚洲精品无播放器在线播放| 日本亚洲不卡| 久久精品99国产国产精| 国产精品久久久一区二区| 国产精品qvod| 久久精品一本| 国产中文在线播放| 久久91导航| 免费av一区| 欧美日韩国产亚洲一区| 99久精品视频在线观看视频| 91成人超碰| 综合激情在线| 国产免费久久| 国产激情在线播放| 91精品一区二区三区综合| 亚洲深夜影院| 日韩一区二区三区免费视频| 日韩伦理福利| 蜜臀av亚洲一区中文字幕| 一本一道久久a久久| 日韩av在线中文字幕| 日韩免费久久| 精品国产午夜肉伦伦影院 | 美女性感视频久久| 国产中文欧美日韩在线| 免费一二一二在线视频| 欧美99久久| 日韩一区二区三区在线看| 九九九精品视频| 欧美精品羞羞答答| 深夜福利一区| 国产精品久久乐| av在线日韩| 石原莉奈在线亚洲二区| 国产精品香蕉| 99久久激情| 午夜久久99| 日韩国产欧美视频| 精品一区二区三区中文字幕视频| 日本精品影院| 一区二区三区四区在线观看国产日韩| 日韩一区二区三区免费视频| 欧美日韩精品免费观看视完整| 国产aⅴ精品一区二区三区久久 | 蜜臀久久99精品久久久画质超高清 | av资源中文在线天堂| 蜜臀久久精品| 免费日韩av片| 久久精品国产精品亚洲毛片| 亚洲91视频| 日本v片在线高清不卡在线观看| 精品视频亚洲| 日韩一级精品| 久久99青青| 一区二区视频欧美| 国产福利资源一区| 欧美.日韩.国产.一区.二区| 国产亚洲精品美女久久久久久久久久| av资源中文在线天堂| 午夜电影一区| 91精品综合| 日韩三级视频| 欧美二三四区| 日韩欧美中文字幕一区二区三区 | 18国产精品| 国产精品theporn| 欧美日韩国产一区二区三区不卡 | 五月国产精品| а√天堂8资源在线| 亚洲有吗中文字幕| 精品福利久久久| 蜜桃av一区二区三区电影| 麻豆成人av在线| 国产精品毛片| 国产在线观看www| 日本v片在线高清不卡在线观看| 免费福利视频一区二区三区| 日本午夜精品久久久久| 成人免费网站www网站高清| 日韩在线视频一区二区三区| 久久久久久久久久久9不雅视频| 国产剧情在线观看一区| 亚洲男女自偷自拍| 欧美天堂视频| 久久不卡日韩美女| 91九色精品| 日本一二区不卡| 国产探花一区| 亚洲伊人精品酒店| 不卡在线一区| 日韩免费视频| 久久三级毛片| 国产毛片精品| 日韩超碰人人爽人人做人人添| 国产综合激情| 午夜在线视频一区二区区别| 中文字幕系列一区| 黄色日韩在线| 欧美三级精品| 久久精品国产网站| 亚洲有吗中文字幕| 欧美成人综合| 国产理论在线| 久久精品国产亚洲aⅴ| 日韩av午夜在线观看| 午夜在线精品| 日韩视频二区| 免费av一区| 婷婷精品进入| 久久久噜噜噜| 精品捆绑调教一区二区三区| 色婷婷亚洲mv天堂mv在影片| 国产午夜久久av| 日本综合视频| 婷婷综合国产| 91成人精品| 一区二区小说| 久久久久蜜桃| 欧美精品一区二区久久| 伊人久久大香线蕉av不卡| 97精品在线| 日韩成人精品一区| 日韩欧美午夜| 日本综合字幕| 久久狠狠婷婷| 亚洲高清成人| 在线国产一区二区| 欧美成人国产| 伊人影院久久| 亚洲一区不卡| 日韩一级网站| 婷婷综合社区| 国产不卡一区| 视频在线观看国产精品| 国产精品99在线观看| 日本国产一区| 日韩黄色在线观看| 欧美日韩1区| 国产精品99久久久久久董美香| 欧美日本不卡| 国产精品男女| 国产成人1区| 亚洲午夜一级| 伊人久久亚洲美女图片| 免费在线观看不卡| 视频在线观看国产精品| 日日摸夜夜添夜夜添国产精品| 天堂久久av| 国产精品白丝久久av网站| 国产成人精品一区二区三区视频| 麻豆视频在线看| 日韩午夜精品| 欧美三区不卡| 精品一区二区三区亚洲| 日韩精品dvd| 美女尤物久久精品| 欧美亚洲免费| 丰满少妇一区| 久久在线免费| 亚洲精品韩国| 开心激情综合| 精品国产a一区二区三区v免费| 国产欧美日韩| 蜜臀久久99精品久久一区二区 | 美女久久久久久| 欧美日韩一区自拍| 日韩avvvv在线播放| 亚洲精品黄色| 黄色网一区二区| 久久精品国产精品亚洲毛片| 国产精品一区二区三区美女| 亚洲一区欧美| 亚洲乱码一区| 日韩一区二区三区高清在线观看| 欧美伊人影院| 久久成人国产| 日韩欧乱色一区二区三区在线| 国产精品任我爽爆在线播放 | 亚洲1区在线观看| 成人在线视频免费看| 男女精品网站| 久久精品伊人| 日韩午夜av| 视频在线不卡免费观看| 中文日韩在线| 国产精品久一| 不卡在线一区二区| 午夜久久av| 视频小说一区二区| 欧美日一区二区三区在线观看国产免 |