如何在Matlab中为2个曲面设置动画?

时间:2010-05-03 21:23:41

标签: matlab animation geometry-surface

我编写了这个代码,它制作了2个椭圆体的动画。

这些椭圆体的参数k1必须依赖于时间(因此它们会异步移动),但我需要在它们中设置动画。一个数字。我可以使用循环,还是使用定时器和放大器更好?某种回调函数?

第二个问题 - 我需要移动内椭圆体,以便它们有一个共同的边。我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

你应该使用一个循环。您的大部分时间将用于绘图并使用“getFrame”命令。您可以使用

 profile 
来验证这一点。 for循环不会增加显着的开销,并且最容易编码和理解


关于你的第二个问题,我不确定你要问的是什么,但是如果你想保持一个共同点,你应该根据半径,倾斜角等来对你的表面进行参数化。共同点,然后只是移动点。您可能需要考虑编写一个“drawEllipsoid”函数,这将简化和澄清您的代码。

答案 1 :(得分:0)

循环似乎很适合这份工作。计时器也可以。

当你说“有一个共同的一面”时,我不太清楚你的意思。看起来你接近于向X2添加5,但你需要一个缩放术语,因为它们的形状不同。你能详细说明一下吗?

但有一个建议。如果你将对象创建移出循环,我认为你会更开心:

a=5;
b=a;
c=10;
u = (0:0.05*pi:2*pi)'; %'
v = [0:0.05*pi:2*pi];
X = a*sin(u)*cos(v);
Y = a*sin(u)*sin(v);
Z = c*cos(u)*ones(size(v));
Z(Z>0)=0; % cut upper
V1=4/3*pi*a*b*c;
d=1/2;
e=2^d;
a2=a/e;
b2=a/e;
c2=c;
V2=4/3*pi*a2*b2*c2;
X2 = a2*sin(u)*cos(v);%-2.5;
Y2 = b2*sin(u)*sin(v);
Z2 = c2*cos(u)*ones(size(v));%+0.25;
Z2(Z2>0)=0; % cut
h=1/3;

hS1=surf(X,Y,Z);
alpha(.11)
hold on
hS2=surf(X2,Y2,Z2);
hold off
axis([-20 20 -20 20 -20 20]);

for j = 1:20
    k1=(sin(pi*j/20)+0.5)^h;
    a=a*k1;
    c=c*k1;
    X = a*sin(u)*cos(v);
    Y = a*sin(u)*sin(v);
    Z = c*cos(u)*ones(size(v));
    Z(Z>0)=0;
    a2=a2*k1;
    b2=a2*k1;
    c2=c2*k1;
    X2 = a2*sin(u)*cos(v)+5;%-2.5;
    Y2 = b2*sin(u)*sin(v);
    Z2 = c2*cos(u)*ones(size(v));%+0.25;
    Z2(Z2>0)=0;

    set(hS1,'XData',X,'YData',Y,'ZData',Z);
    set(hS2,'XData',X2,'YData',Y2,'ZData',Z2);
    drawnow;
    F(j) = getframe;
end
movie(F,4)

这里不一定非常需要dr​​awow,因为getframe包含一个,但最好插入一个,这样你可以看到删除getframe时会发生什么。

答案 2 :(得分:0)

好的,这是我在之前评论中提到的修剪曲面的快捷方式。你将要做的是将NaNs放入表面位于域外的任何地方的坐标中。然后表面物体将掉落任何触摸那些坐标的四边形。这并没有给你一个很好的清洁优势,但它真的很容易。

a=5;
b=a;
c=10;
u = (0:0.05*pi:pi)'; %'
v = [0:0.05*pi:2*pi];
X = a*sin(u)*cos(v);
Y = a*sin(u)*sin(v);
Z = c*cos(u)*ones(size(v));
Z(Z>0)=0; % cut upper
V1=4/3*pi*a*b*c;
d=1/2;
e=2^d;
a2=a/e;
b2=a/e;
c2=c;
V2=4/3*pi*a2*b2*c2;
X2 = a2*sin(u)*cos(v);%-2.5;
Y2 = b2*sin(u)*sin(v);
Z2 = c2*cos(u)*ones(size(v));%+0.25;
Z2(Z2>0)=0; % cut
h=1/3;

hS1=surf(X,Y,Z);
alpha(.11)
hold on
hS2=surf(X2,Y2,Z2);
hold off
axis([-20 20 -20 20 -20 20]);

for j = 1:20
  k1=(sin(pi*j/20)+0.5)^h;
  a=a*k1;
  c=c*k1;
  X = a*sin(u)*cos(v);
  Y = a*sin(u)*sin(v);
  Z = c*cos(u)*ones(size(v));
  Z(Z>0)=0;
  a2=a2*k1;
  b2=a2*k1;
  c2=c2*k1;
  X2 = a2*sin(u)*cos(v)+5;%-2.5;
  Y2 = b2*sin(u)*sin(v);
  Z2 = c2*cos(u)*ones(size(v));%+0.25;
  Z2(Z2>0)=0;

  set(hS1,'XData',X,'YData',Y,'ZData',Z);

  % substitute into implicit form of 1st ellipsoid
  d = (X2.^2) / a^2 + (Y2.^2) / a^2 + (Z2.^2) / c^2;
  % and zap any that are outside [0 1]
  X2(d>1) = nan;
  Y2(d>1) = nan;
  Z2(d>1) = nan;
  set(hS2,'XData',X2,'YData',Y2,'ZData',Z2);
  drawnow;
  F(j) = getframe;
end
movie(F,4)

请注意,我也改变了你的范围。那是因为你实际上是在绘制2个表面副本。这导致了透明度如何呈现的一些问题。