Matlab 中的这个 3D 图有什么问题

What's wrong with this 3D plot in Matlab

我正在尝试在 Matlab 中创建 3D 绘图,但我几乎没有任何经验。我真的很想绘制这些方程描述的图形:

x = cos(u)*(2 + cos(v))
y = sin(u)*(2 + cos(v))
z = x^2 - y^2 + 2*x*y*tan^2(v)
-pi <= u <= pi, -pi <= v <= pi

哪个剧情本来应该是这样的


(来源:paulbourke.net

我尽了最大的努力,得出了:

% volume data
u = linspace(-pi,pi,40);
v = linspace(-pi,pi,40);
[u, v] = meshgrid(u, v); 
X =cos(u).*(2 + cos(v));
Y =sin(u).*(2 + cos(v));
Z =(X.^2)-(Y.^2)+(X.*Y.*2.*((tan(v)).^2));
surf(X,Y,Z,'FaceColor','none','EdgeColor','interp')
 
%shaded surface
colormap(jet)
camlight right

我得到以下信息:

怎么了?

你的图表实际上没有任何问题。您之所以看到这样的图表,是因为 z 轴太大了。实际定义其大部分形状的 z 值比该图中看到的最高值小几个数量级……大约几千。原因是因为当 uv 的值为 +/- pi/2 时, tan 未定义,这就是为什么高度如此之高,因为你倾向于这些角度。

我的一个建议是,如果 z 值太大,则将其剪掉。在 z 值上设置某种阈值并裁剪它们。像 100 表示高正值,-100 表示大负值。另外,调整视角以获得更好的视图,我还建议增加点数,以便更好地插值阴影......大约 1000。为了获得更光滑的效果,请尝试更改 FaceColor 属性interp 而不是 none.

因此:

u = linspace(-pi,pi,1000); %// Define 1000 points per dimension
v = linspace(-pi,pi,1000);
[u, v] = meshgrid(u, v); 
X =cos(u).*(2 + cos(v));
Y =sin(u).*(2 + cos(v));
Z =(X.^2)-(Y.^2)+(2*X.*Y.*(tan(v).^2));
Z(Z <= -100) = -100; %// Enforce threshold
Z(Z >= 100) = 100;
surf(X,Y,Z,'FaceColor','interp','EdgeColor','interp')

%shaded surface
colormap(jet)
view(30,50); %// Change viewing angle
camlight right

我明白了: