参考文章:
【计算机图形学02】b-spline(b-样条曲线)_b样条-CSDN博客
n 阶贝塞尔曲线计算公式——Ts实现_n阶贝塞尔曲线-CSDN博客
原理,公式,代码示例:
https://zhuanlan.zhihu.com/p/344934774?utm_psn=1845881859646550017
3. 请给出四阶Bezier曲线的矩阵表示形式,并作图绘制出一段四阶Bezier 曲线,要求给出控制点的坐标。(共 20 分)
四阶Bezier曲线的矩阵表示形式为:
P(t)=P0P1P2P3P41-46-4104-1212-4006-1260004-4000011tt²t3t4
给出控制点为:
P0(578,389),P1(1018,175),P2(1442,373),P3(1504,653),P4(907,772),绘制出的一段四阶Bezier 曲线如下图:
4. 写出求解三阶 B 样条曲线的算法,并编写函数将曲线上的点保存到数组中。(共 40 分)
注意:这里认为三阶b样条是二次,即阶数=次数加1
算法:
(1) 输入控制点的 x 坐标数组 xcoordinate,y 坐标数组 ycoordinate,
控制点数 nPoints。输出为曲线的点数组splinepoints。
(2) 若 nPoints>=3,执行(3);否则算法结束。
(3) 初始化,令 n=50(为细分程度),dt=1.0/n,j=0。
(4) 若 j<(nPoints - 2),令 t=0。否则,算法结束。
(5) 若 t-1<=1e-6,令:f1 = (1.0 / 2) * (t - 1)* (t - 1);f2 = (1.0 / 2) * ( - 2 * t * t + 2*t+1);f3 = (1.0 / 2) * (t*t);否则,j++,转入步骤(4)。
(6) 令点 p.x= f1 * xcoordinate[j] + f2 * xcoordinate[j + 1] + f3 * xcoordinate[j + 2],p.y= f1 * ycoordinate[j] + f2 * ycoordinate[j + 1] + f3 * ycoordinate[j + 2],将点 p 保存进数组 splinepoints,
t=t+dt。转入步骤(5)
函数:
void BSpline(int xcoordinate[],int ycoordinate[],int nPoints)//三次b样条曲线
{
if (nPoints < 3) return;
int j, n = 50,num=0;//j表示已经绘制的曲线条数,n为曲线的细分程度
double t, dt, f1, f2, f3;
dt = 1.0 / n;//dt表示每次画点后坐标的增量
for (j = 0; j < (nPoints - 2); j++)//曲线条数为n-3条
{
for (t = 0; t - 1 <= 1e-6; t += dt)
{
calculate_base_func(f1, f2, f3, f4, t);
pre.x = f1 * xcoordinate[j] + f2 * xcoordinate[j + 1] + f3 * xcoordinate[j + 2],
pre.y = f1 * xcoordinate[j] + f2 * xcoordinate[j + 1] + f3 * xcoordinate[j + 2];
splinepoints[num++]=CPoint(pre.x, pre.y);
}
}
}
void calculate_base_func(double& f1, double& f2, double& f3,double t)
{
f1 = (1.0 / 2) * (t-1)* (t - 1);
f2 = (1.0 / 2) * ( - 2 * t * t + 2*t+1);
f3 = (1.0 / 2) * (t*t);
}