中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

html5 Canvas畫圖教程(11)—使用lineTo/arc/bezierCurveTo畫橢圓形
來源:易賢網 閱讀:1720 次 日期:2016-07-23 13:11:17
溫馨提示:易賢網小編為您整理了“html5 Canvas畫圖教程(11)—使用lineTo/arc/bezierCurveTo畫橢圓形”,方便廣大網友查閱!

在canvas中可以很方便的用arc方法畫出圓形,本來圓形也可以看作是一個寬高相等的橢圓,但canvas中根本沒有畫橢圓的方法,我們要用其他方法來模擬。

我們首先要明確畫一個橢圓需要那些參數,基本的幾何知識告訴我們,橢圓需要圓心坐標,寬度,高度——或者還有旋轉角度,不過這個可以暫時不要,旋轉是比較容易的。

1,使用lineTo畫橢圓

你沒有看錯,lineTo這樣一個純粹用來畫直線的方法居然可以用來畫橢圓!?但他確實存在,不過寫法實在是有些不可思議:

代碼如下:

function DrawEllipse(Canvas,O,OA,OB){

//畫橢圓,例子:var B=new Array(150,150); DrawEllipse(hb,B,50,30);

with (Canvas){

var x=O[0]+OA;

var y=O[1];

moveTo(x,y);

for (var i=0;i<=360;i++){

var ii=i*Math.PI/180;

var x=O[0]+OA*Math.cos(ii);

var y=O[1]-OB*Math.sin(ii);

lineTo(x,y);

}

}

}

這個方法的原理是,一個圓有360度,那么就用lineTo循環360次,畫出每一度的線段,最終連成一個橢圓。其中需要用到三角函數正弦余弦進行計算。

注意,這個方法的第2個參數是個數組,即橢圓的圓心坐標.

思路很奇葩,而且畫出的橢圓也比較平滑。但不值得大家使用——此方法每畫一個橢圓,就要循環360次,只有畫的橢圓稍微一多,對瀏覽器的性能就是個考驗。

我們只用了解一下他的思路即可

2,使用arc畫圓,然后把他縮放成一個橢圓

這個方法的原文在此,核心函數如下:

代碼如下:

var canvas = document.getElementById('myCanvas');

var context = canvas.getContext('2d');

var centerX = 0;

var centerY = 0;

var radius = 50;

// save state

context.save();

// translate context

context.translate(canvas.width / 2, canvas.height / 2);

// scale context horizontally

context.scale(2, 1);

// draw circle which will be stretched into an oval

context.beginPath();

context.arc(centerX, centerY, radius, 0, 2 * Math.PI, false);

// restore to original state

context.restore()

此方法用了一個我前面還沒講過的canvas函數,即scale,他能實現canvas的縮放。縮放有水平和垂直兩個方向,代碼中把canvas水平方向放大了,而垂直方向不變,so,原來arc畫出的圓形就變成了一個橢圓。

這個方法初看甚妙,代碼少,而且原理淺顯易懂。但分析一下就能發現他的明顯缺點了,就是——不精確!比如我需要寬171高56的橢圓,此時我們如果把arc的半徑定為28的話,那么后面就要為171/28/2這個蛋疼的不知所云的數字郁悶了。

不過有個折中的辦法是始終把arc的半徑設成100,然后,不夠就放大,超過了就縮小。但是,還是不精確。

3,使用貝賽爾曲線bezierCurveTo

自從覺得上面的縮放法不精確后,我就很想找到一個精確的畫橢圓的方法,最后在stackoverflow上找到了:

代碼如下:

function drawEllipse(ctx, x, y, w, h) {

var kappa = 0.5522848;

ox = (w / 2) * kappa, // control point offset horizontal

oy = (h / 2) * kappa, // control point offset vertical

xe = x + w, // x-end

ye = y + h, // y-end

xm = x + w / 2, // x-middle

ym = y + h / 2; // y-middle

ctx.beginPath();

ctx.moveTo(x, ym);

ctx.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);

ctx.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);

ctx.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);

ctx.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);

ctx.closePath();

ctx.stroke();

}

這個方法可以算是比較完美的了。他把一個橢圓分成了4條貝塞爾曲線,用他們連成了一個橢圓。最后寬度高度也比較精確,開銷也較少。

但此方法依然有缺點。大家看那個kappa參數,有個很奇特的值,相信很多人在幾何專家告訴你為什么他要取這個值之前,都不明白為什么非要取這個值——我到現在還是不知道。并且我有很強烈的想把他改一下看看有什么后果的沖動。

