| 1 | initial version |
If you want to animate a 3d plot, I think there must be a better way. Here's one hacky workaround:
First, generate a "dummy animation" with the number of frames you want, and note where the output images are stored:
N = 10
A = animate([i for i in range(N)])
print A.png()
os.system('ls '+ A.png())
This will return something like
/sagenb/sagenbws/.sage/temp/mod.math.washington.edu/13021/dir_3
00000000.png 00000002.png 00000004.png 00000006.png 00000008.png
00000001.png 00000003.png 00000005.png 00000007.png 00000009.png
Now save the list of images you want to animate, using the same names as those listed above:
def par(t):
tmp = [[200-t,-1,0,0],[300-t,0,-1,0],[400-t,-1,-1,-1],[600-t,0,-1,-3],[0,1,0,0],[0,0,1,0],[0,0,0,1]]
G = Polyhedron(ieqs = tmp, field=RDF)
return G.render_solid(rgbcolor='blue',alpha=.2)+G.render_wireframe(rgbcolor='black')+plot3d(0,(0,200),(0,300),color='red',opacity=.1)
for i in range(N):
P = par(2+i)
P.save(A.png()+'/%08d.png'%i)
When you call A.show(), it just checks for images in the directory returned by A.png and uses convert or ffmpeg to return a gif animation. Since you've cleverly replaced the original images generated by the animate command with the ones you want, then you will get your animation with
A.show()
Note: it's been bugging me for a long time that there's no good way to animate 3D plots. Maybe this hack will convince someone else that they should figure out a better way to do it! Alternatively, maybe this will tell me that there's already a ticket open for fixing the animate command :)
Second note: the function par from the OP seems to return the same picture, just on different scales. This makes the animation basically constant, so I threw in a fixed rectangle in the xy plane because I couldn't immediately figure out the command to set xmin, xmax or the like for 3D plots. I also updated the Polyhedron command to use floating point numbers instead of integers. This makes par accept non-integral values for some reason, and thus means that the original interact from the OP should work with this updated par function.
| 2 | include gif |
If you want to animate a 3d plot, I think there must be a better way. Here's one hacky workaround:
First, generate a "dummy animation" with the number of frames you want, and note where the output images are stored:
N = 10
A = animate([i for i in range(N)])
print A.png()
os.system('ls '+ A.png())
This will return something like
/sagenb/sagenbws/.sage/temp/mod.math.washington.edu/13021/dir_3
00000000.png 00000002.png 00000004.png 00000006.png 00000008.png
00000001.png 00000003.png 00000005.png 00000007.png 00000009.png
Now save the list of images you want to animate, using the same names as those listed above:
def par(t):
tmp = [[200-t,-1,0,0],[300-t,0,-1,0],[400-t,-1,-1,-1],[600-t,0,-1,-3],[0,1,0,0],[0,0,1,0],[0,0,0,1]]
G = Polyhedron(ieqs = tmp, field=RDF)
return G.render_solid(rgbcolor='blue',alpha=.2)+G.render_wireframe(rgbcolor='black')+plot3d(0,(0,200),(0,300),color='red',opacity=.1)
for i in range(N):
P = par(2+i)
P.save(A.png()+'/%08d.png'%i)
When you call A.show(), it just checks for images in the directory returned by A.png and uses convert or ffmpeg to return a gif animation. Since you've cleverly replaced the original images generated by the animate command with the ones you want, then you will get your animation with
A.show()

Note: it's been bugging me for a long time that there's no good way to animate 3D plots. Maybe this hack will convince someone else that they should figure out a better way to do it! Alternatively, maybe this will tell me that there's already a ticket open for fixing the animate command :)
Second note: the function par from the OP seems to return the same picture, just on different scales. This makes the animation basically constant, so I threw in a fixed rectangle in the xy plane because I couldn't immediately figure out the command to set xmin, xmax or the like for 3D plots. I also updated the Polyhedron command to use floating point numbers instead of integers. This makes par accept non-integral values for some reason, and thus means that the original interact from the OP should work with this updated par function.
Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.