背景
给定一些列有序的2D/3D数据点,我们想要用一条 3 3 3次B样条拟合它们。使用逼近技术而不是插值,因为数据点偏多,利用误差界,可以很好的控制样条曲线的控制点数量。
利用逼近,我们可以在容差0.01范围内,使用28个控制点拟合所有195个数据点,而插值需要196个控制点
同样,我们的算法也能处理闭合曲线的逼近,如下图所示:
开发
基于matlab平台,开发了三次B样条曲线的逼近算法。本算法基于误差/容差范围,适用于2D、3D有序数据点,并且适用于开曲线和闭曲线**。
功能演示+样例代码
%% 发动机叶片-截面
%% 下载 https://mbd.pub/o/bread/ZJqZmZlx
Q_blade = load('./data/blade.dat');
[~, dim_1] = size(Q_blade);
Q_3d = [Q_blade; ones(1, dim_1)];
% 0 -开曲线 1-闭合曲线
is_open = 0;
is_closed = 1;
% 误差设置 per * max(xMax - xMin, yMax - yMin)
TOL = 0.0005 * calc_bound_box(Q_3d);
%
figure(1)
plot3(Q_3d(1, :), Q_3d(2, :), Q_3d(3, :), 'r*')
title(strcat('数据点: ', num2str(dim_1)))
axis equal
figure(2)
[P_3d_open, U_3d_open] = cubic_spline_approximate(Q_3d, is_open, TOL);
plot_spline_curve(P_3d_open, U_3d_open, Q_3d)
title(strcat('开曲线-逼近, 容差: ', num2str(TOL)))
figure(3)
[P_3d_closed, U_3d_closed] = cubic_spline_approximate(Q_3d, is_closed, TOL);
plot_spline_curve(P_3d_closed, U_3d_closed, Q_3d)
title(strcat('闭合曲线-逼近, 容差: ', num2str(TOL)))
演示视频
基于matlab的B样条曲线逼近(误差界+开、闭曲线)
关键词
B样条曲线、逼近、插值算法、容差