當然我這種類似強迫癥患者的沖動并不能說成是此方法的缺點,他真正的缺點是——為什么要用4條貝塞爾曲線?我個人覺得,一個橢圓明顯是由兩條貝塞爾曲線組成的而不是4條。這個想法最終讓我找到了最完美的畫橢圓的方法。

4,使用兩條貝賽爾曲線畫出橢圓

為了了解上一個方法能否精簡,我專門注冊了一個stackoverflow的帳號去提問,由于問題里有圖片,積分不夠不能傳,我還迫不得已用勉勉強強的英語水平去回答老外的問題掙積分。但最終好運到了,回答一個問題就解決了我的積分問題。

我提的貝賽爾曲線和橢圓的關系的問題在此.

說實話,下面老外的回答我大部分沒看懂,但幸虧他提供了一個代碼示例頁,讓我明白了原理,在此對他表示再次的感謝。而根據他的解答,我找到的畫橢圓的方法如下:

代碼如下:

//橢圓

CanvasRenderingContext2D.prototype.oval = function (x, y, width, height) {

var k = (width/0.75)/2,

w = width/2,

h = height/2;

this.beginPath();

this.moveTo(x, y-h);

this.bezierCurveTo(x+k, y-h, x+k, y+h, x, y+h);

this.bezierCurveTo(x-k, y+h, x-k, y-h, x, y-h);

this.closePath();

return this;

}

此方法既精確,又代碼少,而且也沒有奇怪的難懂的地方。只需要記住這一點,橢圓的寬度與畫出橢圓的貝賽爾曲線的控制點的坐標比例如下:

貝塞爾控制點x=(橢圓寬度/0.75)/2這一點已經在代碼中體現了。

大家可自行試驗上面的4個方法畫出橢圓。

如果你發現了更簡單的方法,也請分享出來大家探討吧。

