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
值比该图中看到的最高值小几个数量级……大约几千。原因是因为当 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
我明白了:
我正在尝试在 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
值比该图中看到的最高值小几个数量级……大约几千。原因是因为当 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
我明白了: