Canvas 与 贝塞尔曲线(初步)

Posted 前端深夜告解室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Canvas 与 贝塞尔曲线(初步)相关的知识,希望对你有一定的参考价值。

html5 技术发展至今,已经是前端工程师必备技能树之一了,而 Canvas 作为 HTML5 中重要的绘图工具,如今与 SVG 一起,共同撑起 web 可视化的天地。

Canvas 现在已经得到广大浏览器厂商的支持:

The canvas element is part of HTML5 and allows for dynamic, scriptable rendering of 2D shapes and bitmap images. It is a low level, procedural model that updates a bitmap and does not have a built-in scene graph.

这是摘自维基百科对 Canvas 的一句话介绍。简单来说,Canvas 就是用来绘制图形的。

Canvas 简单介绍

认识 Canvas

也许你没有用过 Canvas,这里有一篇官方教程足以让你用 Canvas 绘制一个简单的图形。如果你已经熟悉 Canvas,可以跳过这个章节,直接看下一章。

https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial

简单来说,Canvas 就是一个 HTML 标签,通过 javascript 控制 Canvas 上下文,以达到绘制图形的目的。简单实例:

Canvas 与 贝塞尔曲线(初步)

展现在浏览器中:

Canvas 与 贝塞尔曲线(初步)

数据驱动渲染

正因为我们利用 JavaScript 来控制 Canvas 上下文来渲染图形,我们就很容易的利用数据来驱动 Canvas 的渲染。

这里自己写了一个非常简单的《别踩白块》小游戏,其原理就是利用数据的变动,来渲染 Canvas 画布更新。核心代码不到 100 行,我就放出来了:

Canvas 与 贝塞尔曲线(初步)

有兴趣的同学可以尝试利用 Canvas 写一些小游戏,非常适合用 Canvas 来进行渲染,比如 扫雷游戏。

Canvas 与 贝塞尔曲线

至此,我们对 Canvas 是一个怎样的元素有了一个较为清晰的认识,我们可以利用 Canvas API 来绘制基本形状了,但是这远不能满足我们对 Canvas 的探知,Canvas 绘制复杂图形的能力如何?

画图

画家利用手中的画笔,画出了很多不可思议的美景。Canvas 也提供了你这种能力。

A Bézier curve (pronounced [bezje]) is a parametric curve frequently used in computer graphics and related fields. Generalizations of Bézier curves to higher dimensions are called Bézier surfaces, of which the Bézier triangle is a special case.

In vector graphics, Bézier curves are used to model smooth curves that can be scaled indefinitely. "Paths", as they are commonly referred to in image manipulation programs,[note 1] are combinations of linked Bézier curves. Paths are not bound by the limits of rasterized images and are intuitive to modify.

以上摘自维基百科对 贝塞尔曲线的表述,看的出来,贝塞尔曲线对于绘制矢量图形的 Canvas 来说,简直是天作之合,而 Canvas 也提供了绘制贝塞尔曲线的接口,有了贝塞尔曲线,我们就可以绘制各种各样的图形了。

Canvas 与 贝塞尔曲线(初步)

简单看一个 Canvas 的贝塞尔曲线实现的 DEMO:

Canvas 与 贝塞尔曲线(初步)

浏览器中:

Canvas 与 贝塞尔曲线(初步)

心这种不规则的曲线,就是贝塞尔曲线绘制出来的。

贝塞尔曲线通过“控制点”来绘制平滑曲线

看到上面的代码,很多没有接触过这个 API 的同学就会懵了,这一连串数字参数是什么?

其实就是在告诉 Canvas,绘制贝塞尔曲线所用的控制点。贝塞尔曲线就是利用这些控制点开绘制一条平滑的曲线。

其公式很简单(P1 就是控制点):

Canvas 与 贝塞尔曲线(初步)

二次贝塞尔曲线

二次贝塞尔曲线,用过一个控制点,在首尾两点之间绘制一条曲线:

Canvas 与 贝塞尔曲线(初步)

高阶贝塞尔曲线

所谓高阶,其实就是通过更多的控制点,在首尾两点之间绘制一条更为复杂的曲线:

Canvas 与 贝塞尔曲线(初步)

Canvas 与 贝塞尔曲线(初步)

Canvas 与 贝塞尔曲线(初步)

除了 Canvas 中我们会用到 贝塞尔曲线 外,我们 CSS3 中常用的 transition属性,其缓动速率也是利用了贝塞尔曲线。

至此,我们就可以在 Canvas 中绘制任何我们想要的图形了。

结束了吗?

思考一个场景,我们需要绘制一张数据图表,这个数据的变化趋势是动态连续的。后端同学提供给前端的数据往往不会那么密集的(假设以一小时为单位,那么一天只有12个精准数据)。

很容易想到利用贝塞尔曲线平滑地穿过这些散点,可是细心的同学会发现,贝塞尔曲线是通过控制点来控制曲线,曲线并不穿过这些控制点。

那么如何找到这些控制点呢,使曲线可以平滑地穿过这些散点?有兴趣的同学可以研究研究,我将在下一篇 Canvas 与 贝塞尔曲线的文章中提供一种解决方案。


Canvas 与 贝塞尔曲线(初步)

简历请投递至邮箱

FSP.FE@meituan.com


Canvas 与 贝塞尔曲线(初步)

新美大智能支付终端团队


面向互联网开发从业者;

我们将分享团队技术文章,提供研发岗位招聘信息等。


以上是关于Canvas 与 贝塞尔曲线(初步)的主要内容,如果未能解决你的问题,请参考以下文章

canvas绘制曲线

canvas 绘制三次贝塞尔曲线

canvas 绘制二次贝塞尔曲线

JavaScript+canvas 利用贝塞尔曲线绘制曲线

从阅读仿真页看贝塞尔曲线

canvas抛物线运动轨迹