在MATLAB中从3个向量创建表面

时间:2016-04-23 12:08:32

标签: matlab matlab-figure surface

我有这个data.csv文件,其中包含3列。现在,我要做的是创建一个看起来像这样的3D模型。 enter image description here

我浏览了一些我在这里找到的帖子并试图在Matlab中创建这个模型,但它出错了。这就是我得到的。 enter image description here

以下是我用来创建这些模型的代码。

close all; clear all;

X=xlsread('data.csv', '', 'A:A');
Y=xlsread('data.csv', '', 'B:B');
Z=xlsread('data.csv', '', 'C:C');

[XI YI ZI] = griddata(X,Y,Z,linspace(0,1),linspace(0,1)');

figure
subplot(1,2,1)
trisurf(delaunay(X,Y),X,Y,Z)
subplot(1,2,2);
surf(XI,YI,ZI)

我做错了什么,如何修复它以获得与上面相似的模型?

修改

我试过切割z平面,这就是我得到的。我需要连接飞机。此外,我有更多的数据产生不同的模型,所以我需要一个解决方案,涵盖其他模型。 enter image description here

1 个答案:

答案 0 :(得分:1)

问题来自您的数据:您想要的表面对于某个x-y对有2个z值!

我无法想出一个完美的解决方案,但你可以尝试将表面切割成两部分,这样每个部分都是单值2D函数z = f(x,y)

% for the upper part, let's cut it by the plane z==0
X=X(Z>0);
Y=Y(Z>0);
Z=Z(Z>0); 

然后运行您的代码:

[XI YI ZI] = griddata(X,Y,Z,linspace(0,1),linspace(0,1)');
surf(XI,YI,ZI)

绘制下半部分是类似的。您可以使用hold on将它们组合在一个图中。

Matlab论坛"creating-3d-mesh-for-some-points-in-space"

中有一个更一般的讨论

跳跃有帮助。

编辑:

这是完整的代码,假设你的表面可以被平面切割(z = 0):

close all; clear all;
X=xlsread('data.csv', '', 'A:A');
Y=xlsread('data.csv', '', 'B:B');
Z=xlsread('data.csv', '', 'C:C');
[XI YI ZI] = griddata(X(Z>0),Y(Z>0),Z(Z>0),linspace(0,1),linspace(0,1)');
surf(XI,YI,ZI);
hold on;
[XI YI ZI] = griddata(X(Z<0),Y(Z<0),Z(Z<0),linspace(0,1),linspace(0,1)');
surf(XI,YI,ZI);
hold off;