假设我们有一个Axes对象和一个由这些轴定义的坐标系中绘制的图形。
是否有可能“放大”一个或两个轴,以便我们可以看到更多的图形,而在屏幕上的坐标系统的尺寸保持不变?
例如,我尝试将ValueTracker用于Axes和graph的x_range属性,但是它会产生奇怪和意外的结果。
class Test(Scene):
def construct(self):
x_max_tracker = ValueTracker(0.0)
axes = always_redraw(lambda: Axes(
(-np.pi, x_max_tracker.get_value(), 0.5), (-5., 5.),
width=8, height=10
))
xsin_graph = always_redraw(
lambda: axes.get_graph(
lambda x: 0.5*x*np.sin(x)-1, color=BLUE,
x_range=[-np.pi, x_max_tracker.get_value()]
)
)
self.play(
Write(axes, lag_ratio=0.01, run_time=1), ShowCreation(xsin_graph)
)
self.wait(2)
self.play(x_max_tracker.animate.set_value(4*np.pi), run_time=2)附加的,但有关联的问题:是否有可能给出坐标系统(Axes)的起始位置?
更新
我已经定义了一个方法generate_axes(),它: 1)生成Axes对象;2)将它放置在Scene上指定的坐标处。
现在,如果我在这个always_redraw方法上调用generate_axes()方法(将x_tracker从上面的代码中保留以控制x_range),那么我可以通过调用play(x_tracker.animate.set_value(X))获得很好的“放大/在”动画。
但是,这并没有改变axes变量,很明显,它仍然将指针保存在第一个初始Axes对象上,而没有修改x_range。我认为always_redraw()在每个帧上都创建了一个新的mobject?不知怎么的,这个更新的对象被传输到要显示的Scene中,但是不能被访问!例如,如果在动画结束后打印axes.x_range,我将得到初始的x_range值。
P.S.:我使用的是manimgl包,所以always_redraw方法可能不是来自标准的manim包。但是它通常是带有add_updater的become
发布于 2022-04-13 16:56:15
目前,不幸的是,Axes不支持您想要使用的重新标度。实现这类行为的最简单方法可能是实现一个自定义动画,该动画使用become反复更新轴和任何曲线。
至于你的第二个问题:Axes总是以这样一种方式绘制的,即目标物体的中心位于场景原点。您可以将它们移动到您想要显示它们的位置,并且只有在移动之后才会显示add。
更新
.become创建了一个新的mobject,是的,但随后只将新mobject的一些属性和属性传递给原始mobject。如果您需要更新某些属性,最好是自己在方法中更新它们--这也是为什么使用通用更新函数比使用always_redraw更灵活。
为了将来的参考:一定要马上说出您是在使用manim还是manimgl,它们在某些方面有很大的不同。
https://stackoverflow.com/questions/71860928
复制相似问题