用3D绘制一系列圆圈

时间:2013-10-02 21:46:17

标签: matlab for-loop

我有以下代码用于在不同高度平面中绘制100个圆,其中半径从1增加到100.

for r=1:1:100
t=linspace(0,2*pi);
x=r*cos(t);
y=r*sin(t);
for h=100:100:10000   
    z = 100 * r * ones(1, length(t));
    plot3(x,y,z);
    if r == 1 && h == 100
        hold on;
        set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
    end
    drawnow;
end

像这样:enter image description here

问题

现在我想更改代码以使半径减小从100变为1,即将圆锥体颠倒。所以代码应该像这样阅读,但我不能让它工作:

for r=100:1:1
t=linspace(0,2*pi);
x=r*cos(t);
y=r*sin(t);
for h=100:100:10000   
    z = 100 * r * ones(1, length(t));
    plot3(x,y,z);
    if r == 100 && h == 100
        hold on;
        set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
    end
    drawnow;
end

1 个答案:

答案 0 :(得分:1)

你几乎做对了。试试这个:

for r=100:-1:1

语法如下:

for i=istart:istride:iend

对于优化尝试这个 - 我认为这是最快的(尝试使用octave和gnuplot)。我认为现在脚本可以正常工作; - ):

t=linspace(0,2*pi);             % the array t doesnt get changed during for r=...
z = ones(1, length(t));         % same here: one preallocation should do the job

for r=100:-1:1

x=r*cos(t);
y=r*sin(t);

    z(:) = 10000-r*100;
    plot3(x,y,z);
    if r == 100
        hold on;
    end
    drawnow;

end

set(gcf, 'units','normalized','outerposition',[0 0 1 1]); %I think this is the most expesive operation. 
hold off

问题是,你没有假设z和r之间存在线性关系。