1、第12章主题动画典例分析第十二章 主题数学动画典例分析图12-0102 圆柱面渐伸展开为平面*图 1 圆柱面渐伸展开为平面restart:with(plots):N:=24:M:=4:R:=N:w:=1:r:=5:a:=0:b:=2*Pi:c:=-r:d:=r:u:=i-2*Pi*i/N:v:=j-c+2*d*j/M:f:=(i,j)-r*cos(u(i):g:=(i,j)-r*sin(u(i):h:=(i,j)-(v(j):F:=k-MESH(seq(seq(evalf(f(i,j),g(i,j),h(i,j),j=0.M),i=0.R-w*k),COLOR(RGB,1,0,1):PLOT3
2、D(ANIMATE(seq(F(k),k=0.R),AXES(BOX):;display(ANIMATE(seq(F(k),k=0.R),insequence=true,axes=frame,labels=x,y,z):;W1:=%:Q:=i-polygon(r*cos(u(i),r*sin(u(i),c,r*cos(u(i)+r*sin(u(i)*(u(i),r*sin(u(i)-r*cos(u(i)*(u(i),c,r*cos(u(i)+r*sin(u(i)*(u(i),r*sin(u(i)-r*cos(u(i)*(u(i),d,r*cos(u(i),r*sin(u(i),d,color=
3、blue):Q(i):display(ANIMATE(seq(Q(i),i=0.N),insequence=true,axes=frame):PLOT3D(ANIMATE(seq(Q(i),i=0.N),AXES(BOX):WW:=%: f:=(i,j)-r*cos(u(i):g:=(i,j)-r*sin(u(i):h:=(i,j)-v(j):FF:=PLOT3D(MESH(seq(seq(evalf(f(i,j),g(i,j),h(i,j),j=0.M),i=0.R),STYLE(LINE),COLOR(RGB,0,1,0):display(W1,WW,FF,view=-25.8,-32.1
4、6,c.d,orientation=20,72,scaling=constrained,axesfont=TIMES,ROMAN,5,scaling=constrained);本主题动画,如果采用新版animate函数,可以使用如下实现方案。restart:with(plots):r:=5:c:=-r:d:=r:cylinderplot(r,u=0.2*Pi,v=-c.c,style=line,grid=13,3):B:=%:FF:=proc(t)display(polygonplot3d(r*cos(t),r*sin(t),c,r*cos(t)+r*sin(t)*(t),r*sin(t)-r
5、*cos(t)*(t),c,r*cos(t)+r*sin(t)*(t),r*sin(t)-r*cos(t)*(t),d,r*cos(t),r*sin(t),d ),cylinderplot(r,u=t.2*Pi,v=-c.c,color=red,grid=13,3,thickness=0,style=PATCHNOGRID):end:animate(FF,t,t=0.2*Pi,frames=9,background=B,scaling=constrained,orientation=40,70,axes=box);图 2 新方案动画的一帧图12-0305 圆柱面的截口曲线*图 3 截平面位置变
6、动时圆柱面的截口曲线restart:with(plots):with(plottools):a:=-12:b:=12:N:=48:M:=36:r:=1:R:=18:t:=i-a+(b-a)/N*i: s:=j-2*Pi*j/M:x:=(i,j)-r*cos(s(j):y:=(i,j)-r*sin(s(j):z:=(i,j)-t(i):plot3d(x(i,j),y(i,j),z(i,j),i=0.N,j=0.M,style=wireframe,color=green):ZM:=%:k:=n-tan(-0.0001+Pi*n/2/R):PM:=n-polygonplot3d(-1,-1,-k(n
7、),1,-1,-k(n),1,1,k(n),-1,1,k(n),style=LINE,color=red):x1:=j-r*cos(s(j):y1:=j-r*sin(s(j):z1:=j-k(n)*sin(s(j):JKQX:=n-spacecurve(x1(j),y1(j),z1(j),j=0.M,color=blue,thickness=3):HI:=n-display(PM(n),JKQX(n):display(seq(HI(n),n=0.R),insequence=true):;display(%,ZM,orientation=-29,58,view=-1.1,-1.1,-12.12,
8、orientation=-48,84);图 4 假如把各帧的截口曲线保留为踪迹的情形如果使用新版animate函数,可以采取如下方案。restart:with(plots):r:=5:a:=-r*52:b:=r*52:cylinderplot(r,u=0.2*Pi,v=a.b,style=line,grid=24,6):ZM:=%:DH:=proc(t)display(polygonplot3d(-r,-r,-tan(t)*r,r,-r,-tan(t)*r,r,r,tan(t)*r,-r,r,tan(t)*r,color=yellow),spacecurve(r*cos(s),r*sin(s)
9、,tan(t)*r*sin(s),s=0.2*Pi,color=blue,thickness=3):end:animate(DH,t,t=0.Pi/12*5.9,orientation=-45,80,background=ZM);图 5 新方案动画的一帧图12-0609 展开圆柱截口曲线成为一条正弦曲线*图 6 展开圆柱截口曲线成为一条正弦曲线restart:with(plots):with(plottools):第一部分。N:=24:M:=4:R:=N:w:=1:r:=5:a:=0:b:=2*Pi: c:=-(r+.5):d:=-c: u:=i-2*Pi*i/N: v:=j-c+2*d*j/
10、M:f:=(i,j)-r*cos(u(i):g:=(i,j)-r*sin(u(i):h:=(i,j)-(v(j):F:=k-MESH(seq(seq(evalf(f(i,j),g(i,j),h(i,j),j=0.M),i=0.R-w*k),COLOR(RGB,0,1,0):PLOT3D(ANIMATE(seq(F(k),k=0.R),AXES(BOX):;display(ANIMATE(seq(F(k),k=0.R),insequence=true,axes=frame,labels=x,y,z):W1:=%:Q:=i-polygon(r*cos(u(i),r*sin(u(i),c,r*cos
11、(u(i)+r*sin(u(i)*(u(i),r*sin(u(i)-r*cos(u(i)*(u(i),c,r*cos(u(i)+r*sin(u(i)*(u(i),r*sin(u(i)-r*cos(u(i)*(u(i),d,r*cos(u(i),r*sin(u(i),d,color=cyan,thickness=2):display(ANIMATE(seq(Q(i),i=0.N),insequence=true,axes=frame):WW:=%:f:=(i,j)-r*cos(u(i): g:=(i,j)-r*sin(u(i): h:=(i,j)-v(j):FF:=PLOT3D(MESH(seq
12、(seq(evalf(f(i,j),g(i,j),h(i,j),j=0.M),i=0.R),STYLE(LINE),COLOR(RGB,.8,.9,0):display(W1,WW,FF,view=-25.8,-32.16,c.d,orientation=20,72,scaling=constrained,axesfont=TIMES,ROMAN,5);第二部分以下才是本主题动画“展开圆柱截口曲线成为一条正弦曲线” 设计的核心部分。首先设计一条逐渐伸长并逐渐向左移动的正弦曲线。k:=17:plot(x-k*2*Pi/N,r*sin(x),x=0.k*2*Pi/N,color=black,thi
13、ckness=2);图 7 逐渐伸长并逐渐向左移动的正弦曲线再把上面的正弦曲线动画逐帧映射到渐开切平面上去。N:=24:r:=5: G:=transform(u,v)-u*r*sin(i*2*Pi/N)+r*cos(i*2*Pi/N),u*r*cos(i*2*Pi/N)+r*sin(i*2*Pi/N),v):F:=i-G(plot(x-i*2*Pi/N,r*sin(x),x=0.001.i*2*Pi/N,color=black,thickness=2):display(seq(F(i),i=0.N),insequence=true,axes=frame):;tuxd:=%:display(W1
14、,WW,FF,tuxd,scaling=unconstrained,orientation=34,64,axesfont=TIMES,ROMAN,5);最后添加一条被逐渐“解掉”的圆柱面截口曲线。N:=24:r:=5:with(plottools):GG:=transform(u,v)-r*cos(u),r*sin(u),v):FG:=i-GG(plot(x,r*sin(x),x=i*2*Pi/N.2*Pi,color=red,thickness=2):display(seq(FG(i),i=0.001.N),insequence=true):JK:=%:display(W1,WW,JK,tu
15、xd,FF,scaling=unconstrained,orientation=31,73,axesfont=TIMES,ROMAN,5);图 8 最后组合成的动画如果使用新版animate函数,可以采取如下方案。首先取来2-6.1.3的结果,并赋名为QQ。然后再添加上两条曲线的动画。WQWQ:=proc(t)G:=transform(u,v)-u*r*sin(t)+r*cos(t),u*r*cos(t)+r*sin(t),v):GG:=transform(u,v)-r*cos(u),r*sin(u),v):display(G(plot(x-t,r*sin(x),x=0.t,color=bla
16、ck,thickness=2),GG(plot(x,r*sin(x),x=t.2*Pi,color=blue,thickness=2);end:animate(WQWQ,t,t=0.001.2*Pi+0.001,frames=W):;QQQ:=%:经过适当调整之后使两者组合。display(QQ,QQQ); 图 9 新版animate的实现方案图12-1013 地球公转与自转的示意*图 10 地球公转与自转的示意(连环画)with(plots):with(plottools):a:=3:b:=2:l:=3:n:=cos(66.5*Pi/180):m:=sin(66.5*Pi/180):L:=l
17、ine(-l*n,0,-l*m,l*n,0,l*m,color=blue,thickness=2):N:=5:k:=4:M:=k*N:L1:=i-translate(L,a*cos(2*Pi*i/M),b*sin(2*Pi*i/M),0):display(seq(L1(i),i=0.M),axes=normal,labels=x,y,z,insequence=true,orientation=-80,65);LL:=%:spacecurve(a*cos(t),b*sin(t),0,t=0.2*Pi,color=red,thickness=3):TY:=%:display(LL,TY);图 11
18、 地轴和黄道面Q:=tetrahedron(0,0,0,1,style=LINE,thickness=2):W0:=rotate(Q,0,-Pi*23.5/180,0):W1:=i-rotate(W0,2*Pi*i/N,-n,0,-m,n,0,m):W2:=i-translate(W1(i),a*cos(2*Pi*i/M),b*sin(2*Pi*i/M),0):display(seq(W2(i),i=0.M),insequence=true,axes=box,scaling=constrained,orientation=-80,65);WW:=%:display(LL,TY,WW,axes=
19、normal,tickmarks=0,0,0);QQ:=%:图 12 自转动画与组合动画本例中为减少参与运算的数据量,用四面体代替了地球。如果使用新版animate函数,可以采取如下方案。restart:with(plots):with(plottools):a:=3:b:=2:l:=3: n:=cos(66.5*Pi/180):m:=sin(66.5*Pi/180):spacecurve(a*cos(t),b*sin(t),0,t=0.2*Pi,color=red,thickness=3):TY:=%:L:=line(-l*n,0,-l*m,l*n,0,l*m,color=blue,thic
20、kness=2):Q:=tetrahedron(0,0,0,1,style=LINE,thickness=2,color=black):CX:=proc(u)display(translate(L,a*cos(u),b*sin(u),0),translate(rotate(rotate(Q,0,-Pi*23.5/180,0),4*u,-n,0,-m,n,0,m),a*cos(u),b*sin(u),0);end:animate(CX,u,u=0.2*Pi,frames=72,background=TY,axes=normal,labels=x,y,z,orientation=-93,77,ax
21、esfont=TIMES,ROMAN,6);图 13 新版animate的实现方案图12-1416 球面数字地球仪*图 14 球面数字地球仪restart:with(plottools): with(plots):Q:=readdata(e:MathCAD2kqsheetWorld.prn,2):PLOT(CURVES(Q),STYLE(POINT),COLOR(RGB,1,1,1):Q1:=(%):g:=transform(u,v)-u*Pi/180,(90-v)*Pi/180):g(Q1):Q2:=g(Q1):f:=transform(u,v)-sin(v)*cos(u),sin(v)*s
22、in(u),cos(v):display(f(Q2):Q3:=plot3d(sin(s)*cos(t),sin(s)*sin(t),cos(s),s=0.Pi,t=0.2*Pi,color=cyan): display(Q3,f(Q2);DQY:=%:M:=5: F:=i-rotate(DQY,0,0,-2*Pi*i/M):display(seq(F(i),i=0.M),insequence=true);图 15 动画之一帧:旋转中的地球仪如果放弃对北极地区的观察,可以做出更为简洁的动画。办法是:作出带有地图的球面静止图形DQY。然后使用如下一条带有新版animate函数的语句,就可得到一个“
23、走马灯”式的地球仪。这个算法,会比原来的方案节省一些计算时间。animate(display,Q3,f(Q2),orientation=94+t,90,t=0.-360,frames=9);图 16 “走马灯”地球仪图12-1718 二元变量在任意点处的“全方位”极限图 17 二元变量在任意点处的“全方位”极限(连环画)restart:f:=(x,y)-8-sqrt(x2+y2): G:=x,y,f(x,y):m:=2:n:=5:h:=2: a:=m-h:b:=m+h:c:=n-h:d:=n+h:plot3d(G,x=a.b,y=c.d,style=LINE,color=green,grid=
24、9,8);SS:=%: #SS是二元函数曲面。G0:=evalf(subs(x=m,y=n,G):LA:=m,n,0,G0:PLOT3D(CURVES(LA),COLOR(RGB,1,0,0),THICKNESS(4);W1:=%:#LA是极限值线段。R:=2:N:=72: e:=i-(R-(-0.001+R)*i/N):H:=POLYGONS(a,c,evalf(f(m,n),a,d,evalf(f(m,n),b,d,evalf(f(m,n),b,c,evalf(f(m,n),STYLE(LINE),COLOR(RGB,0,0,0),THICKNESS(2):plotsdisplay(H,o
25、rientation=67,69,axes=FRAME); #H是极限值高度平面。H1:=i-POLYGONS(a,c,evalf(f(m,n)-e(i),a,d,evalf(f(m,n)-e(i),b,d,evalf(f(m,n)-e(i),b,c,evalf(f(m,n)-e(i),STYLE(LINE),COLOR(RGB,0,0,1),THICKNESS(2):plotsdisplay(seq(H1(i),i=1.N),insequence=true);HH1:=%:H2:=i-POLYGONS(a,c,evalf(f(m,n)+e(i),a,d,evalf(f(m,n)+e(i),b
26、,d,evalf(f(m,n)+e(i),b,c,evalf(f(m,n)+e(i),STYLE(LINE),COLOR(RGB,0,0,1),THICKNESS(2):plotsdisplay(seq(H2(i),i=1.N),insequence=true);HH2:=%:#HH1,HH2构成带状薄层。plotsdisplay(H,HH1,HH2,orientation=67,69,axes=FRAME);#组合成薄层逐渐变薄的动画。delta:=i-e(i):for i from 1 to N dou:=evalf(1/2+rand(7*(i+1)/(15*(i+1):u1:=u():u
27、2:=u():u3:=u():u4:=u():L0:=x,y,0,x,y,f(x,y);:k:=i-evalf(delta(i)/sqrt(2):L1:=subs(x=m+k(i)*u1,y=n+k(i)*u2,L0):;L2:=subs(x=m-k(i)*u1,y=n-k(i)*u2,L0):;L3:=subs(x=m-k(i)*u1,y=n+k(i)*u2,L0):;L4:=subs(x=m+k(i)*u1,y=n-k(i)*u2,L0):;L12:=subs(x=m+k(i)*u2,y=n+k(i)*u1,L0):;L22:=subs(x=m-k(i)*u2,y=n-k(i)*u1,L0
28、):;L32:=subs(x=m-k(i)*u2,y=n+k(i)*u1,L0):;L42:=subs(x=m+k(i)*u2,y=n-k(i)*u1,L0):;L5:=subs(x=m+k(i)*u3,y=n+k(i)*u4,L0):;L6:=subs(x=m-k(i)*u3,y=n-k(i)*u4,L0):;L7:=subs(x=m-k(i)*u3,y=n+k(i)*u4,L0):;L8:=subs(x=m+k(i)*u3,y=n-k(i)*u4,L0):;L52:=subs(x=m+k(i)*u4,y=n+k(i)*u3,L0):;L62:=subs(x=m-k(i)*u4,y=n-k(
29、i)*u3,L0):;L72:=subs(x=m-k(i)*u4,y=n+k(i)*u3,L0):;L82:=subs(x=m+k(i)*u4,y=n-k(i)*u3,L0):;Fi:=CURVES(L1,L2,L3,L4,L5,L6,L7,L8,L12,L22,L32,L42,L52,L62,L72,L82,COLOR(RGB,1,.4,.8),THICKNESS(0):od:;plotsdisplay(seq(Fi,i=1.N),insequence=true,axes=NORMAL);WW1:=%:#在半径不断缩小的圆域中随机找出16个点,并求得其上函数值。S:=i-plotsspace
30、curve(delta(i)*cos(t)+m,delta(i)*sin(t)+n,0,t=0.2*Pi,color=blue,thickness=2):;S(1):;plotsdisplay(seq(S(i),i=1.N),insequence=true);WW2:=%:#半径不断缩小的圆域边界。plotsdisplay(WW1,WW2,W1,H,HH1,HH2,SS,orientation=16,77,axes=FRAME);#最后合成为动画。图 18 二元变量在任意点处的“全方位”极限(一帧)图12-1920 二元变量在原点处按指定路线的极限图 19 二元变量在原点处按指定路线的极限(连环画)做一个“指定路径
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1