Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何理解并应用贝塞尔曲线贝塞尔曲线原理实际应用总结

如何理解并应用贝塞尔曲线贝塞尔曲线原理实际应用总结

作者头像
用户2356368
发布于 2019-04-03 08:11:25
发布于 2019-04-03 08:11:25
4.4K00
代码可运行
举报
文章被收录于专栏:薄荷前端薄荷前端
运行总次数:0
代码可运行

贝塞尔曲线又叫贝兹曲线,在大学高数中一度让我非常头疼。前阵子练手写动画的时候,发现贝塞尔曲线可以应用于轨迹的绘制以及定义动画曲线。

本文就来探究一下,贝塞尔曲线到底是个什么样的存在。

贝塞尔曲线原理

贝塞尔曲线由n个点来决定,其曲线轨迹可以由一个公式来得出:

其中n就代表了贝塞尔曲线是几阶曲线,该公式描述了曲线运动的路径。

以下我们来讨论一下,贝塞尔公式如何推导。

一阶贝塞尔曲线

设定图中运动的点为Pt,t为运动时间,t∈(0,1),可得如下公式

二阶贝塞尔曲线

在二阶贝塞尔曲线中,已知三点恒定(P0,P1,P2),设定在P0P1中的点为Pa,在P1P2中的点为Pb,Pt在PaPb上的点,这三点都在相同时间t内做匀速运动。

由公式(1)可知

将公式(2)(3)代入公式(4)中,可得

三阶贝塞尔曲线

同理,根据以上的推导过程可得

由此可以推导

n阶贝塞尔曲线

放上一个网址,随意感受一下贝塞尔曲线的绘制过程:

myst729.github.io/bezier-curv…

实际应用

贝塞尔曲线在前端中主要有两方面的应用,一方面可以作为动画曲线应用于CSS3动画中;另一方面可以通过canvas来绘制曲线达到需要的效果。

CSS3中贝塞尔曲线的应用

在CSS3中,有两属性经常被用到:transition-timing-functionanimation-timing-function,这两个分别代表了过渡的速度和动画的速度。CSS3为我们提供了一个新的工具——cubic-bezier(x1,y1,x2,y2)。这个工具能够生成一个速度曲线,使我们的元素按照该曲线来调节速度。

在上面的推导中,我们知道在贝塞尔公式中,有两个点的位置恒定——P0和P1,cubic-bezier中定义了两个控制点的位置,所以该曲线为三阶贝塞尔曲线。

有个网站可以方便我们快速建立一个贝塞尔曲线:cubic-bezier

贝塞尔曲线与动画曲线的关联

先来一波动图简单粗暴的感受一下: 例一:

例二:

例三:

左边的是贝塞尔曲线,横轴代表了事件,竖轴代表了进度,无法直观得感受出速度的变化。

右边的曲线是控制面板中的动画曲线,横轴是时间,竖轴是速度,可以方面地看出速度的变化。

上述例子中,以前进反向为速度正方向,后退方向为速度反方向。

如何得知速度的变化

推导

例一中,贝塞尔曲线为一条直线,当时间均匀变化时,进度也在均匀变大,由此可知速度恒定不变,时间和进度之间的关系可以用一个线性方程来表示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
y=ax+b (a=1,b=0)
复制代码

其中x为时间,y为进度,a即为速度。

推导案例一

从上面结论中启发,去观察其他贝塞尔曲线,

图中是一段变化的曲线,我们取其中一小段,将其看作稳定不变的一段直线,通过下面的线性方程来表示,并通过红线标注在图中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
y=ax+b
复制代码

根据初中数学的内容,我们知道,当a>1时,与x轴的夹角∈(45°,90°);当a∈(0,1)时,与x轴的夹角在(0,45°)之间。相同的时间内,与x轴的夹角越大,a越大,速度越快。

观察上图的夹角变化趋势,夹角逐渐变小趋向于0,而后逐渐变大,趋向于90°,对应速度应是速度逐渐变慢趋向于0,之后逐渐变快。

放上动画曲线以及动图来验证一下我们的推测:

推导案例二

下图中的曲线部分在第四象限,部分在第一象限,这时对应的动画曲线该如何推导呢。

同样将该曲线视为由n段平滑的直线构成,由线性方程来表示直线的趋势,可知速度a方向一开始为负,之后慢慢向正方靠近,a的速率也在由大变小,当为0时,再向正方慢慢变大。即该曲线表示元素一开始在朝反方向减速运动,当速度为0后,向正方向作加速运动。

通过动画曲线及动图来验证上述推导:

验证

用两个曲线来验证一下上面的结论:

曲线一:
曲线二:

从结果可以判断,用上述推导方法可以正确得出贝塞尔曲线与动画曲线之间的关系。

动画曲线的应用

了解了如何用贝塞尔曲线来指定动画曲线后,很多动画涉及到速度方面的效果就可以实现了,例如小车加速刹车,弹簧动画等速度轨迹都可以根据自己的需要来进行定制。