更多信息請查看網頁制作
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
国产精品视频福利| 美国十次成人| 久久久91精品国产一区二区三区| 欧美日韩在线观看一区二区| 在线午夜精品| 国产欧美日韩麻豆91| 久久午夜激情| 在线亚洲电影| 国产精品亚洲人在线观看| 欧美在线|欧美| 亚洲三级视频在线观看| 国产精品久久久久久久久久ktv | 国产精品99久久久久久人| 国产精品xxxxx| 久久久久国产一区二区三区| 亚洲精品小视频| 国产日韩一区二区| 欧美激情久久久久| 久久福利毛片| 亚洲午夜精品一区二区三区他趣| 国产亚洲精品美女| 欧美视频在线一区| 老司机一区二区三区| 亚洲午夜高清视频| 亚洲激情欧美激情| 国产专区一区| 国产精品一区二区三区四区五区| 另类激情亚洲| 欧美在线你懂的| 亚洲综合欧美日韩| 一本到高清视频免费精品| 狠狠色狠狠色综合人人| 国产精品成人一区二区网站软件| 久久综合综合久久综合| 亚洲欧美日韩爽爽影院| 在线亚洲欧美| 一区二区黄色| 亚洲精品国产精品国自产在线| 国产一级久久| 国产乱理伦片在线观看夜一区| 欧美日韩国产免费| 欧美成人自拍| 欧美国产日韩一区二区| 免费不卡亚洲欧美| 欧美成人精品不卡视频在线观看 | 久久久欧美精品sm网站| 亚洲午夜精品| 中日韩美女免费视频网站在线观看| 亚洲国产精品激情在线观看| 精品不卡视频| 亚洲国产一区视频| 亚洲精品国产精品乱码不99按摩| 先锋影音网一区二区| 日韩一二三区视频| 亚洲精品美女在线观看| 亚洲国产婷婷综合在线精品| 国内视频一区| 黄色精品网站| 国产精品一区二区在线| 亚洲中字在线| 先锋影音国产一区| 欧美一区二区三区四区在线 | 亚洲视频免费在线| 亚洲精品永久免费精品| 亚洲第一搞黄网站| 亚洲欧洲在线一区| 国产一区二区三区成人欧美日韩在线观看 | 欧美手机在线| 欧美网站在线观看| 欧美午夜精品理论片a级按摩 | 99热这里只有精品8| 亚洲精品乱码久久久久久按摩观| 一本色道久久综合| 亚洲精品123区| 亚洲国产中文字幕在线观看| 亚洲国产高清视频| 亚洲精品视频啊美女在线直播| 亚洲欧洲一区二区三区| 日韩午夜激情| 亚洲一区二区三区在线播放| 午夜亚洲一区| 久久裸体艺术| 欧美巨乳在线| 欧美视频网址| 国产日韩亚洲欧美精品| 国产一区二区在线观看免费| 经典三级久久| 亚洲美女精品一区| 亚洲综合电影| 老司机aⅴ在线精品导航| 在线观看亚洲| 亚洲精品一区二区三区婷婷月| 国产精品久久久久久久久婷婷 | 免费毛片一区二区三区久久久| 欧美日韩国产色站一区二区三区| 黄色成人91| 久久久久久久999精品视频| 国产一区二区视频在线观看| 亚洲午夜视频| 亚洲影音一区| 久久精品亚洲精品| 欧美日韩免费区域视频在线观看| 国产欧美日韩综合精品二区| 91久久国产综合久久蜜月精品 | 欧美精品国产一区二区| 国产日韩精品久久久| 亚洲精品一区二区三区99| 国产精品欧美在线| 国产日韩亚洲欧美精品| 亚洲美女免费精品视频在线观看| 黄色欧美成人| 女女同性女同一区二区三区91| 狠狠色丁香久久婷婷综合_中| 久久综合久久美利坚合众国| 在线日韩中文字幕| 欧美视频在线观看| 欧美揉bbbbb揉bbbbb| 久久国产精品久久久久久| 欧美肥婆在线| 国产亚洲一二三区| 亚洲一二区在线| 欧美人与性动交α欧美精品济南到| 国产欧美日韩视频一区二区| 国产精品99久久久久久久vr| 你懂的视频欧美| 在线精品视频在线观看高清| 亚洲欧美日韩一区在线| 狠狠色丁香久久婷婷综合丁香 | 久久亚洲影音av资源网| 亚洲麻豆国产自偷在线| 国内精品伊人久久久久av一坑| 亚洲香蕉成视频在线观看| 在线看无码的免费网站| 国产香蕉97碰碰久久人人| 国产精品亚洲综合天堂夜夜| 欧美成人tv| 女仆av观看一区| 亚洲素人在线| 欧美激情中文字幕在线| 激情综合色综合久久| 久久久久国产精品一区二区| 国产日韩在线看片| 欧美一区二区三区喷汁尤物| 国产精品三级视频| 亚洲欧美日韩一区二区三区在线| 国产精品v欧美精品v日韩精品| 日韩午夜在线观看视频| 欧美精品乱人伦久久久久久| 亚洲欧洲日本一区二区三区| 欧美精品少妇一区二区三区| 亚洲免费成人| 欧美日韩一区精品| 亚洲综合国产激情另类一区| 国产伦精品一区二区| 久久不见久久见免费视频1| 国内成人精品一区| 麻豆亚洲精品| av成人免费观看| 国产精品综合不卡av| 欧美在线影院| 狠狠狠色丁香婷婷综合激情| 老司机午夜免费精品视频| 亚洲黄一区二区三区| 久久手机精品视频| 亚洲观看高清完整版在线观看| 久久精品一区二区三区不卡| 在线播放亚洲| 欧美日韩一区二区三区视频| 亚洲在线日韩| 在线观看欧美亚洲| 欧美日韩一区自拍| 欧美一区二区观看视频| 亚洲国产日韩欧美| 国产精品久久久久久久浪潮网站| 久久国产视频网站| 亚洲人午夜精品| 国产精品久久久久毛片大屁完整版| 欧美亚洲免费| 亚洲精品女av网站| 国产亚洲欧美激情| 欧美jjzz| 久久国产精品99国产精| 亚洲第一福利在线观看| 国产精品久久福利| 欧美bbbxxxxx| 亚洲欧美日韩天堂| 亚洲精品护士| 狠狠色伊人亚洲综合成人| 欧美色道久久88综合亚洲精品| 欧美在线视频在线播放完整版免费观看 | 日韩手机在线导航| 免费观看国产成人| 亚洲激情亚洲| 欧美性猛交xxxx乱大交退制版| 亚洲黄色成人| 国产农村妇女毛片精品久久麻豆 | 欧美在线一级视频| 在线国产欧美| 国产伦精品一区二区三区照片91 | 亚洲天堂免费观看|