我正在尝试制作 Manim 动画,其中点遵循一组径向基函数作为 x 的函数。我还制作了一条垂直线,点应该完全遵循该线。奇怪的是,这些点似乎相互重叠,使得动画中看起来好像只有一个点。使用
pdb.set_trace
,我看到每个 Dot 中的更新函数在 for 循环的每次迭代中都会发生变化。函数或 deepcopy
对象的 Dot
似乎并不能阻止这种情况的发生。我该怎么做才能为每个点拥有不同的更新程序功能?
from manim import *
import numpy as np
from scipy.stats import norm
import pdb
class RDFBasis(Scene):
def construct(self):
axes = Axes(
x_range=[0, 5, 1],
y_range=[0, 1, 0.2],
x_length=10,
tips=False,
)
axes_labels = axes.get_axis_labels()
vt = ValueTracker(0)
line = Line(axes.c2p(0, 1), axes.c2p(0, 0))
line.add_updater(lambda x: x.move_to(axes.c2p(vt.get_value(), 0.5)))
graphs = []
dots = []
anims = []
for i in np.linspace(0, 5, 5):
func = lambda x: norm.pdf(x, loc=i, scale=0.5)
graph = axes.plot(func, color=RED)
graphs.append(graph)
dot = Dot()
dot.move_to(graph.get_start())
dot_mover = lambda x=dot, graph=graph: x.move_to(graph.get_point_from_function(vt.get_value()))
dot.add_updater(dot_mover)
dots.append(dot)
# pdb.set_trace()
plot = VGroup(axes, *graphs)
labels = VGroup(axes_labels)
# pdb.set_trace()
self.add(plot, labels, line, *dots)
self.play(vt.animate.set_value(5.0))
我不是Python专家,所以我不确定为什么会发生这种情况,但是for循环中的lambda以某种方式破坏了
graph.get_point_from_function()
函数。用这样的东西替换你的代码将使它工作:
...
func1 = lambda x: norm.pdf(x, loc=1, scale=0.5)
func2 = lambda x: norm.pdf(x, loc=2, scale=0.5)
func3 = lambda x: norm.pdf(x, loc=3, scale=0.5)
funcs = [func1, func2, func3]
for i in range(3):
graph = axes.plot(funcs[i], color=RED)
graphs.append(graph)
...