【问题标题】:Animation of tangent line of a 3D curve3D 曲线的切线动画
【发布时间】:2020-05-31 03:03:32
【问题描述】:

我正在编写一个 Python 程序来为沿 3D 曲线的切线设置动画。但是,我的切线没有移动。我认为问题是

line.set_data(np.array(Tangent[:,0]).T,np.array(Tangent[:,1]).T)

animate(i),但我不知道。任何帮助将不胜感激。以下是代码。

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

matplotlib.use( 'tkagg' )
plt.style.use('seaborn-pastel')

fig = plt.figure()
ax = plt.axes(projection='3d')
ax = plt.axes(projection='3d')

# Data for a three-dimensional line
zline = np.linspace(0, 15, 1000)
xline = np.sin(zline)
yline = np.cos(zline)
ax.plot3D(xline, yline, zline, 'red')

def curve(t):
    return [np.sin(t),np.cos(t),t]

def vector_T(t):
    T = [np.cos(t),-np.sin(t),1]
    return T/np.linalg.norm(T)

len = 2
def tangent_line(t):
    P = np.add(curve(t),len*vector_T(t))
    Q = np.subtract(curve(t),len*vector_T(t))
    return np.array([P, Q]).T

t0 = 0
Tangent=tangent_line(t0)
line, = ax.plot3D(Tangent[0], Tangent[1], Tangent[2], 'green')


def init():
    line.set_data([], [])
    return line,

def animate(i):
    t0 = 15* (i/200)
    Tangent=tangent_line(t0)
    #print(Tangent)
    line.set_data(np.array(Tangent[:,0]).T,np.array(Tangent[:,1]).T)
    return line,

anim = FuncAnimation(fig, animate, init_func=init,
                               frames=200, interval=20, blit=True)

plt.show()

【问题讨论】:

    标签: python numpy matplotlib animation


    【解决方案1】:

    您在animate 中调用了错误的函数: 将line.set_data(...) 替换为line.set_data_3d(Tangent[0], Tangent[1], Tangent[2]) 即可。

    代码中仍有一些小问题(例如,不要使用len 作为变量名)。 我建议使用以下内容:

    #!/usr/bin/env python3
    
    from mpl_toolkits import mplot3d
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.animation import FuncAnimation
    import matplotlib
    
    matplotlib.use('tkagg')
    plt.style.use('seaborn-pastel')
    
    fig = plt.figure()
    ax = plt.axes(projection='3d')
    
    # Data for a three-dimensional line
    zline = np.linspace(0, 15, 1000)
    xline = np.sin(zline)
    yline = np.cos(zline)
    ax.plot3D(xline, yline, zline, 'red')
    
    def curve(t):
        return [ np.sin(t), np.cos(t), t ]
    
    def tangent(t):
        t = [ np.cos(t), -np.sin(t), 1.0 ]
        return t/np.linalg.norm(t)
    
    def tangent_line(t):
        length = 2.0
        offset = length * tangent(t)
        pos = curve(t)
        return np.array([ pos-offset, pos+offset ]).T
    
    line = ax.plot3D(*tangent_line(0), 'green')[0]
    
    def animate(i):
        line.set_data_3d(*tangent_line(15* (i/200)))
        return [ line ]
    
    anim = FuncAnimation(fig, animate, frames=200, interval=20, blit=True)
    
    plt.show()
    

    【讨论】:

    • 非常感谢!我没有意识到python中有一个名为''set_data_3d''的函数。
    • 我不明白的一点是'ax.plot3D(*tangent_line(0), 'green')[0]'。 * 是什么意思,[0] 是什么意思?你能解释一下吗?谢谢。
    • 您可以使用*-operator 将列表/元组解压缩到参数列表中。 [0] 只访问第一项。虽然您可以使用模式匹配 (first, = some_list) 来解压缩具有单个元素的列表,但我发现显式索引 (first = some_list[0]) 更加自然。
    猜你喜欢
    • 1970-01-01
    • 2023-01-13
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多