3D曲線の接線のアニメーション


8

3Dカーブに沿って接線をアニメーション化するPythonプログラムを書いています。しかし、接線が動いていません。問題は

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

回答:


5

あなたは、で間違った関数と呼ばき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 ''という名前の関数があることを知りませんでした。
xpaul

私が理解していないことの1つは、「ax.plot3D(* tangent_line(0)、 'green')[0]」です。*の意味と、[0]の意味は何ですか?説明していただけますか?ありがとう。
xpaul

*-演算子を使用して、リスト/タプルを引数リストにアンパックできます。[0]最初のアイテムにアクセスするだけです。パターンマッチング(first, = some_list)を使用して、単一の要素を持つリストをアンパックすることもできますが、明示的なインデックス付け(first = some_list[0])の方がはるかに自然です。
pasbi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.