我编写了这个代码,它制作了2个椭圆体的动画。
这些椭圆体的参数k1必须依赖于时间(因此它们会异步移动),但我需要在它们中设置动画。一个数字。我可以使用循环,还是使用定时器和放大器更好?某种回调函数?
第二个问题 - 我需要移动内椭圆体,以便它们有一个共同的边。我怎么能这样做?
答案 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)
这里不一定非常需要drawow,因为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个表面副本。这导致了透明度如何呈现的一些问题。