最近在看svg相关知识时,看到贝塞尔曲线,之前也知道有这个,但一直不知道它到底是个什么东西(大学好像学过,但已经还给老师了)

在网上找到一篇一看就懂的讲解

在Android开发和面试中(尤其是一些中高级岗位面试),面试官可能会问你自定义控件的详细内容,我们知道自定义控件这一块涉及到的内容很多,回答的越多越深入,那么面试的印象会更好。自定义控件涉及的内容比如测量和绘制、事件分发的处理、动画效果的渲染与实现,当然还有不得不提的贝赛尔曲线(实际上一些面试官自己都不是很理解二阶贝塞尔、三阶贝塞尔曲线等概念)。

一些朋友看到以歪果仁大佬名字定义的一些计算公式、定理就头大(比如梅涅劳斯(Menelaus)定理、塞瓦(Ceva)定理等),不得不承认我也是。本着《士兵突击》不抛弃不放弃的精神,因此就算是在难啃的骨头我们也要坚持啃下来!所以本篇文章主要介绍的是贝赛尔曲线的基本概念、在Android的应用场景以及一些思考。不考虑篇幅的情况下力求将概念和理解写的详细。

贝赛尔曲线的前世今生:

贝塞尔曲线,这个命名规则一眼看上去大概是一个叫贝塞尔的数学家发明的。但,贝塞尔曲线依据的最原始的数学公式,是在1912年在数学界广为人知的伯恩斯坦多项式。简单理解,伯恩斯坦多项式可以用来证明,在[ a, b ] 区间上所有的连续函数都可以用多项式来逼近,并且收敛性很强,也就是一致收敛。再简单点,就是一个连续函数,你可以将它写成若干个伯恩斯坦多项式相加的形式,并且,随着 n→∞,这个多项式将一致收敛到原函数,这个就是伯恩斯坦斯的逼近性质。

时光荏苒岁月如梭,镜头切换到了1959年。当时就职于雪铁龙的法国数学家 Paul de Casteljau 开始对伯恩斯坦多项式进行了图形化的尝试,并且提供了一种数值稳定的德卡斯特里奥(de Casteljau) 算法。(多数理论公式是建立在大量且系统的数学建模基础之上研究的规律性成果)根据这个算法,就可以实现 通过很少的控制点,去生成复杂的平滑曲线,也就是贝塞尔曲线

但贝塞尔曲线的声名大噪,不得不提到1962年就职于雷诺的法国工程师皮埃尔·贝塞尔(Pierre Bézier),他使用这种方法来辅助汽车的车体工业设计(最早计算机的诞生则是为了帮助美国海军绘制弹道图),并且广泛宣传(典型的理论联系实际并获得成功的示例),因此大家称为贝塞尔曲线 。

贝赛尔曲线的数学理论:

既然贝赛尔曲线的本质是通过数学计算公式去绘制平滑的曲线,那就可以通过数学工具进行实际求证以及解释说明。当然对其进行数学求证就没必要了,因为这些伟大的数学家们已经做过了,这里只是解释说明:

  • 步骤一:在平面内选3个不同线的点并且依次用线段连接。如下所示..

3点连线

  • 步骤二:在AB和BC线段上找出点D和点E,使得 AD/AB = BE/BC

    AD/AB = BE/BC

  • 步骤三:连接DE,在DE上寻找点F,F点需要满足:DF/DE = AD/AB = BE/BC

    DF/DE = AD/AB = BE/BC

  • 步骤四:最最重要的!根据DE线段和计算公式找出所有的F点,记住是所有的F点,然后将其这些点连接起来。那,连接规则是什么?以上图为例,第一个连接点是A-F,第二连接点是A-F1(这个F1必须满足DF1/DE = AD/AB = BE/BC)以此类推,直到最后连接上C点,下面上一个动图加深理解:

贝塞尔曲线

可能有些朋友还是不理解,那么这个GIF我截下其中的一张图说明,如下图:

示例说明

动图里的P0、P1、P2分别代表的是上图的:P0 == A;P1 == B;P2 == C。那么这个黑色点,代表的就是F点,绿色线段的2个端点(P0-P1线段上的绿色点,代表是就是D点,P0-P2线段上的绿色点,代表是就是E点)。线段上面点的获取,必须要满足等比关系。

关于贝赛尔曲线的基本数学理论大概就是上面的内容。两个线段根据等比关系找点的贝塞尔曲线,一般也称为二阶贝塞尔曲线。

贝赛尔曲线的N阶拓展(三阶贝塞尔与N阶贝塞尔曲线)

刚才说到,上面的贝赛尔曲线一般称为二阶贝塞尔曲线,既然是二阶贝塞尔曲线,那肯定有三阶贝塞尔曲线、四阶贝赛尔曲线等等。其实三阶贝塞尔与四阶贝赛尔曲线以及N阶贝赛尔曲线曲线的规则都是一样的,都是先在线段上找点,这个点必须要满足等比关系,然后依次连接,下面是三阶贝赛尔曲线的解释说明:

  • 步骤一:三阶贝赛尔曲线,简单理解就是在平面内选4个不同线的点并且依次用线段连接(也就是三条线)。如下所示

  • 步骤二:同二阶贝塞尔曲线一样首先需要在线段上找对应的点(E、F、G),对应的点必须要符合等比的计算规则,计算规则如下:AE/AB = BF/BC = CG/CD;找到对应的点以后接着依次链接EF、FG;接着在EF、FG线段上面继续找点H、I,对应的点依旧要符合等比的计算规则,也就是 EH/EF = FI/FG;最后连接H、I线段,在HI线段上面继续找点J、点J的计算规则需要符合:EH/EF = FI/FG = HJ/HI

  • 三阶贝赛尔曲线找点
  • 步骤三:重复步骤二的动作,找到所有的J点,依次将J点连接起来,这样最终完成了三阶贝赛尔曲线。

    J点依次连线

  • 整一个三阶贝赛尔曲线的动作加起来就是下面的一张动图:

三阶贝塞尔

那么四阶贝赛尔曲线的实现步骤也是一样的,平面上先选取5个点(5点4线)、依次选点(满足等比关系)、依次连接、根据计算规则找到所有的点(逐个连接)。。。。。。

四阶贝赛尔曲线

貌似都是从二阶贝塞尔曲线说起的,那么一阶贝赛尔又是怎么样的?一阶贝赛尔如图:

一阶贝赛尔

可以看到一阶贝赛尔是一条直线!因此,N阶贝赛尔不仅可以画平滑的曲线也可以画直线,因此自定义控件画直线又多了一种可选择的方式,但是一般用贝赛尔主要是画曲线,这里只是提供了一种别的解决思路;另外,在Android属性动画,系统为我们提供了一个PathInterpolator插值器。这个PathInterpolator里面就有贝塞尔曲线的身影。有兴趣的小伙伴也可以去了解一下。

转自简书   作者:骑小猪看流星
链接:https://www.jianshu.com/p/0c9b4b681724
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

