基于matlab的B样条曲线逼近(误差界+开、闭曲线)

背景

给定一些列有序的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样条曲线、逼近、插值算法、容差

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值