# Preserving aspect ratio in animation

I'm trying to animate a series of increasing, nested tori. I'm testing the code for the first one, but the aspect ratio isn't behaving, and axes are showing up. I've tried messing with figsize, to no avail. Suggestions?

u,v = var('u,v')
def is_even(n):
return n%2 == 0

def c(n):
return 2/3*(4^(n+1)-4)

def torus(n,u,v):
if is_even(n):
return [(2*4**n + 4**n*cos(u))*cos(v), (2*4**n + 4**n*cos(u))*sin(v) + c(n), 4**n*sin(u)]
else:
return [4**n*sin(u), (2*4**n + 4**n*cos(u))*sin(v) + c(n),  (2*4**n + 4**n*cos(u))*cos(v)]

T = []

for i in range(10):
T.append(parametric_plot3d(torus(0,u,v), (u,0,(i+1)*2*pi/9), (v,0,(i+1)*2*pi/9), axes="false"))

a = animate(T)
a.show()

edit retag close merge delete

Sort by » oldest newest most voted

I think part of your problem is that your bounds for the plots are not the same, but I'm not sure there is an easy way to make the bounds work that way in a parametric plot. Maybe you can pad it with an 'invisible' part?

However, putting aspect_ratio=1 in the plot command seems to help once the torus has worked its way around some of the way.

more

I incorporated the suggestions and worked the bounds into two different loops. Seems to have fixed it.

u,v = var('u,v')

def is_even(n):
return n%2 == 0

def c(n):
return 2/3*(4^(n+1)-4)

def torus(n,u,v):
if is_even(n):
return [(2*4**n + 4**n*cos(u))*cos(v), (2*4**n + 4**n*cos(u))*sin(v)+c(n), 4**n*sin(u)]
else:
return [4**n*sin(u), (2*4**n + 4**n*cos(u))*sin(v)+c(n),  (2*4**n + 4**n*cos(u))*cos(v)]
T0 = []
for i in srange(0,2*pi+0.1, 0.1):
T0.append(parametric_plot3d(torus(0,u,v), (u,0,2*pi),(v,i, i+0.1), aspect_ratio=1, frame=False, axes=False))

T = []
for i in range(len(T0)):
T.append(sum(T0[j] for j in range(i)))

a = animate(T)
a.show()

more

To not depict the axes, you should use axes=False instead of axes="false". Also you may consider adding frame=False to suppress the bounding boxes. Taking into account kcrisman's suggestion aspect_ratio=1, you command should become

T.append(parametric_plot3d(torus(0,u,v), (u,0,(i+1)*2*pi/9), (v,0,(i+1)*2*pi/9), aspect_ratio=1, axes=False, frame=False))


However, there is still the issue that the bounds are not the same for each plot...

more