簡體   English   中英

有人可以告訴我我的 animation 代碼有什么問題嗎?

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

有人可以告訴我我的 animation 代碼有什么問題嗎?

我編寫了這個程序,它將生成 40 張 png 圖像和一個動畫 gif 圖像。

animation 應該是一個被切成 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)

結果動畫的一部分

問題是您對所有段使用相同的數組,因此 plot 將在某些頂點保持連接。 這就是 plotting function 的工作原理,它不知道你想分開這些部分。

你必須先拆分數組,然后分別修改部分。

充其量這也是為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM