这个3D图在Matlab中出了什么问题

时间:2015-02-26 18:27:45

标签: matlab plot 3d figure

我试图在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

最初的情节应该是这样的

http://paulbourke.net/geometry/pseudocatenoid/1.jpg

我已尽力而为:

% 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

我得到以下内容:

出了什么问题?

1 个答案:

答案 0 :(得分:4)

你的图表实际上没有任何问题。你之所以看到这样的图是因为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

我明白了:

enter image description here