html5 Canvas畫圖教程(6)—canvas里畫曲線之a(chǎn)rcTo方法
發(fā)布時(shí)間:2013-01-09 14:17:27 作者:佚名
我要評(píng)論

arc與arcTo,從名字都能看出來(lái)相似。arcTo也是畫曲線的方法,而且他畫出的曲線也是正圓的一段弧線。但他的參數(shù)和arc簡(jiǎn)直是不共戴天~,感興趣的朋友可以了解下哦,接下來(lái)詳細(xì)介紹arcTo方法的應(yīng)用
上一篇文章講了canvas的arc方法,這一篇講和他有關(guān)的arcTo方法。
arc與arcTo,從名字都能看出來(lái)相似。arcTo也是畫曲線的方法,而且他畫出的曲線也是正圓的一段弧線。但他的參數(shù)和arc簡(jiǎn)直是不共戴天~
ctx.arcTo(x1,y1,x2,y2,radius);arcTo的參數(shù)中包括兩個(gè)點(diǎn),而且這兩個(gè)點(diǎn)中并沒有表示圓心的點(diǎn),僅僅最后的參數(shù)是圓的半徑,表示arcTo和圓有那么點(diǎn)關(guān)系。
網(wǎng)上關(guān)于arcTo的文章很少,好不容易找到一篇還是外國(guó)的;而且canvas畫圖木有直觀工具,只能靠猜,arcTo害我猜了半天。。
為了直觀的描述,我采取了一種輔助辦法:arcTo畫到哪里,我就用lineTo也畫到相應(yīng)的點(diǎn),以查看他們的關(guān)系。就是畫輔助線。
var x0=100,
y0=400,
x1 = 500,
y1 = 400,
x2 = 450,
y2 = 450;
ctx.beginPath();
ctx.moveTo(x0,y0);
ctx.strokeStyle = "#f00";
ctx.lineWidth = 2;
ctx.arcTo(x1,y1,x2,y2,20);
ctx.stroke();
ctx.beginPath();
ctx.strokeStyle = "rgba(0,0,0,0.5)";
ctx.lineWidth = 1;
ctx.moveTo(x0,y0);
ctx.lineTo(x1,y1);
ctx.fillText('x1,y1',x1+10,y1+10)
ctx.lineTo(x2,y2);
ctx.fillText('x2,y2',x2+10,y2)
ctx.stroke();
看起來(lái)代碼有點(diǎn)多,其實(shí)很簡(jiǎn)單。我用了幾個(gè)變量來(lái)保存坐標(biāo)值,其余的都是canvas的操作了。
變量說(shuō)明:x0,y0是起點(diǎn)坐標(biāo),x1,y1是第一個(gè)點(diǎn)坐標(biāo),x2,y2就是第二個(gè)點(diǎn)坐標(biāo)。其中l(wèi)ineTo畫的直線是半透明的1px黑線,arcTo畫的線條是2px的紅線。
刷新頁(yè)面,即可看到下圖。
不得不說(shuō)這條紅線很像一個(gè)鉤子。
于是arcTo的規(guī)律就找到了,他其實(shí)是通過(guò)起點(diǎn),第1點(diǎn),第2點(diǎn)的兩條直線,組成了一個(gè)夾角,而這兩條線,也是參數(shù)圓的切線。
其中圓的半徑?jīng)Q定了圓會(huì)在什么位置與線條發(fā)生切邊。就像一個(gè)球往一個(gè)死角里面滾,球越小就滾得越進(jìn)去,越靠近死角;球大則反之。
這是一個(gè)很嚴(yán)肅的學(xué)術(shù)問(wèn)題,大家可不要YY。
讓我們把球球變大吧!
ctx.arcTo(x1,y1,x2,y2,50); //半徑改成50
如圖,你可以看到圓弧變得很大,甚至都不和直線相切了。
當(dāng)然,實(shí)際上他們還是相切的,因?yàn)榍芯€是無(wú)限延長(zhǎng)的。
我們繼續(xù)探索,把圓繼續(xù)變大,把起點(diǎn)與第1點(diǎn)的距離縮短。
var x0=400; //起點(diǎn)x坐標(biāo)從100變400
...
ctx.arcTo(x1,y1,x2,y2,100); //圓的半徑變大到100然后你就會(huì)看到這么個(gè)奇特的圖形。
不過(guò),大家注意看,這個(gè)圓依然是和兩條線相切的!只是現(xiàn)在兩條線的長(zhǎng)度都滿足不了這個(gè)圓了!他已經(jīng)把兩條線都無(wú)線延長(zhǎng)了!
這個(gè)鉤子柄什么時(shí)候會(huì)發(fā)生反轉(zhuǎn)呢?如果你幾何學(xué)的好,你可以試著理解一下點(diǎn)與圓的切線方程。
arcTo方法中有個(gè)很重要的點(diǎn),這個(gè)重要的點(diǎn)就是代碼中的(x1,y1),只要他到圓的切點(diǎn)的距離,超過(guò)了他到起點(diǎn)(x0,y0)的距離,就會(huì)發(fā)生反轉(zhuǎn)。
從圖中我們可以看到,(x2,y2)這個(gè)點(diǎn)的坐標(biāo)可以無(wú)限變化,只要他始終是切線上的一個(gè)點(diǎn),那么在圓的半徑不變的情況下,arcTo畫出的圖形不會(huì)有任何變化。這點(diǎn)需要特別注意。
讓我用我拿不上臺(tái)面的幾何知識(shí)來(lái)驗(yàn)證下這個(gè)命題吧。為了方便計(jì)算,我先把兩條線的夾角改成90度。
var x0=100,
y0=400,
x1 = 500,
y1 = 400,
x2 = 500,
y2 = 450;
更改后就是90度張開了喲!我們保持球的半徑不變。刷新后:
arc與arcTo,從名字都能看出來(lái)相似。arcTo也是畫曲線的方法,而且他畫出的曲線也是正圓的一段弧線。但他的參數(shù)和arc簡(jiǎn)直是不共戴天~
ctx.arcTo(x1,y1,x2,y2,radius);arcTo的參數(shù)中包括兩個(gè)點(diǎn),而且這兩個(gè)點(diǎn)中并沒有表示圓心的點(diǎn),僅僅最后的參數(shù)是圓的半徑,表示arcTo和圓有那么點(diǎn)關(guān)系。
網(wǎng)上關(guān)于arcTo的文章很少,好不容易找到一篇還是外國(guó)的;而且canvas畫圖木有直觀工具,只能靠猜,arcTo害我猜了半天。。
為了直觀的描述,我采取了一種輔助辦法:arcTo畫到哪里,我就用lineTo也畫到相應(yīng)的點(diǎn),以查看他們的關(guān)系。就是畫輔助線。
復(fù)制代碼
代碼如下:var x0=100,
y0=400,
x1 = 500,
y1 = 400,
x2 = 450,
y2 = 450;
ctx.beginPath();
ctx.moveTo(x0,y0);
ctx.strokeStyle = "#f00";
ctx.lineWidth = 2;
ctx.arcTo(x1,y1,x2,y2,20);
ctx.stroke();
ctx.beginPath();
ctx.strokeStyle = "rgba(0,0,0,0.5)";
ctx.lineWidth = 1;
ctx.moveTo(x0,y0);
ctx.lineTo(x1,y1);
ctx.fillText('x1,y1',x1+10,y1+10)
ctx.lineTo(x2,y2);
ctx.fillText('x2,y2',x2+10,y2)
ctx.stroke();
看起來(lái)代碼有點(diǎn)多,其實(shí)很簡(jiǎn)單。我用了幾個(gè)變量來(lái)保存坐標(biāo)值,其余的都是canvas的操作了。
變量說(shuō)明:x0,y0是起點(diǎn)坐標(biāo),x1,y1是第一個(gè)點(diǎn)坐標(biāo),x2,y2就是第二個(gè)點(diǎn)坐標(biāo)。其中l(wèi)ineTo畫的直線是半透明的1px黑線,arcTo畫的線條是2px的紅線。
刷新頁(yè)面,即可看到下圖。
不得不說(shuō)這條紅線很像一個(gè)鉤子。
于是arcTo的規(guī)律就找到了,他其實(shí)是通過(guò)起點(diǎn),第1點(diǎn),第2點(diǎn)的兩條直線,組成了一個(gè)夾角,而這兩條線,也是參數(shù)圓的切線。
其中圓的半徑?jīng)Q定了圓會(huì)在什么位置與線條發(fā)生切邊。就像一個(gè)球往一個(gè)死角里面滾,球越小就滾得越進(jìn)去,越靠近死角;球大則反之。
這是一個(gè)很嚴(yán)肅的學(xué)術(shù)問(wèn)題,大家可不要YY。
讓我們把球球變大吧!
復(fù)制代碼
代碼如下:ctx.arcTo(x1,y1,x2,y2,50); //半徑改成50
如圖,你可以看到圓弧變得很大,甚至都不和直線相切了。
當(dāng)然,實(shí)際上他們還是相切的,因?yàn)榍芯€是無(wú)限延長(zhǎng)的。
我們繼續(xù)探索,把圓繼續(xù)變大,把起點(diǎn)與第1點(diǎn)的距離縮短。
復(fù)制代碼
代碼如下:var x0=400; //起點(diǎn)x坐標(biāo)從100變400
...
ctx.arcTo(x1,y1,x2,y2,100); //圓的半徑變大到100然后你就會(huì)看到這么個(gè)奇特的圖形。
不過(guò),大家注意看,這個(gè)圓依然是和兩條線相切的!只是現(xiàn)在兩條線的長(zhǎng)度都滿足不了這個(gè)圓了!他已經(jīng)把兩條線都無(wú)線延長(zhǎng)了!
這個(gè)鉤子柄什么時(shí)候會(huì)發(fā)生反轉(zhuǎn)呢?如果你幾何學(xué)的好,你可以試著理解一下點(diǎn)與圓的切線方程。
arcTo方法中有個(gè)很重要的點(diǎn),這個(gè)重要的點(diǎn)就是代碼中的(x1,y1),只要他到圓的切點(diǎn)的距離,超過(guò)了他到起點(diǎn)(x0,y0)的距離,就會(huì)發(fā)生反轉(zhuǎn)。
從圖中我們可以看到,(x2,y2)這個(gè)點(diǎn)的坐標(biāo)可以無(wú)限變化,只要他始終是切線上的一個(gè)點(diǎn),那么在圓的半徑不變的情況下,arcTo畫出的圖形不會(huì)有任何變化。這點(diǎn)需要特別注意。
讓我用我拿不上臺(tái)面的幾何知識(shí)來(lái)驗(yàn)證下這個(gè)命題吧。為了方便計(jì)算,我先把兩條線的夾角改成90度。
復(fù)制代碼
代碼如下:var x0=100,
y0=400,
x1 = 500,
y1 = 400,
x2 = 500,
y2 = 450;
更改后就是90度張開了喲!我們保持球的半徑不變。刷新后:
我們把y2變大,也就是延長(zhǎng)了一條切線,把他變成550,刷新后:
切線是延長(zhǎng)了,但arcTo畫出的紅線沒有任何變化。
相關(guān)文章
- Microdata作為HTML5新增的一個(gè)特性,它允許開發(fā)者在HTML文檔中添加更多的語(yǔ)義信息,以便于搜索引擎和瀏覽器更好地理解頁(yè)面內(nèi)容,本文將探討HTML5中Microdata的使用方法以及2025-04-21
- 在HTML語(yǔ)法中,表格主要通過(guò)< table >、< tr >和< td >3個(gè)標(biāo)簽構(gòu)成,本文通過(guò)實(shí)例代碼講解HTML5表格語(yǔ)法格式,感興趣的朋友一起看看吧2025-04-21
- 這篇文章主要介紹了HTML5中使用媒體查詢和Flexbox進(jìn)行響應(yīng)式布局的方法,簡(jiǎn)要介紹了CSS Grid布局的基礎(chǔ)知識(shí)和如何實(shí)現(xiàn)自動(dòng)換行的網(wǎng)格布局,感興趣的朋友一起看看吧2025-04-21
基于Canvas的Html5多時(shí)區(qū)動(dòng)態(tài)時(shí)鐘實(shí)戰(zhàn)代碼
本文介紹了如何使用Canvas在HTML5上實(shí)現(xiàn)一個(gè)多時(shí)區(qū)動(dòng)態(tài)時(shí)鐘的web展示,通過(guò)Canvas的API,可以繪制出6個(gè)不同城市的時(shí)鐘,并且這些時(shí)鐘可以動(dòng)態(tài)轉(zhuǎn)動(dòng),每個(gè)時(shí)鐘上都會(huì)標(biāo)注出對(duì)應(yīng)的2025-03-11HTML5 data-*自定義數(shù)據(jù)屬性的示例代碼
HTML5的自定義數(shù)據(jù)屬性(data-*)提供了一種標(biāo)準(zhǔn)化的方法在HTML元素上存儲(chǔ)額外信息,可以通過(guò)JavaScript訪問(wèn)、修改和在CSS中使用,文章還介紹了高級(jí)用法,如存儲(chǔ)JSON數(shù)據(jù)、事2025-03-11HTML5中下拉框<select>標(biāo)簽的屬性和樣式詳解
在HTML5中,下拉框(<select>標(biāo)簽)作為表單的重要組成部分,為用戶提供了一個(gè)從預(yù)定義選項(xiàng)中選擇值的方式,本文將深入探討<select>標(biāo)簽的屬性、樣式,并重點(diǎn)介2025-02-27- 本文介紹了HTML5InputDatePicker對(duì)象表示HTML``元素,是HTML5中的新對(duì)象,介紹了日期、周、月份、時(shí)間、日期+時(shí)間、本地日期時(shí)間等不同類型的日期選擇器,感興趣的朋友一起看2025-02-17
- 本文介紹了HTML5中的超鏈接、相對(duì)路徑和圖片的使用方法,超鏈接可以創(chuàng)建指向另一個(gè)文檔或頁(yè)面內(nèi)部書簽的鏈接,相對(duì)路徑用于在同一服務(wù)器內(nèi)部跳轉(zhuǎn)頁(yè)面,圖片標(biāo)簽用于引入外部圖2025-02-17
- 本文介紹了HTML5超鏈接的創(chuàng)建方法,包括基本語(yǔ)法、創(chuàng)建圖像超鏈接的邊框去除方法以及錨點(diǎn)鏈接的使用,還討論了超鏈接的四種不同狀態(tài)(link、visited、hover、active)的CSS樣2025-02-17
HTML5使用details標(biāo)簽:展開/收縮信息
最近看一些技術(shù)網(wǎng)站發(fā)現(xiàn)了details 標(biāo)簽的妙用,這個(gè)不用js即可實(shí)現(xiàn)展開/收縮信息,很方便用來(lái)讓用戶先才答案,然后下面點(diǎn)擊再給出答案的效果,這里就為大家簡(jiǎn)單介紹一下,2024-11-03