繪制三次貝塞爾曲線
1. 前言
上一節(jié)我們學(xué)習(xí)了二次貝塞爾曲線,本節(jié)我們開始學(xué)習(xí)三次貝塞爾曲線。貝塞爾曲線都是由一個(gè)起點(diǎn)、一個(gè)終點(diǎn)和多個(gè)控制點(diǎn)組成。二次貝塞爾曲線有一個(gè)控制點(diǎn),三次貝塞爾曲線有兩個(gè)控制點(diǎn),n 次貝塞爾曲線就有 n-1 個(gè)控制點(diǎn)。
2. 三次貝塞爾曲線
三次貝塞爾曲線是一種三次曲線,它可以向兩個(gè)方向彎曲,由四個(gè)點(diǎn)來定義:兩個(gè)錨點(diǎn)及兩個(gè)控制點(diǎn),控制點(diǎn)用來控制曲線的形狀。
我們先看一下三次貝塞爾曲線的繪制過程:

上圖中 p1 和 p4 是兩個(gè)錨點(diǎn),p2 和 p3 是兩個(gè)控制點(diǎn)。
在線工具
這里介紹一個(gè)開源的在線畫貝塞爾曲線的工具,同學(xué)們可以體驗(yàn)一下:N階貝塞爾曲線生成器
canvas 繪制三次貝塞爾曲線
在 canvas 中,繪制三次貝塞爾曲線和繪制二次貝塞爾曲線方法類似,只是比二次貝塞爾曲線多了一個(gè)控制點(diǎn)參數(shù),具體繪制方法為:
ctx.bezierCurveTo(cpx1,cpy1,cpx2,cpy2,x,y);
先看整體案例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>慕課網(wǎng)Wiki</title>
<style>
#imooc{
border:1px solid #ccc;
}
</style>
</head>
<body>
<canvas id="imooc">您的瀏覽器不支持 HTML5 canvas 標(biāo)簽</canvas>
<script>
const canvas = document.getElementById('imooc');
canvas.width=300
canvas.height=300
const ctx = canvas.getContext('2d');
ctx.strokeStyle="#456795";
ctx.lineWidth=8;
ctx.beginPath();
ctx.moveTo(40,40);
ctx.bezierCurveTo(260,150, 40,260, 160, 80); //調(diào)用了直接繪制橢圓的函數(shù)
ctx.stroke();
//繪制起點(diǎn)
ctx.beginPath();
ctx.arc(40,40,8,0,2*Math.PI)
ctx.fillStyle= "#888"
ctx.fill()
//繪制控制點(diǎn)1
ctx.beginPath();
ctx.arc(260,150,8,0,2*Math.PI)
ctx.fillStyle= "#888"
ctx.fill()
//繪制控制點(diǎn)2
ctx.beginPath();
ctx.arc(40,260,8,0,2*Math.PI)
ctx.fillStyle= "#888"
ctx.fill()
//繪制終點(diǎn)
ctx.beginPath();
ctx.arc(160, 80,8,0,2*Math.PI)
ctx.fillStyle= "#888"
ctx.fill()
</script>
</body>
</html>
運(yùn)行結(jié)果:

這樣我們就繪制了一條三次貝塞爾曲線。
3. 方法整理
本小節(jié)中我們使用到一個(gè)新的方法 bezierCurveTo()
。
3.1 bezierCurveTo() 方法
bezierCurveTo
方法作用是繪制一條三次貝塞爾曲線。
變量說明:
變量名 | 類型 | 是否必須 | 說明 |
---|---|---|---|
cpx1 | Number | 是 | 控制點(diǎn)位置1的X坐標(biāo)。 |
cpy1 | Number | 是 | 控制點(diǎn)位置1的Y坐標(biāo)。 |
cpx2 | Number | 是 | 控制點(diǎn)位置2的X坐標(biāo)。 |
cpy2 | Number | 是 | 控制點(diǎn)位置2的Y坐標(biāo)。 |
x | Number | 是 | 終點(diǎn)位置的X坐標(biāo)。 |
y | Number | 是 | 終點(diǎn)位置的Y坐標(biāo)。 |
4. 總結(jié)
本小節(jié)我們主要學(xué)習(xí)了利用 bezierCurveTo
方法繪制一條三次貝塞爾曲線,這個(gè)方法有6個(gè)參數(shù),分別是兩個(gè)控制點(diǎn)和終點(diǎn)的坐標(biāo)。