基于MATLAB的B样条网格点-曲面插值

背景

给定一系列矩阵格式排布的点(网格点 m × n m \times n m×n),现在我们使用一个 ( p , q ) − (p, q)- (p,q)次B样条曲面插值于该网格点。

本算法可以转化为一系列曲线插值算法,

  • 行方向进行插值,然后获得一系列控制点。
  • 列方向,对第一步求解的控制点进行曲线插值,获得最终的曲面控制点

基于MATLAB语言的实现

在这里插入图片描述

鞋子曲面重构
在这里插入图片描述
面具曲面重构
在这里插入图片描述
在这里插入图片描述

演示视频

基于matlab的B样条网格点(矩阵格式排布)曲面插值

代码

%% matlab 图标, 网格点插值
% 代码地址 https://mbd.pub/o/bread/mbd-ZJqZm5xq
% 读取网格点 (excel文件)
xls_filename = './data/matlab_grid.xlsx';
mat_x = readmatrix(xls_filename, 'Sheet', 'sheet-x');
mat_y = readmatrix(xls_filename, 'Sheet', 'sheet-y');
mat_z = readmatrix(xls_filename, 'Sheet', 'sheet-z');

% grid points
% [dim, m, n]
[m, n] = size(mat_x);
Q_grid = zeros(3, m, n);

Q_grid(1, :, :) = mat_x;
Q_grid(2, :, :) = mat_y;
Q_grid(3, :, :) = mat_z;

% 网格插值
alpha = 1.0; % 弦长参数化
p = 3;
q = 3;
[P, U, V] = grid_interpolate(Q_grid, p, q, alpha);

% 可视化插值结果
fig1 = figure(1);
set(fig1, 'Position', [100, 100, 1400, 650], 'Color', 'white')
subplot(1, 2, 1)
plot_grid(Q_grid)
title('网格点')

subplot(1, 2, 2)
show_mesh = true;
plot_spline_surface(P, U, V, show_mesh)
title('插值于网格点的-样条曲面')


辅助函数

function plot_grid(Q_grid)
    [~, m, ~] = size(Q_grid);
    mat_x = squeeze(Q_grid(1, :, :));
    mat_y = squeeze(Q_grid(2, :, :));
    mat_z = squeeze(Q_grid(3, :, :));

    for i = 1:m
        plot3(mat_x(i, :), mat_y(i, :), mat_z(i, :), '.b');
        hold on
    end

    hold off
    axis equal
end
  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值