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]

在此处输入图像描述

如何在 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 这样的情节,尤其是平滑度、阴影?

在此处输入图像描述

4

2 回答 2

14

为了创建漂亮的照明和阴影,您需要在情节中添加灯光,并添加某种面部照明。如果分辨率太低,那么您最终会得到一个有些参差不齐的图,因为“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])

产生以下

在此处输入图像描述

请注意,表面看起来的平滑程度与 相关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])

产生以下图像

在此处输入图像描述

有关详细信息,请参阅以下帮助页面

于 2013-05-30T17:20:09.800 回答
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
于 2013-05-30T17:21:41.397 回答