前言

在我们日常开发中贝塞尔曲线无处不在:

  1. svg 中的曲线(支持 2阶、 3阶)
  2. canvas 中绘制贝塞尔曲线
  3. 几乎所有前端2D或3D图形图表库(echarts,d3,three.js)都会使用到贝塞尔曲线

所以掌握贝塞尔曲线势在必得。 这篇文章主要是实战篇,不会介绍和贝塞尔相关的知识, 如果有同学对贝塞尔曲线不是很清楚的话:可以查看我这篇文章——深入理解SVG

绘制贝塞尔曲线

第一步我们先创建ctx, 用ctx 画一个二阶贝塞尔曲线看下。二阶贝塞尔曲线有1个控制点,一个起点,一个终点。

const canvas = document.getElementById( 'canvas' );
const ctx = canvas.getContext( '2d' );
ctx.beginPath();
ctx.lineWidth = 2;
ctx.strokeStyle = '#000';
ctx.moveTo(100,100)
ctx.quadraticCurveTo(180,50, 200,200)
ctx.stroke();

这样我们就画好了一个贝塞尔曲线了。

绘制贝塞尔曲线动画

画一条线谁不会哇?接下来文章的主体内容。 首先试想一下动画我们肯定一步步画出曲线? 但是这个ctx给我们全部画出来了是不是有点问题。我们重新看下二阶贝塞尔曲线的实现过程动画,看看是否有思路。

从图中可以分析得出贝塞尔上的曲线是和t有关系的, t的区间是在0-1之间,我们是不是可以通过二阶贝塞尔的曲线方程去算出每一个点呢,这个专业术语叫离散化,但是这样的得出来的点的信息是不太准的,我们先这样实现。

先看下方程:

我们模拟写出代码如如下:

//这个就是二阶贝塞尔曲线方程
function twoBezizer(p0, p1, p2, t) {const k = 1 - treturn k * k * p0 + 2 * (1 - t) * t * p1 + t * t * p2
}//离散
function drawWithDiscrete(ctx, start, control, end,percent) {for ( let t = 0; t <= percent / 100; t += 0.01 ) {const x = twoBezizer(start[0], control[0], end[0], t)const y = twoBezizer(start[1], control[1], end[1], t)ctx.lineTo(x, y)}
}

我们看下效果:

和我们画的几乎是一模一样,接下啦就用requestAnimationFrame 开始我们的动画给出以下代码:

let percent = 0
function animate() {ctx.clearRect( 0, 0, 800, 800 );ctx.beginPath();ctx.moveTo(100,100)drawWithDiscrete(ctx,[100,100],[180,50],[200,200],percent)ctx.stroke();percent = ( percent + 1 ) % 100;id =  requestAnimationFrame(animate)
}
animate()

这里有两个要注意的是, 我是是percent 不断加1 和100 求余,所以呢 percent 会不断地从1-100 这样往复,OK所以我们必须要动画之前做一次区域清理, ctx.clearRect( 0, 0, 800, 800 ); 这样就可以不断的从开始到结束循环往复,我们看下效果:

看着样子是不是还不错哈哈哈

面试官问我会canvas? 我可以绘制一个烟花动画相关推荐

  1. 前端:用canvas绘制一个烟花动画

    关注并将「趣谈前端」设为星标 每日定时推送技术干货/优秀开源/技术思维 前言 在我们日常开发中贝塞尔曲线无处不在: svg 中的曲线(支持 2阶. 3阶) canvas 中绘制贝塞尔曲线 几乎所有前端 ...

  2. 面试官问我会不会APP抓包,我..

    点击"小詹学Python",选择"置顶"公众号 重磅干货,第一时间送达 本文转载自咸鱼学Python,禁二次转载 标题这个题目应该是我面试答的最好的一题了,所以 ...

  3. 作为一个面试官,我会这样问问题——面试攻略之见招拆招

    核心内容提示: 楼主以一个面试官的身份,解读面试人员会问什么问题,为什么要问这个问题,以及最重要的,如何应答. 希望能给找工作的各位同学一点提示与帮助. PS. 文章写得稍微有点长,关键的地方我都已用 ...

  4. 大叔手记(10):别再让面试官问你单例

    大叔手记(10):别再让面试官问你单例(暨6种实现方式让你堵住面试官的嘴) ... 2012-2-19 09:03| 发布者: benben| 查看: 283| 评论: 0 摘要: 引子经常从Recr ...

  5. 面试官问你“有什么问题问我吗?”,你该如何回答?

    我还记得当时我去参加面试的时候,几乎每一场面试,特别是HR面和高管面的时候,面试官总是会在结尾问我:"问了你这么多问题了,你有什么问题问我吗?".这个时候很多人内心就会陷入短暂的纠 ...

  6. 面试官问面向对象特点_最好的面试官有什么共同点?

    面试官问面向对象特点 by Aline Lerner 通过艾琳·勒纳(Aline Lerner) 最好的面试官有什么共同点? 我们查看了成千上万的真实访谈以找出答案. (What do the bes ...

  7. 面试官问你有什么要问的时候,大胆的提出类似问题

    前言 我还记得当时我去参加面试的时候,几乎每一场面试,特别是HR面和高管面的时候,面试官总是会在结尾问我:"问了你这么多问题了,你有什么问题问我吗?".这个时候很多人内心就会陷入短 ...

  8. 已经成功拿到了几个offer的我来告诉你,Android面试官问的一些问题,看完这一篇就没有拿不到的offer

    前言 我是2020年毕业于中南大学的计算机学院的,大家可以叫我小吴,我嘞毕业之后在华为实习了差不多一年多,一直都从事着Android开发. 然后2021年的时候因为我自己的一些原因打算离职到外面看看, ...

  9. 面试官问:如何看待加班? 你如何完美回答?

    面试中面试官问你啥问题,小编都给你整理在这里了.每天都会整理一份最接地气的面试题,希望能帮助到你! 同时带上一套视频教程[带你横扫PHP职场 全面解读PHP面试],感谢你对公众号的关注,关注以下公众号 ...

最新文章

  1. 有哪些新手程序员不知道的小技巧?
  2. python基础入门视频-Python基础入门视频课程——笔记
  3. 实战项目---模拟商品采购中心信息平台
  4. unity3D 5中如何修改及显示Text的值
  5. 使用Expresso学习.net正则表达式
  6. win7 64位下如何安装配置mysql-5.7.4-m14-winx64(安装记录)
  7. excel制作窗体查询界面_利用 VBA窗体制作excel登录界面
  8. Pycharm快捷键设置(鼠标滚动控制字体大小)
  9. 程序员代码面试指南:IT名企算法与数据结构题目 PDF 版
  10. 阿里有centos7 安装MongoDB及win7下MongoChef的安装
  11. jdk7下载、安装与测试
  12. MobaXterm 保持连接
  13. python企业真题实战 - 妙计旅行面试题
  14. 一个不错的下载年限网站
  15. 如何测试系统的并发量
  16. C语言经典问题——兑换硬币
  17. 完全用Linux编程及其后续
  18. Exception in thread “main“ java.lang.NullPointerException问题
  19. 图像处理里面调色板(Palette)是什么意思?
  20. 创业服务资源获取的途径有哪些?

热门文章

  1. 数据结构与算法书籍、视频、项目、网站、刷题技巧推荐(2021 年持续更新)...
  2. [醉了]解决重启mac但是bash_profile不生效的彻底解决方法
  3. camera闪光灯校准
  4. 高并发 Nginx+Lua OpenResty系列教程汇总篇
  5. 万泽云库平台怎么样,靠谱么
  6. oracle主产品清单位置不可写,真正卸载oracle 11g
  7. Skinmagic--MFC界面美化
  8. RISC-V from scratch 2
  9. 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)读书笔记
  10. 关于求线段和线段,线段和圆弧,圆弧与圆弧的交点算法