canvas进阶之如何画出平滑的曲线

2020-04-21 07:04:34易采站长站整理
A, B, C, D, E, F
;取前面的
A, B, C
三点,计算出
B
C
的中点
B1
,以
A
为起点,
B
为控制点,
B1
为终点,利用
quadraticCurveTo
绘制一条二次贝塞尔曲线线段;

接下来,计算得出

C
D
点的中点
C1
,以
B1
为起点、
C
为控制点、
C1
为终点继续绘制曲线;

依次类推不断绘制下去,当到最后一个点

F
时,则以
D
E
的中点
D1
为起点,以
E
为控制点,
F
为终点结束贝塞尔曲线。

OK,算法就是这样,那我们基于该算法再对现有代码进行一次升级改造:


let isDown = false;
let points = [];
let beginPoint = null;
const canvas = document.querySelector('#canvas');
const ctx = canvas.getContext('2d');

// 设置线条颜色
ctx.strokeStyle = 'red';
ctx.lineWidth = 1;
ctx.lineJoin = 'round';
ctx.lineCap = 'round';

canvas.addEventListener('mousedown', down, false);
canvas.addEventListener('mousemove', move, false);
canvas.addEventListener('mouseup', up, false);
canvas.addEventListener('mouseout', up, false);

function down(evt) {
isDown = true;
const { x, y } = getPos(evt);
points.push({x, y});
beginPoint = {x, y};
}

function move(evt) {
if (!isDown) return;

const { x, y } = getPos(evt);
points.push({x, y});

if (points.length > 3) {
const lastTwoPoints = points.slice(-2);
const controlPoint = lastTwoPoints[0];
const endPoint = {
x: (lastTwoPoints[0].x + lastTwoPoints[1].x) / 2,