如何在Matlab中生成一个插值平滑的3D图形

9
这个图表是由 Mathematica 创建的:
ls = Table[Sinc[x*y], {x, -5, 5, 0.2}, {y, -5, 5, 0.2}];
ListPlot3D[ls, InterpolationOrder -> 2, PlotRange -> All, 
 Mesh -> None]

enter image description here

如何在MatLab中创建这样的图形?

以下是我的尝试:

>> x=linspace(-5.,5.,51);
>> y=linspace(-5.,5.,51);
>> [x,y]=meshgrid(x,y);
>> z=sinc(x.*y);
>> surf(x,y,z)
>> shading interp

看起来非常不同,特别是涟漪细节。是否可能制作像Mathematica一样的图形,特别是平滑度和阴影效果?

enter image description here


好问题。让我提一下这两个专有软件的自由软件、开源替代品:GNU Octave。至于“Mathematica”和“MATLAB”,我不知道。 - cfa45ca55111016ee9269f0a52e771
1
你正在使用哪个版本的MATLAB?我得到了一个漂亮的图表。 - Eitan T
@EitanT 我在Mac上使用2012a。但是在你的图中,墙上仍然有一些皱纹和线条。 - xslittlegrass
墙上的线条是可移动的网格线。关于皱纹,这确实是更好插值的问题,而你的代码并没有指定。 - Eitan T
@EitanT 对于混淆我感到抱歉,我只是指皱纹和排水沟,而不是网格线。 - xslittlegrass
2个回答

15

为了创建漂亮的光影效果,您需要向绘图中添加一个灯光,并添加某种面部照明。如果分辨率太低,则会出现相当粗糙的绘图,因为“interp”样式的阴影使用线性插值。例如

n = 51;
x=linspace(-5., 5., n);
y=linspace(-5., 5., n);
[x, y]=meshgrid(x, y);
sinc = @(x) sin(x)./x;
z=sinc(x.*y);
z(isnan(z)) = 1;
surf(x, y, z, 'LineStyle', 'none', 'FaceColor', 'interp')
colormap(cool)
camlight right
set(gca, 'CameraPosition', [45 35 9.8])

这将产生以下结果:

enter image description here

请注意,表面的平滑程度与n有关。较大的n值将增加表面的平滑度。

如果您生成的数据成本很高,则可以通过使用比线性插值更高级的插值形式来增加分辨率,具体如下:

n = 51;
x=linspace(-5., 5., n);
y=linspace(-5., 5., n);
[x, y]=meshgrid(x, y);
sinc = @(x) sin(x)./x;
z=sinc(x.*y);
z(isnan(z)) = 1;

nn = 401;
xi = linspace(-5.0, 5.0, nn);
yi = xi;
[xi, yi] = meshgrid(xi, yi);
zi = interp2(x, y, z, xi, yi, 'spline');
surf(xi, yi, zi, 'LineStyle', 'none', 'FaceColor', 'interp')
colormap(cool)
camlight right
set(gca, 'CameraPosition', [45 35 9.8])

生成以下图像:

在此输入图像描述

有关更多详细信息,请参见以下帮助页面:


谢谢。但是你能否试一下我的函数呢?你的函数看起来已经很顺畅了。 - xslittlegrass
我改变了我的答案,使用了你的函数。 - hoogamaphone
谢谢,但我认为我的问题是如何绘制现有矩阵,而不是增加矩阵中的点数,因为在我的研究中,该矩阵是使用其他非常昂贵的程序生成的。 - xslittlegrass
2
你可以通过插值数据来解决这个问题。我在我的答案中已经包含了一个例子。 - hoogamaphone

3
我建议尝试使用surf/surfl并尝试打开/关闭照明。初始相机位置也很重要,因为我使用“头灯”相机。
x=linspace(-5.,5.,51);
y=linspace(-5.,5.,51);
[x,y]=meshgrid(x,y);
z=sinc(x.*y);
surfl(x,y,z) %surf(x, y, z)
shading interp
colormap cool
%camlight headlight
%lighting gouraud

谢谢,是的,我已经检查了你的答案,但在我的电脑上它没有像问题中那样产生平滑的插值图(我不确定是否是版本问题)。 - xslittlegrass
我喜欢“surf”和“lighting on”的输出。另一个需要重新解释的问题,我没有猜到。 - Dmitry Galchinsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接