贝塞尔曲线的类型
bezierCurveTo() 向路径添加三次贝塞尔曲线。三次贝塞尔曲线有一个起点和终点以及两个控制点(共4个点)
quadraticCurveTo() 向路径添加二次贝塞尔曲线。二次贝塞尔曲线有一个起点和终点以及一个控制点(共3个点)
控制点远离端点
两个贝塞尔曲线的第一个点是添加到当前路径的最后一个点。在起点或终点上添加控制点会导致问题。这可能是由于起点或终点与控制点之间的距离为零,不可能沿零长度的线进行插值。
使用二次曲线(3 点)
由于您只给出了 3 个独特的点,我假设您想要的是二次曲线而不是三次曲线。
因此您可以更改代码
ctx.moveTo(33.7605,56.51376); // start point
ctx.bezierCurveTo(
33.76049625, 56.51376, // control point 1 duplicated coordinate (too close)
117.53628, 247.02303, // control point 2
742.75229, 221.65138 // end point
);
并使用quadraticCurveTo,作为...
ctx.moveTo(33.76049625, 56.51376); // start point
ctx.quadraticCurveTo(
117.53628, 247.02303, // control point 1
742.75229, 221.65138 // end point
);
示例
红色曲线是具有未定义起点的立方。据我所知,没有起点,行为是未定义的。
黑色曲线是代码中 3 个坐标的二次方。
const ctx = myCanvas.getContext("2d");
ctx.lineWidth = 4; ctx.strokeStyle = "Red";
ctx.beginPath();
ctx.bezierCurveTo(
33.76049625, 56.51376, // control point 1 duplicated coordinate (too close)
117.53628, 247.02303, // control point 2
742.75229, 221.65138); // end point
ctx.stroke();
ctx.strokeStyle = "Black";
ctx.beginPath();
ctx.moveTo(33.76049625, 56.51376); // start point
ctx.quadraticCurveTo(
117.53628, 247.02303, // control point 1
742.75229, 221.65138); // end point
ctx.stroke();
<canvas id="myCanvas" width="800" height="800" style="border:1px solid #d3d3d3;">