摘要:貝塞爾曲線提供了兩個(gè)繪制貝塞爾曲線二次貝塞爾曲線,控制點(diǎn)終點(diǎn)三次貝塞爾曲線,控制點(diǎn)一控制點(diǎn)二,終點(diǎn)題外話貝塞爾曲線的數(shù)學(xué)基礎(chǔ)是早在年就廣為人知的伯恩斯坦多項(xiàng)式。的屬性,取值就可以設(shè)置為一個(gè)三次貝塞爾曲線方程。
3.4 貝塞爾曲線
canvas提供了兩個(gè)繪制貝塞爾曲線api:
ctx.quadraticCurveTo(cpx, cpy, x, y);
二次貝塞爾曲線,(cpx, cpy)控制點(diǎn) (x, y)終點(diǎn)
ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
三次貝塞爾曲線,(cp1x, cp1y)控制點(diǎn)一, (cp2x, cp2y)控制點(diǎn)二, (x, y)終點(diǎn)
題外話:
貝塞爾曲線的數(shù)學(xué)基礎(chǔ)是早在 1912 年就廣為人知的伯恩斯坦多項(xiàng)式。最早用來(lái)輔助汽車車體的工業(yè)設(shè)計(jì)。
CSS3的transition-timing-function屬性,取值就可以設(shè)置為一個(gè)三次貝塞爾曲線方程transition-timing-function: cubic-bezier(0.1, 0.7, 1.0, 0.1)。
canvas繪圖示例:
// 二次 ctx.moveTo(200, 100); ctx.quadraticCurveTo(230, 250, 350, 200); // 三次 ctx.moveTo(450, 250); ctx.bezierCurveTo(530, 150, 650, 300, 700, 200);
藍(lán)色是控制點(diǎn)
問(wèn)題一:
那canvas是如何通過(guò)控制點(diǎn)來(lái)繪制出曲線的,或者如果不用這個(gè),自己繪制曲線該如何操作呢:
這個(gè)是n階貝塞爾曲線的方程:
我們重點(diǎn)看二(三)階方程:
B(t)是曲線上的點(diǎn),t在0~1之間取值, P0起始點(diǎn),P2終點(diǎn),P1控制點(diǎn)
t從0~1之間取值不斷增大,B(t)不斷取出曲線上的點(diǎn),從P0移至P1
const bx = (1-t)*(1-t)*start.x + 2*t*(1-t)*control.x + t*t*end.x; const by = (1-t)*(1-t)*start.y + 2*t*(1-t)*control.y + t*t*end.y;
問(wèn)題二:
我咋知道控制點(diǎn)該怎么選,特別是起終點(diǎn)動(dòng)態(tài)數(shù)據(jù)時(shí)(也就是說(shuō),我們使用時(shí),往往只知道起點(diǎn)P0終點(diǎn)P1):
這個(gè)根據(jù)曲線斜率,可視化需求可能選取的方式不一致,不過(guò)大致原理相似
可以在起點(diǎn)和終點(diǎn)的垂直平分線上選一點(diǎn)作為控制點(diǎn), 然后用一個(gè)參數(shù)來(lái)控制曲線的彎曲程度
// curveness 彎曲程度(0-1) const cp = { x: ( start.x + end.x ) / 2 - ( start.y - end.y ) * curveness, y: ( start.y + end.y ) / 2 - ( end.x - start.x ) * curveness };
題外話:
關(guān)于cp點(diǎn)的求解:
線段中點(diǎn):
const mid = [ ( start.x + end.x) / 2, ( start.y + end.y ) / 2 ];
根據(jù)起點(diǎn)和終點(diǎn)也可以得到一個(gè)向量v:
const v = [ end.x - start.x, end.y- start.y ];
將這個(gè)向量順時(shí)針旋轉(zhuǎn)90度,得到一個(gè)垂直于它的向量v2:
const v2 = [ v.y, -v.x ];
那么中間控制點(diǎn)的坐標(biāo)為(向量v2乘curveness加上中間點(diǎn)坐標(biāo))const cp = { x: mid.x + v2.x curveness, y: mid.y + v2.y curveness} =
{ x:( start.x + end.x ) / 2 - ( start.y - end.y ) * curveness,
y:( start.y + end.y ) / 2 - ( end.x - start.x ) * curveness}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/108901.html
摘要:矩形只支持一種原生的圖形繪制矩形。所有其他的圖形的繪制都至少需要生成一條路徑。繪制矩形三種方法繪制一個(gè)填充的矩形繪制一個(gè)矩形的邊框清除指定矩形區(qū)域,讓清除部分完全透明。矩形示例路徑圖形的基本元素是路徑。 2. 矩形 canvas只支持一種原生的圖形繪制:矩形。 所有其他的圖形的繪制都至少需要生成一條路徑。 繪制矩形三種方法: // 繪制一個(gè)填充的矩形 fillRect(x, y, ...
摘要:本文作者利用一些簡(jiǎn)單的對(duì)進(jìn)行了系統(tǒng)的總結(jié),受益匪淺,毫不夸張的說(shuō),學(xué)習(xí)這一篇文章就夠了一簡(jiǎn)介是新增的,一個(gè)可以使用腳本通常為在其中繪制圖像的元素。 本文作者利用一些簡(jiǎn)單的 demo 對(duì) Canvas 進(jìn)行了系統(tǒng)的總結(jié),受益匪淺,毫不夸張的說(shuō),學(xué)習(xí) Canvas 這一篇文章就夠了! 一、canvas簡(jiǎn)介 ? 是 HTML5 新增的,一個(gè)可以使用腳本(通常為JavaScript)在其中繪...
閱讀 3745·2021-10-15 09:42
閱讀 2607·2021-09-03 10:50
閱讀 1654·2021-09-03 10:28
閱讀 1797·2019-08-30 15:54
閱讀 2520·2019-08-30 12:46
閱讀 415·2019-08-30 11:06
閱讀 2829·2019-08-30 10:54
閱讀 531·2019-08-29 12:59