放上一个缓动函数速查网址,可以让自己的动效更加真实:缓动函数

放一个小例子:

该动画模拟了小球落下回弹的过程

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <div class="ground">
      <div class="ball" id="ball"></div>
    </div>
复制代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
      .ball {
        width: 30px;
        height: 30px;
        background: #000000;
        border-radius: 50%;
        position: absolute;
        top: 0;
        left: 50%;
        animation: move 4s cubic-bezier(0.36, 1.7, 0.26, 0.61) 1s infinite;
      }

      @keyframes move {
        0% {
          top: 0;
        }
        100% {
          top: 90%;
        }
      }
复制代码

这类动画可以参考网上大大们的案例:

贝塞尔曲线与CSS3动画、SVG和canvas的应用

理解与运用贝塞尔曲线

利用canvas绘制贝塞尔曲线

canvas中提供了api可以快速绘制一条贝塞尔曲线,来达到需要的效果:

二阶贝塞尔曲线

quadraticCurveTo(x1,y1,x2,y2)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
ctx.beginPath();
ctx.moveTo(20,20);
ctx.quadraticCurveTo(40,200,200,20);
ctx.stroke();
复制代码

其中moveTo定义了起始点,quadraticCurveTo(x1,y1,x2,y2)中的(x1,y1)为控制点,(x2,y2)为终点

三阶贝塞尔曲线

bezierCurveTo(x1,y1,x2,y2,x3,y3)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
ctx.beginPath();
ctx.moveTo(20,20);
ctx.bezierCurveTo(40,100,200,150,200,20);
ctx.stroke();
复制代码

其中moveTo定义了起始点,bezierCurveTo(x1,y1,x2,y2)中的(x1,y1),(x2,y2)为控制点,(x3,y3)为终点

总结

为了弄清贝塞尔曲线是个什么东西,和动画曲线、速度又有什么关联,作者跑去复习了一下那些早扔给老师的东西,有说错的请轻拍/(ㄒoㄒ)/~~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年03月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何理解并应用贝塞尔曲线
贝塞尔曲线又叫贝兹曲线,在大学高数中一度让我非常头疼。前阵子练手写动画的时候,发现贝塞尔曲线可以应用于轨迹的绘制以及定义动画曲线。
用户2356368
2022/04/07
1.3K0
如何理解并应用贝塞尔曲线
【干货满满】贝塞尔曲线(Bézier curve)——什么神仙操作
学习CSS的小伙伴应该会知道一个叫做animation-timing-function:cubic-bezier(x1,y1,x2,y2)的参数,用于CSS动画时间的参数。如果无法理解,就假象下匀速运动和变速运动的。如果还是没感觉,就想象你在跑步机上跑步,1小时内,有时用8KM/h的速度,有时候用10KM/h的速度。也就是animation-timing-function:cubic-bezier(x1,y1,x2,y2)的意思就是让你在一定时间内,用不同的速度运动(运动方式不限,可以是平移,旋转,拉伸……)。
小美娜娜
2019/04/04
2.4K0
【干货满满】贝塞尔曲线(Bézier curve)——什么神仙操作
一条神奇的贝塞尔曲线及其应用
贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,我们在绘图工具上看到的钢笔工具就是来做这种矢量曲线的 。
程序员小猿
2021/01/18
7910
一条神奇的贝塞尔曲线及其应用
Canvas入门到高级详解(中)
以上两个值都可以接受颜色名,16 进制数据,rgb 值,甚至 rgba. 一般先进行设置样式然后进行绘制。
老马
2019/05/25
2K0
HTML5 Canvas开发详解(基础一)
Canvas又称为“画布”,是HTML5的核心技术之一,通常说的Canvas技术,指的就是使用Canvas元素结合JavaScript来绘制各种图形的技术。
爱学习的程序媛
2022/04/07
3.9K0
animate-timing-function属性的cubic-bezier() 函数比较贝塞尔曲线的快慢
今天前端笔试遇到了一个题考察动画animate-timing-function属性的cubic-bezier() 函数,比较贝塞尔曲线的快慢。 如题: 【问题】下面使用Animate-timing-function定义的贝塞尔曲线,哪一个是先快后慢的(A)
程序媛夏天
2024/01/18
2500
animate-timing-function属性的cubic-bezier() 函数比较贝塞尔曲线的快慢
Echarts 无法实现这个曲线图,那我手写一个
最近有个图表需求,怎么配置也配置不好,十分头疼。所以想借着这个问题手写实现一个交互体验还不错的曲线图,支持开场动画、自动根据父盒子宽度适配、比echarts更全的配置项,分区线段的可以更好的自定义等。 效果如下
zz_jesse
2023/09/11
5570
Echarts 无法实现这个曲线图,那我手写一个
Android之贝赛尔曲线及其应用场景
导语 本文对贝赛尔曲线的公式及推导过程进行了深入学习,同时结合网上的资料,整理了一些其常用的应用场景。 前段时间做送礼动画需求的时候遇到送礼轨迹需要平滑的要求,因此对常用的平滑轨迹贝赛尔曲线进行了
MelonTeam
2018/01/04
1.8K0
Android之贝赛尔曲线及其应用场景
【Web技术】1139- 手把手教你实现手绘风格图形
https://juejin.cn/post/6942262577460314143
pingan8787
2021/11/17
8760
【Android UI】贝塞尔曲线 ③ ( 贝塞尔曲线关键点坐标记录 | 二阶贝塞尔曲线示例 )
贝塞尔曲线参考 : https://github.com/venshine/BezierMaker
韩曙亮
2023/03/30
5340
【Android UI】贝塞尔曲线 ③ ( 贝塞尔曲线关键点坐标记录 | 二阶贝塞尔曲线示例 )
Canvas系列(2):曲线图形
我们的代码是加在上一章最后的坐标系中的,如果直接使用arc画弧的话,那么起始点是上一个绘制的结束,也就是绘制坐标系的结束位置,为了让之前的代码的结束不在作为本次绘制的开始,我们使用了新的APIcontext.beginPath();,用来开启一个新的路径,路径相关的知识会在下一章跟大家分享。我们这里绘制了一个圆心是(150,75),半径是60,从0度到90度的弧。由上我们可以看出弧的角度是按照我们高中学的坐标系来的。所以,学习是有用的!!!
kai666666
2020/10/19
1.1K0
Canvas系列(2):曲线图形
Android 贝塞尔曲线解析
相信很多同学都知道“贝塞尔曲线”这个词,我们在很多地方都能经常看到。利用“贝塞尔曲线”可以做出很多好看的UI效果,本篇博客就让我们一起学习“贝塞尔曲线”。
老马的编程之旅
2022/06/22
1.3K0
Android 贝塞尔曲线解析
第157天:canvas基础知识详解
    github地址: https://github.com/malun666/AndyJS2
