声明:下面的内容是学习清华大学出版社的鸢尾花书时候看到的,后又根据b站up科研3D视界详细学习,最后使用Matlab脚本进行实现,可视化效果,方便大家有更加直观的理解(文中部分图片来自于上面提到的作者);
1.贝塞尔曲线可视化
下面的这个就是鸢尾花里面的二阶贝塞尔曲线,有三个控制点组成,以此类推,n阶的贝塞尔曲线有n+1个点组成的;
三阶的话就是4个点,以此类推,我们后面的研究是基于二阶进行说明的:下面的这个也是鸢尾花书里面的三阶的贝塞尔曲线,正方形的两个顶点代表两个控制点,剩下的两个点在我们的正方形里面,是使用叉号进行表示的,五颜六色的这个曲线就是插值之后的贝塞尔曲线;
2.什么是贝塞尔曲线
上面的可视化大家也看到了,贝塞尔曲线,贝塞尔曲线方程,其实并不难理解,类似于我们高中时期学习的圆锥曲线,和圆锥曲线方程之间的关系;
已知贝塞尔曲线的方程,我们就可以画出来贝塞尔曲线,已知椭圆方程,我们就可以画出来椭圆,只不过这个贝塞尔曲线我们人为难以精确画出来,这个时候就要借助计算机辅助完成这个过程;
但是,想要画出来这个贝塞尔曲线,首先我们要告诉计算机他的方程,就如同我们想要使用一些数学软件画出图形的时候,首先要告诉他这个方程的表达式,曲面的方程表达式,球体的表达式之类的,因此,这个贝塞尔曲线方程就是我们下一个话题重点研究的内容;
贝塞尔曲线实际上意义就是反应的不同控制点位置对于我们的插值点的影响程度,这个程度就是使用方程前面的系数进行表示的;
3.何为贝塞尔曲线方程
下面的这个就是我使用搜索引擎得到的结果,是为了让大家看到这个方程的表达形式,并试着观察一下,这个方程随着阶数的增加,有没有什么规律?
不管你有没有看出来,我都要告诉你正确答案,就是这个方程的系数是符合杨辉三角的,你不妨再回去观察一下;
下面我写出来杨辉三角的部分数据,你不妨对比一下,相信你一定可以验证我刚才说的这句话的正确性;杨辉三角里面的每一行的数据,我们就可以理解为一个控制点前面的系数,第一行相当于是一个控制点,对应的时0阶贝塞尔曲线方程;
第二行两个控制点,一阶贝塞尔曲线方程,第三行三个控制点,对应二阶的贝塞尔曲线方程,以此类推
4.Matlab实现任意阶数贝塞尔曲线方程
打开你的matlab,输入下面的脚本,感受一下贝塞尔曲线的冲击吧:
简单对于下面的程序进行解释:
-
阶数和分段数量可以改变,分段数量实际上就是插值点的数量,这个数越大,我们的这个曲线的效果就越好,因为基本上看不出来是孤立的点组成的了;
-
rand表示我们的控制点的坐标是随机生成的,三阶的时候,是4个控制点,因此这个rand函数里面的第一个参数是阶数+1,第二个参数是2,表示的是x,y坐标值的大小;
-
for循环生成杨辉三角数,接着套用公式(带入杨辉三角数字)写出来方程,使用matlab进行绘图,具体细节需要你对于matlab基本语法熟练掌握,了解相关运算含义,这里不再赘述;
clear;
clc;
bezier_order = 3; % 贝塞尔曲线的阶数
num = 1000; % 贝塞尔曲线分段数量
points_control = rand(bezier_order+1,2); % 随机生成贝塞尔控制点,点的数量为贝塞尔阶数+1,列数任意,为2是指代XY,为3时指代XYZ,以此类推
% 首先计算对应阶数的杨辉三角数
Yang_Hui = [1;zeros(bezier_order,1)]; % 初始化0阶贝塞尔系数对应的杨辉数
for i = 1:bezier_order
Yang_Hui(2:i+1,:) = Yang_Hui(1:i,:) + Yang_Hui(2:i+1,:);
end
% 计算贝塞尔曲线
t_0 = (0:1/num:1)'; % 点的分段比例
t_1 = 1 - t_0; % 点的反向分段比例
points_bezier = zeros(num+1,size(points_control,2));
for i = 1:bezier_order+1
points_bezier = points_bezier + Yang_Hui(i)*t_0.^(i-1).*t_1.^(bezier_order+1-i).*points_control(i,:);
end
% 绘图
figure(1); % 声明图像
clf(1); % 清除图像
hold on; % 保持绘图
plot(points_control(:,1),points_control(:,2),'b-o'),axis equal; % 绘制控制点曲线
plot(points_bezier(:,1),points_bezier(:,2),'r-o'),axis equal; % 绘制贝塞尔曲线
下面我调试一下这个杨辉三角数,展示下绘图效果,照顾下没有用过matlab的伙伴:
下面的这个就是打断点调试,在三阶的时候对应的杨辉三角数的生成结果,完全正确;
因为我们使用的rand随机生成控制点,因此每一次运行的结果都不一样:观察仔细的话,你是可以看到这个插值的痕迹的(右上角仔细看)
5.从贝塞尔曲线看插值思想
下面的这个同样是鸢尾花书截图,我觉得一图胜千言,这个图详细展示这个插值思想如何体现的,就是告诉我们这个曲线上面的点是如何来的,这个是三个控制点,二阶方程,以3/16为例的,黄色直线上面的点就是我们方程曲线的点,相信你会明白这个点是怎么来的;
就是在三个点连成的曲线上面找到3/16的位置,两个点连成曲线(即黄色直线),再取3/16比例,找到这个方程上面的点;当我们的这个比例变化的时候,就是插值形成了贝塞尔曲线;
6.贝塞尔曲线的历史和应用(番外篇)
历史的话,可以去b栈找科研3D视界up的视频,他的讲解很生动,我强烈推荐,实际上就是贝塞尔先生为解决问题的发现;
下面谈一谈这个贝塞尔曲线的应用:如果你对于ps等相关的矢量作图软件很熟悉,下面的这个图片你一定不会陌生,这个就是我们的ps软件里面使用钢笔时候的场景,实际上这个画图的原理就是我们的三阶贝塞尔曲线方程,我们使用钢笔进行修图,抠图之类的,有些同学经常使用,却殊不知这背后的原理就是大名鼎鼎的贝塞尔曲线方程;