[英]Animation of tangent line of a 3D curve
我正在编写一个 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()
您在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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.