欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

html5如何使用lineTo/arc/bezierCurveTo畫橢圓形

這篇文章主要介紹html5如何使用lineTo/arc/bezierCurveTo畫橢圓形,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

我們擁有十余年網(wǎng)頁設計和網(wǎng)站建設經(jīng)驗,從網(wǎng)站策劃到網(wǎng)站制作,我們的網(wǎng)頁設計師為您提供的解決方案。為企業(yè)提供網(wǎng)站建設、成都網(wǎng)站設計、微信開發(fā)、微信平臺小程序開發(fā)、成都手機網(wǎng)站制作H5建站、等業(yè)務。無論您有什么樣的網(wǎng)站設計或者設計方案要求,我們都將富于創(chuàng)造性的提供專業(yè)設計服務并滿足您的需求。


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循環(huán)360次,畫出每一度的線段,最終連成一個橢圓。其中需要用到三角函數(shù)正弦余弦進行計算。
注意,這個方法的第2個參數(shù)是個數(shù)組,即橢圓的圓心坐標.

思路很奇葩,而且畫出的橢圓也比較平滑。但不值得大家使用&mdash;&mdash;此方法每畫一個橢圓,就要循環(huán)360次,只有畫的橢圓稍微一多,對瀏覽器的性能就是個考驗。
我們只用了解一下他的思路即可
2,使用arc畫圓,然后把他縮放成一個橢圓
這個方法的原文在此,核心函數(shù)如下:

代碼如下:


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函數(shù),即scale,他能實現(xiàn)canvas的縮放。縮放有水平和垂直兩個方向,代碼中把canvas水平方向放大了,而垂直方向不變,so,原來arc畫出的圓形就變成了一個橢圓。
這個方法初看甚妙,代碼少,而且原理淺顯易懂。但分析一下就能發(fā)現(xiàn)他的明顯缺點了,就是&mdash;&mdash;不精確!比如我需要寬171高56的橢圓,此時我們如果把arc的半徑定為28的話,那么后面就要為171/28/2這個蛋疼的不知所云的數(shù)字郁悶了。

不過有個折中的辦法是始終把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參數(shù),有個很奇特的值,相信很多人在幾何專家告訴你為什么他要取這個值之前,都不明白為什么非要取這個值&mdash;&mdash;我到現(xiàn)在還是不知道。并且我有很強烈的想把他改一下看看有什么后果的沖動。

當然我這種類似強迫癥患者的沖動并不能說成是此方法的缺點,他真正的缺點是&mdash;&mdash;為什么要用4條貝塞爾曲線?我個人覺得,一個橢圓明顯是由兩條貝塞爾曲線組成的而不是4條。這個想法最終讓我找到了最完美的畫橢圓的方法。
 4,使用兩條貝賽爾曲線畫出橢圓
為了了解上一個方法能否精簡,我專門注冊了一個stackoverflow的帳號去提問,由于問題里有圖片,積分不夠不能傳,我還迫不得已用勉勉強強的英語水平去回答老外的問題掙積分。但最終好運到了,回答一個問題就解決了我的積分問題。
我提的貝賽爾曲線和橢圓的關系的問題在此.
說實話,下面老外的回答我大部分沒看懂,但幸虧他提供了一個代碼示例頁,讓我明白了原理,在此對他表示再次的感謝。而根據(jù)他的解答,我找到的畫橢圓的方法如下:

代碼如下:


//橢圓
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這一點已經(jīng)在代碼中體現(xiàn)了。

以上是“html5如何使用lineTo/arc/bezierCurveTo畫橢圓形”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

當前題目:html5如何使用lineTo/arc/bezierCurveTo畫橢圓形
網(wǎng)頁網(wǎng)址:http://aaarwkj.com/article46/ggpihg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、定制開發(fā)、響應式網(wǎng)站、電子商務面包屑導航、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
国产黄片自拍视频免费看| 国产黄色片网站在线看| 精品亚洲一区二区三区四| 国产黄片自拍视频免费看| 久久精品中文字幕人妻| 九九精品在线观看视频| 国产极品美女高潮抽搐| 在线观看中文字幕不卡二区| 青青草视频免费观看高清在线观看新| 久久精品国产免费夜夜嗨 | 欧美日韩国产天堂一区| 婷婷精品国产欧美精品亚洲| 国产一区二区三区在线精品专区| 麻豆黄片在线免费观看| 东京男人的天堂国产av| 亚洲免费av一区二区| 国产一区二区不卡自拍| 国产精品熟女亚洲av| 亚洲一区二区日韩在线| 在线免费观看国产不卡| 欧美日韩福利视频在线| 亚洲天堂日韩欧美在线一区| 十八禁无遮挡污污污网站| 中文字幕人妻秘书社长| 亚洲国产精品青青草| 国内揄拍国内精品少妇国| 熟女人妻精品一二三四| 亚洲国产日韩精品一区二| 国产精品久久99粉嫩| 成年人在线免费观看国产| 亚洲国产成人精品福利| 色六月婷婷六月久久六月| 91美女黑丝免费国产视频| 亚洲成人av在线蜜桃| 国产亚洲欧美日韩激情在线| av中文字幕啊嗯不要| 97青青草免费在线视频| 国产在线精品91国自产拍| 亚洲精品人妻av在线| 人妻的秘密一区二区三区| 国产高清自拍视频在线一区|