有人可以告诉我我的动画代码怎么了吗?

问题描述 投票:2回答:1

有人可以告诉我我的动画代码怎么了吗?

我编写了此程序,将生成40个png图像和一个动画gif图像。

该动画应该是一个切成5个片段的球体,这些片段左右移动,但是,正如您将看到的那样,它实际上并没有按照我的计划工作

(我只张贴了12帧gif,因为要张贴40帧会很大)

[[有人可以告诉我该如何纠正?

import matplotlib.pyplot as plt from numpy import sin,cos,pi,outer,ones,size,linspace from mpl_toolkits.mplot3d import axes3d # Define the x, y, and z lists for the sphere: x = 10*outer(cos(linspace(0, 2*pi)), sin(linspace(0, pi))) y = 10*outer(sin(linspace(0, 2*pi)), sin(linspace(0, pi))) z = 10*outer(ones(size(linspace(0, 2*pi))), cos(linspace(0, pi))) for n in range(40): fig = plt.figure(figsize=(10, 10)) ax = fig.add_subplot(111, projection='3d') ax.plot_surface(x, y, z, color = ('r')) ax.set_xticks([]) ax.set_yticks([]) ax.set_zticks([]) ax.set_xlim(-10,10) ax.set_ylim(-10,10) ax.set_zlim(-10,10) plt.savefig(str(n)+'.png') #Save the image into a numbered png file print(str(n)+'.png completed.') plt.close() sign = 1 for count in range(5): #Slice the sphere into 5 segments for num in range(len(z)//5*count,len(z)//5*(count+1)): z[num] += sign # Make the segments go positive and negative directions sign *= -1 from PIL import Image images = [] # Open each png file and store in images list for n in range(40): exec('a'+str(n)+'=Image.open("'+str(n)+'.png")') images.append(eval('a'+str(n))) # Create an animated gif file: images[0].save('ball.gif', save_all=True, append_images=images[1:], duration=100, loop=0)

Part of the resulting animation
python matplotlib animation python-imaging-library animated-gif
1个回答
0
投票
问题是,所有段都使用相同的数组,因此该图将在某些顶点保持连接。只是绘图功能是如何工作的,它不知道您要分离零件。

您必须先split阵列,然后分别修改零件。

充其量也可以在xy上完成,那么您就不必摆弄索引和烦人的内部for循环了:)

我为您准备了一些内容,从以下开始:

import matplotlib.pyplot as plt from numpy import sin,cos,pi,outer,ones,size,linspace from mpl_toolkits.mplot3d import axes3d import numpy as np # Define the x, y, and z lists for the sphere: x = 10*outer(cos(linspace(0, 2*pi)), sin(linspace(0, pi))) y = 10*outer(sin(linspace(0, 2*pi)), sin(linspace(0, pi))) z = 10*outer(ones(size(linspace(0, 2*pi))), cos(linspace(0, pi))) def split_and_array(a): return np.array(np.split(a, 5, axis=0)) x = split_and_array(x) y = split_and_array(y) z = split_and_array(z) for n in range(40): fig = plt.figure(figsize=(10, 10)) ax = fig.add_subplot(111, projection='3d') for k in range(5): ax.plot_surface(x[k], y[k], z[k], color = ('r')) ax.set_xticks([]) ax.set_yticks([]) ax.set_zticks([]) ax.set_xlim(-10,10) ax.set_ylim(-10,10) ax.set_zlim(-10,10) plt.savefig(str(n)+'.png') #Save the image into a numbered png file print(str(n)+'.png completed.') plt.close() sign = 1 for count in range(5): #Slice the sphere into 5 segments z[count] += sign # Make the segments go positive and negative directions sign *= -1

© www.soinside.com 2019 - 2024. All rights reserved.