三次贝塞尔曲线的应用示例(Canvas+HTML)

三次贝塞尔曲线是一种常用的数学曲线,它在计算机图形学、动画制作、产品设计等领域有着广泛的应用。下面是一个关于三次贝塞尔曲线的应用示例,通过这个示例,我们可以更好地理解它的用途和实现方式。

假设我们要在网页上绘制一个弯曲的线条,要求线条经过三个指定的点。由于直接连接这三个点会形成一个折线,而不是平滑的曲线,因此我们需要使用三次贝塞尔曲线来实现这一效果。

首先,我们需要确定三个控制点。控制点是用来控制曲线的形状和方向的点,通过改变控制点的位置,我们可以得到不同的曲线形状。在本例中,我们假设有三个控制点A、B和C。

接下来,我们需要使用三次贝塞尔曲线公式来计算曲线上的点。三次贝塞尔曲线的公式如下:
P(t) = (1-t)^3 * P0 + 3*(1-t)^2 * t * P1 + 3*(1-t) * t^2 * P2 + t^3 * P3
其中,P0、P1、P2和P3分别表示曲线的起点、第一个控制点、第二个控制点和终点。t是一个参数,取值范围为0到1之间。

通过遍历不同的t值,我们可以得到曲线上的点集。在本例中,我们使用0到1之间的等间隔的10个t值来计算曲线上的点。

最后,我们将计算得到的点集绘制到Canvas画布上。具体实现方式是使用Canvas API提供的绘图函数,例如moveTo()lineTo()bezierCurveTo()等。在本例中,我们使用bezierCurveTo()函数来绘制曲线。

示例效果与源代码:

运行效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<!DOCTYPE html>
<html>

<head>
<title>绘制曲线和路径(quadraticCurveTo)</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="图形系统开发实战:基础篇 示例">
<meta name="author" content="hjq">
<meta name="keywords" content="canvas,ladder,javascript,图形">
<script src="./js/helper.js"></script>
</head>

<body style="overflow: hidden; margin:10px;">
<canvas id="canvas" width="660" height="320"
style="border:solid 1px #CCCCCC; box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.5);"></canvas>
</body>
<script>
// 从页面中获取画板对象
let canvas = document.getElementById('canvas');
// 从画板中获取“2D渲染上下文”对象
let ctx = canvas.getContext('2d');
// 绘制背景网格线
drawGrid('lightgray', 10, 10);

// 字母E
ctx.beginPath();
ctx.moveTo(506, 91)
ctx.bezierCurveTo(475, 91, 457, 115, 453, 140)
ctx.lineTo(560, 140)
ctx.bezierCurveTo(557, 116, 540, 91, 506, 91)
ctx.moveTo(454, 175)
ctx.bezierCurveTo(460, 202, 482, 220, 513, 220)
ctx.bezierCurveTo(529, 220, 553, 214, 568, 199)
ctx.lineTo(595, 230)
ctx.bezierCurveTo(570, 256, 534, 263, 508, 263)
ctx.bezierCurveTo(448, 263, 400, 219, 400, 157)
ctx.bezierCurveTo(400, 99, 444, 50, 506, 50)
ctx.bezierCurveTo(565, 50, 609, 96, 609, 157)
ctx.lineTo(609, 174)
ctx.lineTo(454, 174)
ctx.lineTo(454, 175)
ctx.closePath()

// 字母M
ctx.moveTo(305, 263)
ctx.lineTo(305, 132)
ctx.bezierCurveTo(305, 110, 294, 97, 274, 97)
ctx.bezierCurveTo(255, 97, 242, 110, 234, 120)
ctx.lineTo(234, 264)
ctx.lineTo(180, 264)
ctx.lineTo(180, 132)
ctx.bezierCurveTo(180, 110, 170, 97, 149, 97)
ctx.bezierCurveTo(131, 97, 118, 110, 110, 120)
ctx.lineTo(110, 264)
ctx.lineTo(56, 264)
ctx.lineTo(56, 54)
ctx.lineTo(110, 54)
ctx.lineTo(110, 80)
ctx.bezierCurveTo(119, 69, 140, 51, 172, 51)
ctx.bezierCurveTo(201, 51, 221, 63, 229, 88)
ctx.bezierCurveTo(242, 70, 264, 51, 297, 51)
ctx.bezierCurveTo(336, 51, 359, 74, 359, 119)
ctx.lineTo(359, 263)
ctx.lineTo(304, 263)
ctx.lineTo(305, 263)
ctx.closePath()

// 描边
ctx.lineWidth = 4;
ctx.fill();
</script>

</html>

通过这个示例,我们可以看到三次贝塞尔曲线在计算机图形学中的实际应用。它可以通过改变控制点的位置和数量来调整曲线的形状和弯曲程度,从而在网页设计、游戏开发、数据可视化等领域中得到广泛应用。

尝试一下 »