我试图在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
我得到以下内容:
出了什么问题?
答案 0 :(得分:4)
你的图表实际上没有任何问题。你之所以看到这样的图是因为z
轴太大了。实际定义其大部分形状的z
值比该图中看到的最高值小几个数量级......大约为数千。原因是因为当u
和v
的值为+/- 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
我明白了: