如何使用 Manim 为在数轴上移动的点设置动画?
How to use Manim to animate a point moving on a number line?
我想使用 Manim 为数字轴上参数的位置设置动画。我想出了如何使用 ParametricFunction:
将参数的结束位置动画化为一条线
from manim import *
import numpy as np
import math
class line( Scene ):
def construct( self ):
tline = NumberLine(
x_range=[ 0, 1 ],
length=4,
color=BLUE,
include_numbers=False )
t1 = ParametricFunction( lambda t: tline.number_to_point(np.sin(t * PI)),
t_range=[0, 1],
scaling=tline.scaling, color=YELLOW )
self.play( DrawBorderThenFill( VGroup( tline ) ), run_time = 2 )
self.play( AnimationGroup(Create(t1)), run_time = 6 )
这适用于单调递增的值,但如果结束点自身翻倍,则效果不佳,因为动画在该阶段变得不可见。
有没有办法更改线图以动画移动点而不是描绘一条线?
如果您的参数只是在某些固定值之间移动,您可以采用 this example in the documentation 中的简单方法。
如果您想更好地控制标记在数字线上移动的确切方式,我建议使用 ValueTracker
和 UpdateFromAlphaFunc
动画复制类似的内容,如下所示:
from manim import *
class Example(Scene):
def construct(self):
tline = NumberLine(
x_range=[ 0, 1 ],
length=4,
color=BLUE,
include_numbers=False )
t_parameter = ValueTracker(0)
t_marker = Dot(color=YELLOW).add_updater(
lambda mob: mob.move_to(tline.number_to_point(t_parameter.get_value())),
).update()
self.play( DrawBorderThenFill( VGroup( tline ) ), run_time = 2 )
self.add(t_marker)
self.play(
UpdateFromAlphaFunc(
t_parameter,
lambda mob, alpha: mob.set_value(np.sin(alpha * PI)),
run_time=6
)
)
我想使用 Manim 为数字轴上参数的位置设置动画。我想出了如何使用 ParametricFunction:
将参数的结束位置动画化为一条线from manim import *
import numpy as np
import math
class line( Scene ):
def construct( self ):
tline = NumberLine(
x_range=[ 0, 1 ],
length=4,
color=BLUE,
include_numbers=False )
t1 = ParametricFunction( lambda t: tline.number_to_point(np.sin(t * PI)),
t_range=[0, 1],
scaling=tline.scaling, color=YELLOW )
self.play( DrawBorderThenFill( VGroup( tline ) ), run_time = 2 )
self.play( AnimationGroup(Create(t1)), run_time = 6 )
这适用于单调递增的值,但如果结束点自身翻倍,则效果不佳,因为动画在该阶段变得不可见。
有没有办法更改线图以动画移动点而不是描绘一条线?
如果您的参数只是在某些固定值之间移动,您可以采用 this example in the documentation 中的简单方法。
如果您想更好地控制标记在数字线上移动的确切方式,我建议使用 ValueTracker
和 UpdateFromAlphaFunc
动画复制类似的内容,如下所示:
from manim import *
class Example(Scene):
def construct(self):
tline = NumberLine(
x_range=[ 0, 1 ],
length=4,
color=BLUE,
include_numbers=False )
t_parameter = ValueTracker(0)
t_marker = Dot(color=YELLOW).add_updater(
lambda mob: mob.move_to(tline.number_to_point(t_parameter.get_value())),
).update()
self.play( DrawBorderThenFill( VGroup( tline ) ), run_time = 2 )
self.add(t_marker)
self.play(
UpdateFromAlphaFunc(
t_parameter,
lambda mob, alpha: mob.set_value(np.sin(alpha * PI)),
run_time=6
)
)