首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >manim轴变焦

manim轴变焦
EN

Stack Overflow用户
提问于 2022-04-13 16:34:05
回答 1查看 243关注 0票数 1

假设我们有一个Axes对象和一个由这些轴定义的坐标系中绘制的图形。

是否有可能“放大”一个或两个轴,以便我们可以看到更多的图形,而在屏幕上的坐标系统的尺寸保持不变?

例如,我尝试将ValueTracker用于Axesgraphx_range属性,但是它会产生奇怪和意外的结果。

代码语言:javascript
复制
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_updaterbecome

EN

回答 1

Stack Overflow用户

发布于 2022-04-13 16:56:15

目前,不幸的是,Axes不支持您想要使用的重新标度。实现这类行为的最简单方法可能是实现一个自定义动画,该动画使用become反复更新轴和任何曲线。

至于你的第二个问题:Axes总是以这样一种方式绘制的,即目标物体的中心位于场景原点。您可以将它们移动到您想要显示它们的位置,并且只有在移动之后才会显示add

更新

.become创建了一个新的mobject,是的,但随后只将新mobject的一些属性和属性传递给原始mobject。如果您需要更新某些属性,最好是自己在方法中更新它们--这也是为什么使用通用更新函数比使用always_redraw更灵活。

为了将来的参考:一定要马上说出您是在使用manim还是manimgl,它们在某些方面有很大的不同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71860928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档