背景
给定一系列矩阵格式排布的点(网格点 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