贝塞尔曲线(Bezier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,我们在绘图工具上看到的钢笔工具就是来做这种矢量曲线的。贝塞尔曲线是计算机图形学中相当重要的参数曲线,在一些比较成熟的位图软件中也有贝塞尔曲线工具,如PhotoShop等。
贝塞尔曲线的一些特性:
使用n个控制点来控制曲线的形状
曲线经过起点和终点,但不经过中间点~
代码实现
首先来看不同阶数的贝塞尔曲线公式,来找共同点
N = 3: P = (1-t)^2P0 + 2(1-t)tP1 + t^2*P2
N = 4: P = (1-t)^3P0 + 3(1-t)^2tP1 + 3(1-t)t^2P2 + t^3*P3
N = 5: P = (1-t)^4P0 + 4(1-t)^3tP1 + 6(1-t)2*t2P2 + 4(1-t)t^3P3 + t^4*P4
可将贝塞尔曲线一般参数公式中的表达式用如下方式表示:
设有常数 a,b 和 c,则该表达式可统一表示为如下形式:
a * (1 - t)^b * t^c * Pn;
根据上面的分析就可以总结出 a,b,c 对应的取值规则:
b: (N - 1) 递减到 0 (b 为 1-t 的幂)
c: 0 递增到 (N - 1) (c 为 t 的幂)
a: 在 N 分别为 1,2,3,4,5 时将其值用如下形式表示:
N=1:---------1
N=2:--------1 1
N=3:------1 2 1
N=4:-----1 3 3 1
N=5:---1 4 6 4 1
a 值的改变规则为: 杨辉三角
-------------------------------------------------------------------
理论基础有了,开始写代码
a 值用杨辉三角计算,b ,c 值在for 循环里计算,Pn从传入的点坐标读取。
step1:首先使用杨辉三角的方式生成a值
N=length(control_points);
ta=zeros(N,N);%%对数组进行初始化
%%杨辉三角左右两边的值赋1
% 杨辉三角的数的规律
% 1
% 1 1
% 1 2 1
% 1 3 3 1
% 1 4 6 4 1
for i=1:N
ta(i,1)=1;
ta(i,i)=1;
end
%%从第二个数开始,也就是从第三行开始,等于前列的左边加上正上方的一个
for row=2:N
for col=2:row
ta(row,col)=ta(row-1,col-1)+ta(row-1,col);
end
end
step2:生成贝塞尔曲线上的点
for i=1:M
t=i/M;%%确定每一个点的比例
for k=0:N-1
c=k;%分别确定a,b,c三个系数
b=N-c-1;%分别确定a,b,c三个系数
a=ta(N,k+1);%分别确定a,b,c三个系数
p(i,1)=p(i,1)+a*(1-t)^b*t^c*control_points(k+1,1);%确定点的x坐标
p(i,2)=p(i,2)+a*(1-t)^b*t^c*control_points(k+1,2);%确定点的y坐标
end
end