html5 Canvas畫圖教學(11)—使用lineTo/arc/bezierCurveTo畫橢圓形_html5教學技巧
在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;ivar 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 ');
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 Math.PI, false Math.PI, false Math.PI, false 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(ct, xEllipse 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.bezierCurve( 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個方法畫出橢圓。 如果你發現了更簡單的方法,也請分享出來大家探討吧。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

英特爾下一代 GPU 架構預計將於 9 月推出,作為英特爾 Lunar Lake 的一部分。與 Meteor Lake 的 Arc Alchemist iGPU 一樣,該 iGPU 擁有多達 8 個 Xe 核心,但新架構預計可實現 50% 的效能提升

canvas箭頭外掛有:1、Fabric.js,具有簡單易用的API,可以創建自訂箭頭效果;2、Konva.js,提供了繪製箭頭的功能,可以創建各種箭頭樣式;3、Pixi.js ,提供了豐富的圖形處理功能,可以實現各種箭頭效果;4、Two.js,可以輕鬆地創建和控制箭頭的樣式和動畫;5、Arrow.js,可以創建各種箭頭效果;6、Rough .js,可以創造手繪效果的箭頭等。

探索Canvas框架:了解常用的Canvas框架有哪些,需要具體程式碼範例引言:Canvas是HTML5中提供的一個繪圖API,透過它我們可以實現豐富的圖形和動畫效果。為了提高繪圖的效率和便利性,許多開發者開發了不同的Canvas框架。本文將介紹一些常用的Canvas框架,並提供具體程式碼範例,以幫助讀者更深入地了解這些框架的使用方法。一、EaselJS框架Ea

canvas時鐘的細節有時鐘外觀、刻度線、數位時鐘、時針、分針和秒針、中心點、動畫效果、其他樣式等。詳細介紹:1、時鐘外觀,可以使用Canvas繪製一個圓形錶盤作為時鐘的外觀,可以設定錶盤的大小、顏色、邊框等樣式;2、刻度線,在錶盤上繪製刻度線,表示小時或分鐘的位置;3、數位時鐘,可在錶盤上繪製數位時鐘,表示目前的小時和分鐘;4、時針、分針和秒針等等。

html2canvas的版本有html2canvas v0.x、html2canvas v1.x等。詳細介紹:1、html2canvas v0.x,這是html2canvas的早期版本,目前最新的穩定版本是v0.5.0-alpha1。它是一個成熟的版本,已經被廣泛使用,並且在許多專案中得到了驗證;2、html2canvas v1.x,這是html2canvas的新版本。

uniapp實現如何使用canvas繪製圖表和動畫效果,需要具體程式碼範例一、引言隨著行動裝置的普及,越來越多的應用程式需要在行動裝置上展示各種圖表和動畫效果。而uniapp作為一款基於Vue.js的跨平台開發框架,提供了使用canvas繪製圖表和動畫效果的能力。本文將介紹uniapp如何使用canvas來實現圖表和動畫效果,並給出具體的程式碼範例。二、canvas

tkinter canvas屬性有bg、bd、relief、width、height、cursor、highlightbackground、highlightcolor、highlightthickness、insertbackground、insertwidth、selectbackground、selectforeground、xscrollcommand屬性等等。詳細介紹

canvas取得滑鼠座標的方法:1、建立一個JavaScript範例檔;2、取得Canvas元素的引用,加入一個滑鼠移動事件的監聽器;3、當滑鼠在Canvas上移動時,會觸發getMousePos函數;4、使用「getBoundingClientRect()」方法取得Canvas元素的位置和大小信息,透過event.clientX和event.clientY取得滑鼠座標即可。
