简体   繁体   English

有人可以告诉我我的 animation 代码有什么问题吗?

[英]Can someone tell me what's wrong with my animation code?

Can someone tell me what's wrong with my animation code?有人可以告诉我我的 animation 代码有什么问题吗?

I coded this program that will generate 40 png images, and an animated gif image.我编写了这个程序,它将生成 40 张 png 图像和一个动画 gif 图像。

The animation is supposed to be a sphere that is sliced into 5 segments, and the segments move left and right, but, as you will be able to see, it doesn't really work as I planned animation 应该是一个被切成 5 段的球体,并且这些段会左右移动,但是,正如您将看到的那样,它并没有像我计划的那样工作

(I only posted 12 frames of the gif, as 40 frames will be to big to post) (我只贴了 12 帧的 gif,因为 40 帧太大了)

Can someone tell me how to correct it?有人可以告诉我如何纠正吗?

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)

结果动画的一部分

The problem is that you are using the same array for all segments, so the plot will stay connected at some vertices.问题是您对所有段使用相同的数组,因此 plot 将在某些顶点保持连接。 That just how the plotting function works, it does not know that you want to separate the parts.这就是 plotting function 的工作原理,它不知道你想分开这些部分。

You have to split the array before, then modify the parts separately.你必须先拆分数组,然后分别修改部分。

At best this is done for x and y also, then you don't have to fiddle with the indices and that annoying inner for-loop:)充其量这也是为xy完成的,那么你就不必摆弄索引和烦人的内部 for 循环:)

I prepared something for you to start with:我为你准备了一些开始的东西:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM