如何用Python制作三维图形动画

2024-04-24 13:35:22 发布

您现在位置:Python中文网/ 问答频道 /正文


Tags: python
1条回答
网友
1楼 · 发布于 2024-04-24 13:35:22

可能您是从this example的随机游走代码开始工作的。 这是一个很好的例子,但要理解他们在做什么并不总是容易的。你知道吗

这个例子有一个函数Gen_RandLine,他们调用这个函数50次,每次行走一次。你只有三次散步,所以你只能叫它三次。而且,在x1、x2、x3中已经有了完整的轨迹,而它们是从头开始生成轨迹的。你的情况不同,因为你的轨迹相互依赖,而在这个例子中,轨迹是随机的和独立的。你知道吗

无论如何,我调用了generate_lines_from_x123函数来更好地表达它的功能。你知道吗

我还为x1,x2,x3创建了一些测试数据,因为我没有你的模拟功能。只有3个易于编程的螺旋。你知道吗

在函数中updatelinesdataLines包含所有数据,而lines只包含在每个步骤中实际绘制的线。你知道吗

以下是您的代码的改编,它似乎按预期运行:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from mpl_toolkits.mplot3d import Axes3D

N = 500  # number of steps
x1 = np.zeros((N, 3))
x2 = np.zeros((N, 3))
x3 = np.zeros((N, 3))
t = np.linspace(0, 20, N)
x1[:,0] = np.sin(t)
x1[:,1] = np.cos(t)
x1[:,2] = t
x2[:,0] = np.sin(t+1)
x2[:,1] = np.cos(t+1)
x2[:,2] = t
x3[:,0] = np.sin(t+2)
x3[:,1] = np.cos(t+2)
x3[:,2] = t

def generate_lines_from_x123(length, x1, dims=3):
    lineData = np.empty((dims, length))
    lineData[:,0] = x1[0]
    for index in range(1, length) :
        lineData[:, index] = x1[index]
    return lineData

def updatelines(num, dataLines, lines) :
     for line, data in zip(lines, dataLines) :

         line.set_data(data[0:2, :num])
         line.set_3d_properties(data[2,:num])
     return lines

fig = plt.figure(figsize = (15,15))
ax = fig.add_subplot(111, projection = '3d')
ax.set_title('3 Body Problem')

do_animation = True
if do_animation:
    data = [generate_lines_from_x123(N, x, 3) for x in (x1, x2, x3)]
    lines = [ax.plot(x[:,0], x[:,1], x[:,2])[0] for x in (x1, x2, x3)]
    line_ani = animation.FuncAnimation(fig, updatelines, N, fargs=(data, lines),
                          interval=100, blit=False)
else:
    # just plot the 3 curves

    ax.plot(x1[:,0],x1[:,1],x1[:,2],color = 'b')
    ax.plot(x2[:,0],x2[:,1],x2[:,2],color = 'm')
    ax.plot(x3[:,0],x3[:,1],x3[:,2],color = 'g')

    ax.scatter(x1[-1,0],x1[-1,1],x1[-1,2],color = 'b', marker = 'o', s=30, label = 'Mass 1')
    ax.scatter(x2[-1,0],x2[-1,1],x2[-1,2],color = 'm', marker = 'o',s=90, label = 'Mass 2')
    ax.scatter(x3[-1,0],x3[-1,1],x3[-1,2],color = 'g', marker = 'o',s=60, label = 'Mass 3')
    ax.legend()

plt.show()

相关问题 更多 >