通俗易懂的贝塞尔曲线讲解(转载)相关推荐

  1. android 详解画图,android画图之贝塞尔曲线讲解详解

    首先对于<赛贝尔曲线>不是很了解的童鞋,请自觉白度百科.google等等... 为了方便偷懒的童鞋,这里给个<贝赛尔曲线>百科地址,以及一段话简述<贝赛尔曲线>: ...

  2. android画图之贝塞尔曲线讲解

    首先对于<赛贝尔曲线>不是很了解的童鞋,请自觉白度百科.google等等... 为了方便偷懒的童鞋,这里给个<贝赛尔曲线>百科地址,以及一段话简述<贝赛尔曲线>: ...

  3. 来自程序猿的爱心表白——贝塞尔曲线讲解及实例

    一.概述 Berzier curve是应用于二维图形应用程序的数学曲线.曲线定义:起始点.终止点(也称锚点).控制点.通过调整控制点,贝塞尔曲线的形状会发生变化.1962年,法国数学家Pierre B ...

  4. 【HTML 中的二次贝塞尔曲线 和三次贝塞尔曲线】(使用说明详解)

    二次 贝塞尔曲线 和三次 贝塞尔曲线 使用说明 1. 二次 贝塞尔曲线 和三次 贝塞尔曲线 1.1 贝塞尔曲线的 基本知识 1.2 贝塞尔曲线 生成动图 1.3 HTML 中 画贝塞尔曲线的 2 种方 ...

  5. 教你直白的理解贝塞尔曲线???

    序言 这是第一篇在掘金写的文章,写的不对的或者不好的地方希望友人能够指出便于修改与其他人分享. =.= 实在不善于表达啊 阿西吧... 一.什么是贝塞尔曲线? (百度百科你就知道) 贝塞尔曲线(Béz ...

  6. 贝塞尔曲线轨迹运动原理与实战

    大厂技术  坚持周更  精选好文 本次分享大概分为下面几个方面 背景 贝塞尔曲线讲解 实现和探索过程 背景 近期在 X 业务测评报告页有一个需求,用户可以左右拖动滑块来查看各个等级的信息. 在之前的野 ...

  7. 简单粗暴通俗易懂的理解贝塞尔曲线

    在Android开发和面试中(尤其是一些中高级岗位面试),面试官可能会问你自定义控件的详细内容,我们知道自定义控件这一块涉及到的内容很多,回答的越多越深入,那么面试的印象会更好.自定义控件涉及的内容比 ...

  8. 转载:贝塞尔曲线计算公式

    原文地址: https://zhuanlan.zhihu.com/p/33193050 用到贝塞尔曲线公式来计算出顶点,从而生成贝塞尔曲线. /*** 生成四阶贝塞尔曲线定点数据* @param p0 ...

  9. Android中贝塞尔曲线的绘制方法

    贝塞尔曲线,很多人可能不太了解,什么叫做贝塞尔曲线呢?这里先做一下简单介绍:贝塞尔曲线也可以叫做贝济埃曲线或者贝兹曲线,它由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋.一般的矢量图形软件常 ...

最新文章

  1. Ruby之Enumerator类
  2. python10-宝可梦数据分析-平民最强宝可梦系列(从0-1数据分析实战)
  3. Winform开发框架中工作流模块之审批会签操作
  4. 20150720 Two heads are better than one
  5. mysql blob key length_mysql提示used in key specification without a key length
  6. Docker和容器简介
  7. 全网最全 Java 日志框架适配方案!还有谁不会?
  8. mysql可视化_Mysql学习
  9. Atitit 面试技术点最小化问题法总结 目录 1. Web 前端 1 1.1. Jq 常用操作哪些?? 1 1.2. 查询后如何绑定后端数据到表格 2 1.3. 提交后怎么接受表单数据 2 2.
  10. arcmap新手教程_ArcGIS入门教程(1)——ArcMap应用基础
  11. 2.2中文分词和新词识别
  12. 计算机软件质测试标准,软件产品质量要求和测试细则 ——GB/T 25000.51—2016标准实施指南...
  13. UE4天气效果加白天黑夜的平滑过度切换
  14. (数据结构)图的邻接表(Adjacency List)表示方法
  15. 风格迁移应用_浅谈风格迁移(一)固定风格迁移
  16. iphone4s 关于大于400M的视频无法拷贝的问题
  17. ASBR上配置外部OSPF路由汇总
  18. Python小记~索引字典
  19. 【Qt网络编程】实现TCP协议通信
  20. windows开启休眠

热门文章

  1. 4GB大文件,如何实时远程传输和共享?
  2. mysql的系统特征方程_RS触发器的特征方程是(   )
  3. 高通骁龙888有哪些手机 高通骁龙888有什么手机
  4. 重装oracle 11g,完全卸载办法
  5. 怎样使用《Felomeng家庭理财》进行理财?
  6. 为什么微服务实施那么难?如何高效推进微服务架构演进
  7. 机器学习中关于偏差、方差和误差的理解
  8. linux 检测wan命令,Linux系统监控常用命令
  9. 怎么做好web服务器安全措施
  10. 农村大学生的逆袭009