在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里面就有贝塞尔曲线的身影。有兴趣的小伙伴也可以去了解一下。

未完待续。。。

如果这篇文章对您有开发or学习上的些许帮助,希望各位看官留下宝贵的star,谢谢。

Ps:著作权归作者所有,转载请注明作者, 商业转载请联系作者获得授权,非商业转载请注明出处(开头或结尾请添加转载出处,添加原文url地址),文章请勿滥用,也希望大家尊重笔者的劳动成果。

必须要理解掌握的贝塞尔曲线相关推荐

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

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

  2. 绘制二次贝塞尔曲线(二次贝兹曲线)等距线:让 IE 支持 canvas接口 isPointInPath

    一.背景: 在使用 canvas 做知识图谱的时,实体关系使用线宽为 1px 的线绘制, 用户必须点在线上, 才能正常拾取到点击的边. 边关系,有些是直线边,有些是二次贝塞尔曲线.产品提议,线不能加粗 ...

  3. 贝塞尔曲线动画C++简单实践

    目录 贝塞尔曲线简介 一阶贝塞尔 二阶贝塞尔 三阶贝塞尔 N阶贝塞尔曲线 贝塞尔曲线在动画中的应用 实践 求曲线散点坐标 将曲线应用到动画 动画框架 cmd动画 窗口动画 完整代码 示例代码 核心类代 ...

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

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

  5. 一张图看懂三次贝塞尔曲线(Cubic Bézier Curve)

    用权重的概念理解三次贝塞尔曲线,三次贝塞尔曲线综合了插值(Interpolation)和近似(Approximation),各点前面的多项式是点的权重(也可以把点看成权重,多项式看成是基,该被称为Be ...

  6. 计算机图形学-贝塞尔曲线

    必须要理解掌握的贝塞尔曲线 在Android开发和面试中(尤其是一些中高级岗位面试),面试官可能会问你自定义控件的详细内容,我们知道自定义控件这一块涉及到的内容很多,回答的越多越深入,那么面试的印象会 ...

  7. 贝塞尔曲线理解与应用

    贝塞尔曲线并非是由贝塞尔发明的,但是是因为他把这个东西应用到当时的汽车领域而闻名的,所以取名为贝塞尔曲线. 在我看来,用简单的话来理解一下贝塞尔曲线,他是通过少量几个点,使用一套公式,生成一条平滑曲线 ...

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

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

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

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

最新文章

  1. python常用的工具函数
  2. spring security:自定义认证成功处理器
  3. python模块下载过程_常用的python模块及安装方法
  4. php if多条件_PHP的数据类型
  5. AI 技术争鸣!2019 AI 开发者大会盛大开幕
  6. 蓝桥杯 ADV-201 算法提高 我们的征途是星辰大海
  7. 解决Caused by: java.io.IOException: java.io.IOException: error=12, Cannot allocate memory
  8. 【PAT】2020年秋季考试划水准备贴
  9. [JLOI2008] CODES
  10. Linux下udev详细介绍
  11. 怎么向前撤回_延迟复工,工资到底怎么算?
  12. 毕业设计之 --- 基于java web的旅游网站设计
  13. TheChroniclesOfNarnia写作年代
  14. 使用sort(function(a,b){return a-b})对数组进行排序的原理
  15. 无法识别 移动固态硬盘_安上硬盘后不显示 千万别慌可能不是SSD坏了
  16. Unity5 UI.Text 引发Canvas.SendWillRenderCanvases很卡的问题
  17. C++ 面向对象高级开发(侯捷)
  18. 数据库系统概论(第七章:数据库设计)
  19. utf8编码和utf8mb4编码(其它编码简介)
  20. 哈马德国际机场在全球最佳机场评选中排名第一;合肥君悦酒店浪漫呈现“悦-七夕”限定晚宴 | 全球旅报...

热门文章

  1. shardingsphere+dynamic+mybatisPlugs配置多数据源
  2. Firefox 浏览器
  3. python3在线运行-python在线运行
  4. java核心卷pdf及代码分享
  5. 转码机器人怎么制作?
  6. 地表最全企业级微信小程序开发流程(帮你尽可能减少开发周期)
  7. 简述计算机著作权的侵权行为,哪些是计算机软件著作权的侵权行为呢?
  8. linux mint 卸载compiz,Ubuntu12.04和linux mint 13的3D桌面效果的实现及compiz conf...
  9. compiz隐藏最大化窗口标题栏
  10. 北京邮电大学计算机导师与学生关系,【推荐给考北邮的同学】——选导师那些事儿...