第05章主题动画的设计技术.docx
- 文档编号:9215681
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:37
- 大小:505.54KB
第05章主题动画的设计技术.docx
《第05章主题动画的设计技术.docx》由会员分享,可在线阅读,更多相关《第05章主题动画的设计技术.docx(37页珍藏版)》请在冰豆网上搜索。
第05章主题动画的设计技术
第五章主题动画的设计技术
图5-1孤点过程动画(“代用品”)
with(plots):
animate([cos(t*x),sin(t*x),t=0..1],x=0..2*Pi,numpoints=2,frames=72,style=POINT,symbol=circle,color=blue,symbolsize=18,scaling=constrained);
animatecurve([cos(t),sin(t),t=0..2*Pi],numpoints=2,frames=72,style=POINT,symbol=circle,color=blue,symbolsize=18,scaling=constrained);
图5-1孤点过程动画(“代用品”)
图5-2用animate函数做出“真正”孤点的过程动画
with(plots):
animate([3*u,3*cos(3*u)],u=0..Pi,scaling=constrained,style=POINT,symbol=diamond,color=blue,symbolsize=28,view=[-1..12,-5..5]);
图5-2用animate函数做出“真正”孤点的过程动画
请读者仔细观察的两个语句
A:
=animate([3*u,3*cos(3*u)],u=0..Pi,scaling=constrained,style=POINT,symbol=diamond,color=blue,symbolsize=28,view=[-1..12,-5..5],frames=4);
B:
=animate([3*u,3*cos(3*u),t=0..0.001],u=0..Pi,scaling=constrained,style=POINT,symbol=diamond,color=blue,symbolsize=28,view=[-1..12,-5..5],frames=2);
使用命题2这种方法,还可以同时表现不同轨道上多个孤点的过程动画,例如:
animate({[3*u,1],[u,u^2,t=0..3]},u=1..4,symbol=diamond,symbolsize=38,style=POINT,view=[-1..16,-1..23])
图5-3用rotate变换法做成的孤点过程动画
with(plots):
with(plottools):
Q:
=point([1,0],symbol=BOX,color=blue):
F:
=i->[rotate(Q,Pi*i/18)]:
display(seq(F(i),i=0..36),insequence=true,view=[-1.2..1.2,-1.2..1.2],scaling=constrained);
PLOT(ANIMATE(seq(F(i),i=0..36)),SYMBOL(BOX),VIEW(-1.2..1.2,-1.2..1.2),SCALING(CONSTRAINED));
图5-3用rotate变换法做成的孤点过程动画
图5-4用translate变换法做成的孤点过程动画
PA:
=point([0,0],symbol=BOX,color=blue):
F:
=i->[translate(PA,Pi*i/18,sin(Pi*i/18))]:
display(seq(F(i),i=0..36),insequence=true,view=[-.2..7,-1.2..1.2],scaling=constrained);
PLOT(ANIMATE(seq(F(i),i=0..36)),SYMBOL(BOX),VIEW(-.2..7,-1.2..1.2),SCALING(CONSTRAINED));
图中,为便于观察孤点的移动轨道,额外加入了正弦曲线做衬景。
图5-4用translate变换法做成的孤点过程动画
图5-5用数据O/S法生成的孤点过程动画
语句编写稍许繁杂一点。
这里把程序语句分为三段来说明。
R:
=72:
a:
=0:
b:
=2*Pi:
f(t):
=t:
g(t):
=3*sin(t):
以上5行语句中,包含有孤点移动轨道的方程f(t)和g(t)、参数变化范围a,b、离散化处理的样点数目或动画帧数R。
它们在具体问题中,可以改换。
s:
=i->a+(b-a)*i/R:
f1:
=subs(t=s(i),f(t)):
g1:
=subs(t=s(i),g(t)):
F:
=i->[POINTS(evalf([f1,g1]))]:
;
ANIMATE(seq(F(i),i=0..R)):
以上5行语句,具有通用性。
下面的显示语句也有相当的通用性,但是在使用中有的设置数值需要调整。
PLOT(ANIMATE(seq(F(i),i=0..R)),VIEW(-1.2..7.2,-4.2..4.2),SCALING(CONSTRAINED));
plots[display](seq(F(i),i=0..R),view=[-1.2..7.2,-4.2..4.2],scaling=constrained,insequence=true):
;
图5-5用数据O/S法生成的孤点过程动画
图5-6~7由新版animate做成的孤点过程动画
restart:
with(plottools):
with(plots):
B:
=plot([t^2,t^3,t=-2..2]):
animate(display,[POINTS([t^2,t^3],SYMBOL(CIRCLE,22))],t=-2..2,background=B,frames=6);
图5-6由新版animate做成的孤点过程动画(有背景曲线B,首帧)
图5-7由新版animate做成的孤点过程动画(带有背景曲线B,连环画)
图5-8~9由新版animate做成的孤点过程动画
restart:
with(plottools):
with(plots):
P:
=plot([(2*t)^2,(3*t),t=-2..2],symbolsize=24,color=red):
animate(display,[PLOT(point([(2*t)^2,(3*t)],symbolsize=22,color=blue))],t=-2..2,symbol=circle,frames=6,background=P);
图5-8由新版animate做成的孤点过程动画(有背景曲线P,首帧)
图5-9由新版animate做成的孤点过程动画(带有背景曲线P,连环画)
图5-10~11由新版animate做成的孤点过程动画
B1:
=plot([(2*t)^2,3^t,t=-2..2],color=green,thickness=2):
animate(display,[point([(2*t)^2,3^t],symbolsize=34,color=black)],t=-2..2,symbol=circle,background=B1,frames=6);
图5-10由新版animate做成的孤点过程动画(有背景曲线B,首帧)
图5-11由新版animate做成的孤点过程动画(带有背景曲线B1,连环画)
图5-12用animate法生成的图元过程动画
with(plots):
animate([2+3*cos(t)+4*sin(3*u),0+3*sin(t)+4*u,t=0..2*Pi],u=0..Pi,numpoints=7,scaling=constrained,frames=6,thickness=5);
图5-12用animate法生成的图元过程动画
图5-13用rotate变换法生成的图元过程动画
with(plottools):
with(plots):
Q:
=curve([[3,0],[5,0],[5,1],[3,0]],color=blue,thickness=3):
R:
=18:
a:
=2*Pi/M:
F:
=i->[rotate(Q,a*i)]:
display(seq(F(i),i=0..R),insequence=true,scaling=constrained);
PLOT(ANIMATE(seq(F(i),i=0..R)));
图5-13用rotate变换法生成的图元过程动画
图5-14用translate变换法生成的图元过程动画
with(plottools):
with(plots):
R:
=6:
p:
=plot([t,t^2,t=-2..2]):
p1:
=op(1,p):
f:
=i->[translate(p1,2*i*Pi/R,2*i*Pi/R)]:
display(evalf(seq(f(i),i=0..R)),insequence=true);
PLOT(ANIMATE(seq(f(i),i=0..R)));
图5-14用translate变换法生成的图元过程动画
注:
因为这里的translate函数在f(i)中,只能接受图形数据对象,所以在本例中多了一行语句:
“p1:
=op(1,p):
”。
图5-15用transform函数法生成的双图元过程动画
with(plottools):
with(plots):
plot([t,t^2,t=-2..2]):
;
pa:
=plot([t,t^2,t=-2..2]):
;
pa1:
=op(1,pa):
arc([0,2],1,0..Pi):
Qa1:
=arc([0,2],1,0..Pi):
f:
=transform((t,u)->[t+2*i*Pi/36,u+cos(2*i*Pi/36)]):
;
PLOT(ANIMATE(seq([f(pa1)],i=0..36))):
Q1:
=%:
PLOT(ANIMATE(seq([f(Qa1)],i=0..36))):
Q2:
=%:
display(Q1,Q2,thickness=3);
或者,也可使用如下的语句。
Q11:
=display(evalf([seq(f(pa1),i=0..36)]),insequence=true,thickness=3):
;
Q12:
=display(evalf([seq(f(Qa1),i=0..36)]),insequence=true,thickness=3):
;
display(Q11,Q12,thickness=3);
图5-15用transform函数法生成的双图元过程动画
图5-16用含有rotate变换的循环语句生成的plot图元过程动画
p:
=plot([sin(x),x,x=0..2*Pi],thickness=3):
r[0]:
=p:
a:
=Pi/4:
c:
=1:
whileevalf(a-2*Pi)<0do
r[c]:
=rotate(r[0],a);
a:
=a+Pi/4;
c:
=c+1;
enddo:
display([seq(r[i],i=0..c-1)],insequence=true,scaling=constrained):
;
图5-16用含有rotate变换的循环语句生成的plot图元过程动画
图5-17用含有rotate变换的循环语句生成的数据对象图元过程动画
q[0]:
=circle([3,0],1.):
a:
=Pi/3:
c:
=1:
whileevalf(a-2*Pi)<0do
q[c]:
=rotate(q[0],a);
a:
=a+Pi/3;
c:
=c+1;
enddo:
QQ:
=display([seq(q[i],i=0..c-1)],insequence=true,scaling=constrained):
;
图5-17用含有rotate变换的循环语句生成的数据对象图元过程动画
图5-18用O/S法生成的图元过程动画(正多边形)
f:
=(x,t)->t+cos(x):
g:
=(x,t)->sin(x)+sin(t):
a:
=0:
b:
=2*Pi:
M:
=6:
c:
=0:
d:
=2*Pi:
R:
=18:
a+(b-a)*i/M:
c+(d-c)*n/R:
f1:
=(i,n)->subs(t=c+(d-c)*n/R,x=a+(b-a)*i/M,f(x,t)):
g1:
=(i,n)->subs(t=c+(d-c)*n/R,x=a+(b-a)*i/M,g(x,t)):
seq([f1(i,n),g1(i,n)],i=0..M):
evalf(seq([f1(i,n),g1(i,n)],i=0..M)):
CURVES(evalf(seq([f1(i,n),g1(i,n)],i=0..M))):
F:
=n->[CURVES(evalf([seq([f1(i,n),g1(i,n)],i=0..M)]))]:
ANIMATE(seq(F(n),n=0..R)):
PLOT(ANIMATE(seq(F(n),n=0..R))):
plots[display](ANIMATE(seq(F(n),n=0..R)),insequence=true,scaling=constrained,tickmarks=[0,0]);
图5-18用O/S法生成的图元过程动画(正多边形)
图5-19用O/S法生成的折线图元过程动画
with(plots):
R:
=6:
F1:
=t->[CURVES(evalf([[0,0],[2*cos(t*2*Pi/R),2*sin(t*2*Pi/R)],[5+2*cos(t*2*Pi/R),0]]),THICKNESS(4))]:
Q1:
=PLOT(ANIMATE(seq(F1(n),n=0..R)),SCALING(CONSTRAINED)):
F2:
=t->[CURVES(evalf([[4.5+2*cos(t*2*Pi/R),1.5],[6+2*cos(t*2*Pi/R),1.5],[6+2*cos(t*2*Pi/R),-1.5],[4.5+2*cos(t*2*Pi/R),-1.5],[4.5+2*cos(t*2*Pi/R),1.5]]),THICKNESS(4))]:
Q2:
=PLOT(ANIMATE(seq(F2(n),n=0..R)),SCALING(CONSTRAINED)):
display(Q1,Q2,color=blue);
图5-19用O/S法生成的折线图元过程动画
图5-20用O/S生成的孤点步进踪迹动画
N:
=24:
R:
=6:
p:
=t->cos((t*2*Pi/N)):
q:
=t->sin((t*2*Pi/N)):
F:
=n->[POINTS(seq(evalf([p(t),q(t)]),t=0..N/R*n),SYMBOL(CIRCLE,24))]:
;
PLOT(ANIMATE(seq(F(n),n=0..R)),SCALING(CONSTRAINED),VIEW(-1.2..1.2,-1.2..1.2));:
display(ANIMATE(seq(F(n),n=0..R)),insequence=true,view=[-1.2..1.2,-1.2..1.2],scaling=constrained);
图5-20用O/S生成的孤点步进踪迹动画
图5-21用trans变换方法生成的孤点步进踪迹动画
with(plots):
with(plottools):
N:
=24:
R:
=6:
Q:
=point([1,0],symbol=diamond,color=blue):
a:
=2*Pi*i/N:
F:
=(i,n)->rotate(Q,a):
FF:
=n->display(seq(F(i,n),i=0..N/R*n)):
display(seq(FF(n),n=0..R),insequence=true,view=[-1.2..1.2,-1.2..1.2],scaling=constrained);
PLOT(ANIMATE(seq([op(FF(n))],n=0..R)),VIEW(-1.2..1.2,-1.2..1.2),SCALING(CONSTRAINED));
图5-21用trans变换方法生成的孤点步进踪迹动画
图5-22~23新版animate实现的孤点步进踪迹动画
restart:
with(plottools):
with(plots):
R:
=5:
t:
=k->1*Pi*k/R:
F:
=proc(M)
display(seq(point([t(k),sin(t(k))]),k=0..M),symbol=circle,symbolsize=22,color=black);
end:
animate(F,[M],M=0..R,frames=R+1,axes=normal,scaling=unconstrained);
图5-22新版animate实现的孤点步进踪迹动画(首帧)
图5-23新版animate实现的孤点步进踪迹动画(连环画)
一个效果等价的方案:
restart:
with(plottools):
with(plots):
plotsetup(inline):
R:
=5:
t:
=k->1*Pi*k/R:
F:
=proc(M)
display(seq(plot([[t(k),sin(t(k))]],style=point),k=0..M),symbol=circle,symbolsize=22,color=black);
end:
animate(F,[M],M=0..R,frames=R+1,axes=normal,scaling=unconstrained);
另一个效果等价的方案:
restart:
with(plottools):
with(plots):
plotsetup(inline):
R:
=5:
t:
=k->1*Pi*k/R:
F:
=proc(M)
display(POINTS(seq(evalf([1*Pi*k/R,sin(1*Pi*k/R)]),k=0..M)),symbol=circle,symbolsize=22,color=black);
end:
animate(F,[M],M=0..R,frames=R+1,axes=normal,scaling=unconstrained);
图5-24用O/S法生成的孤点链伸踪迹动画
restart:
N:
=18:
R:
=6:
p:
=(t,n)->cos((t*2*Pi/N)*n/R):
q:
=(t,n)->sin((t*2*Pi/N)*n/R):
F:
=n->[POINTS(seq(evalf([p(t,n),q(t,n)]),t=0..N),SYMBOL(CIRCLE,18))]:
;
PLOT(ANIMATE(seq(F(n),n=0..R)),SCALING(CONSTRAINED),VIEW(-1.2..1.2,-1.2..1.2));:
图5-24用O/S法生成的孤点链伸踪迹动画
图5-25使用rotate变换法做成的孤点链伸踪迹动画
with(plots):
with(plottools):
N:
=24:
R:
=6:
Q:
=point([1,0],symbol=diamond,color=blue,symbolsize=24):
a:
=2*Pi*i/N:
F:
=(i,n)->rotate(Q,a*n/R):
FF:
=n->display(seq(F(i,n),i=0..N/R*n)):
display(seq(FF(n),n=0..R),insequence=true,view=[-1.2..1.2,-1.2..1.2],scaling=constrained);
PLOT(ANIMATE(seq([op(FF(n))],n=0..R)),VIEW(-1.2..1.2,-1.2..1.2),SCALING(CONSTRAINED));
图5-25使用rotate变换法做成的孤点链伸踪迹动画
也可以使用下面的语句来制作这种动画。
直观效果是相同的,差别仅在程序的编写上:
下面的帧映射FF(n)是一个图形对象。
所以,从本质上说,下面页面程序的后半部分又回到O/S方法上去了。
with(plots):
with(plottools):
N:
=24:
R:
=6:
Q:
=point([1,0]):
a:
=2*Pi*i/N:
FF:
=n->[POINTS(seq(op(1,rotate(Q,a*n/R)),i=0..N/R*n))]:
;
display(seq((FF(n),n=0..R)),insequence=true,view=[-1.2..1.2,-1.2..1.2],scaling=constrained);
PLOT(ANIMATE(seq(FF(n),n=0..R)),VIEW(-1.2..1.2,-1.2..1.2),SCALING(CONSTRAINED));
图5-26~29用新animate法最简单的全族链伸踪迹动画
restart:
with(plottools):
with(plots):
R:
=6:
animate(plot,[[t,sin(t),t=0..M],style=point,symbol=circle,symbolsize=22,color=black],M=0..2*Pi,frames=R+1,axes=normal,scaling=constrained);
图5-26用新animate法最简单的全族链伸踪迹动画(首帧)
图5-27用新animate法最简单的全族链伸踪迹动画(连环画)
本方案有两个缺点:
①初始帧面已有一段弧线,不是“零起点”;②点数不能少于50。
可以这样解决初始帧的问题,但点数仍然不能少于49:
restart:
with(plots):
R:
=6:
animate(plot,[[t,sin(t),t=0..2*Pi*A/R+0.001],
style=point,symbol=circle,symbolsize=10,numpoints=60],
A=0..R,scaling=unconstrained,frames=R);
图5-28经过改进的方案
寻求一个完善的改进方案:
restart:
with(plottools):
with(plots):
R:
=5:
N:
=17:
F:
=proc(M)
t:
=k->2*Pi*M*k/N/R:
display(seq(point([t(k),sin(t(k))]),k=0..N),symbol=diamond,symbolsize=24,color=black);
end:
animate(F,[M],M=0..R,frames=R+1,axes=normal,scaling=unconstrained);
图5-29完善的改进方案(连环画)
图5-30用数据O/S法生成的曲线图元步进踪迹动画
N:
=36:
R:
=6:
k:
=2:
N是样点数目;R是帧编码,k是每帧增加的踪迹图元数目。
p:
=(x,t)->evalf([x*2*P
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 05 主题 动画 设计 技术