Hoạt hình của đường tiếp tuyến của đường cong 3D


8

Tôi đang viết một chương trình Python để tạo hiệu ứng cho một đường tiếp tuyến dọc theo đường cong 3D. Tuy nhiên, đường tiếp tuyến của tôi không di chuyển. Tôi nghĩ vấn đề là

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

trong animate(i)nhưng tôi không thể tìm ra. Bất kỳ trợ giúp sẽ được đánh giá cao. Sau đây là mã.

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()

Câu trả lời:


5

bạn đã gọi sai chức năng trong animate: Thay thế line.set_data(...)bằng line.set_data_3d(Tangent[0], Tangent[1], Tangent[2])và nó sẽ hoạt động.

Vẫn còn một số vấn đề nhỏ trong mã (ví dụ: không sử dụng lenlàm tên biến). Tôi khuyên bạn nên sử dụng như sau:

#!/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()

Cảm ơn rât nhiều! Tôi đã không nhận ra rằng có một hàm có tên '' set_data_3d '' trong python.
xpaul

Một điều tôi không hiểu là 'ax.plot3D (* tangent_line (0),' green ') [0]'. Ý nghĩa của * và [0] là gì? Bạn có thể vui lòng giải thích? Cảm ơn.
xpaul

Bạn có thể sử dụng * -operator để giải nén danh sách / tuple vào danh sách đối số. [0]chỉ cần truy cập vào mục đầu tiên. Mặc dù bạn có thể sử dụng khớp mẫu ( first, = some_list) để giải nén danh sách với một phần tử duy nhất, tôi thấy việc lập chỉ mục rõ ràng ( first = some_list[0]) tự nhiên hơn nhiều.
pasbi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.