【问题标题】:What's wrong with this 3D plot in MatlabMatlab中的这个3D图有什么问题
【发布时间】:2015-02-26 18:27:45
【问题描述】:

我正在尝试在 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

我得到以下信息:

怎么了?

【问题讨论】:

    标签: matlab plot 3d figure


    【解决方案1】:

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

    如果z 值太大,我的一个建议是剪裁它们。在z 值上设置某种阈值并裁剪它们。 100 表示高正值,-100 表示大负值。此外,调整视角以获得更好的视图,我还建议增加点数,以便更好地插入阴影......类似于 1000。要获得更光滑的效果,请尝试将 FaceColor 属性更改为 @ 987654331@ 而不是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
    

    我明白了:

    【讨论】:

    • @erkatya90 - 我做了更多的改变。我已经改进了一些数字。让我知道你的想法!
    • 我不知道你用了什么魔法,但我认为它真的有效!感谢完美的情节:)
    • @erkatya90 ahaha 没有魔法 :)... 只是经验,但你这样想很讨人喜欢。你很受欢迎。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    相关资源
    最近更新 更多