半指温柔乐
2018/09/11
5.3K0
第157天:canvas基础知识详解
【Android UI】贝塞尔曲线 ④ ( 使用 android.graphics.Path 提供的 cubicTo 方法绘制三阶贝塞尔曲线示例 )
贝塞尔曲线参考 : https://github.com/venshine/BezierMaker
韩曙亮
2023/03/30
8400
【Android UI】贝塞尔曲线 ④ ( 使用 android.graphics.Path 提供的 cubicTo 方法绘制三阶贝塞尔曲线示例 )
Android 贝塞尔曲线实现水纹波动效果
最近工作上比较忙碌,很久没有更新文章了,难得国庆小长假,现在是2019年10月2日凌晨00:49,写一篇简单且实用的贝塞尔曲线应用,许多技术点的文章很多前辈都已经写的很好了,所以 如有纰漏之处,欢迎留言指正,同时也欢迎各位留言需要的技术点类型,争取奉献更优质的技术文章。
黄林晴
2019/10/22
1.3K0
Android 贝塞尔曲线实现水纹波动效果
自定义控件详解(八):贝塞尔曲线
Path类有4个贝塞尔曲线相关方法: //二阶贝赛尔 public void quadTo(float x1, float y1, float x2, float y2) public void rQuadTo(float dx1, float dy1, float dx2, float dy2) //三阶贝赛尔 public void cubicTo(float x1, float y1, float x2, float y2,float x3, float y3) public vo
听着music睡
2018/06/08
5350
canvas绘图基本使用方法(二)
转载至博客http://blog.csdn.net/u014607184/article/details/51746384 诗渊
javascript艺术
2021/05/28
8300
canvas绘图基本使用方法(二)
OpenGL ES 绘制贝塞尔曲线
最近要求为图像设计流线型曲线边框,想着可以用 OpenGL 绘制贝塞尔曲线,再加上模板测试来实现,趁机尝试一波。
字节流动
2020/06/02
1.3K0
css3 transition原理(动画系列二)
CSS 过渡(transition)是通过定义元素从 起点的状态 和 结束点的状态 ,在一定的时间区间内实现元素平滑地过渡或变化 的一种补间动画机制。你可以让属性的改变过程持续一段时间,而不是立即生效。
全栈程序员站长
2022/09/14
1.4K0
【Flutter高级玩法】 贝塞尔曲线的表象认知
由于点位需要变化,BezierPainter只承担绘制的责任,这里在组件中定义点位信息_pos和选中索引_selectIndex ,通过构造函数传入BezierPainter。为了方便大家玩耍,我单独写个文件play_bezier2.dart里面有个PlayBezier2Page组件。
张风捷特烈
2020/04/30
1.7K0
【Flutter高级玩法】 贝塞尔曲线的表象认知
推荐阅读
相关推荐
如何理解并应用贝塞尔曲线
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验