![1d428ecddc88fb261aace16733042622.png](https://i-blog.csdnimg.cn/blog_migrate/0f809cd3f342d592dd47e175dac3ce88.jpeg)
问题:已知一系列三维散点坐标,如何插值成一个曲面,如下图所示。
![68e72abe34bf2acbfe4b60143c5289f3.png](https://i-blog.csdnimg.cn/blog_migrate/140218ba367282c4f3c8c5b6d1735677.png)
![b82dc75ce272b5fa163eeb8b4ec1564b.png](https://i-blog.csdnimg.cn/blog_migrate/f9601426af2e97ac0bf122ddac4bd655.jpeg)
解决方案:调用 Matlab 函数 griddata。
参考代码如下:
clear; clc;
% 生成一个多峰曲面
M = 30;
[X, Y, Z] = peaks(M);
% 从曲面图中选择部分点来做插值,数据越多插值效果越好
steps = [5, 3];
for ind = 1 : 2
step = steps(ind);
pos = 1:step:M;
posX = X(pos, pos);
posY = Y(pos, pos);
posZ = Z(pos, pos);
len = length(pos)*length(pos);
x = reshape(posX, len, 1);
y = reshape(posY, len, 1);
z = reshape(posZ, len, 1);
subplot(2,2,2*ind-1)
surf(X, Y, Z)
hold on
plot3(x, y, z, 'or', 'MarkerFaceColor', 'r');
hold off
ylim([-2, 2]);
% 调用 griddata 函数做插值,看看用我们选择的点来做插值是什么效果
[Xi,Yi,Zi] = griddata(x,y,z,linspace(min(x),max(x), 30)',linspace(min(y),max(y), 30),'v4');
subplot(2,2,2*ind)
surf(Xi,Yi,Zi)
hold on
plot3(x, y, z, 'or', 'MarkerFaceColor', 'r');
hold off
end
对比结果如下,可见选择的插值点数越多,插值效果越好。
![01f7e594706097e620c9e1530925327a.png](https://i-blog.csdnimg.cn/blog_migrate/1bb33ccc61496cf6c59717576dbdb36e.jpeg)
【秘籍】
- 三维散点插值成曲面,调用 griddata 函数即可;
- 点数越多,更容易将真实曲面的细节表现出来,因而插值效果越好。