Manim 在绘制的图形上画了一条错误的线

Manim draws a wrong line on a plotted graph

我正在做一个关于衍生品的学校项目,我遇到了一个问题。我尝试通过点 (2,4) 和 (2+dx, f(2+dx)) 为 f(x)=x^2 画一条割线。出于某种原因,manim 首先绘制线 tangent 到 (2,4) 并在一帧中自动更正以通过 (2,4) 和 (2+dx, f(2 +x)),例如:https://youtu.be/CDa7MdDdIT0.

我已经隔离了对此负责的线路,但我无法弄清楚出了什么问题。代码:

class TestingField(Scene):
def construct(self):
######## Definitions
    dx=ValueTracker(0.001)

    axes_begin=Axes(x_range=[-8,8,1], y_range=[-12,30, 3], x_length=10, y_length=10, tips=False)
    graph_begin=axes_begin.plot(lambda x: x**2, x_range=[-6,6], color=GREEN)

    ####Tangents to x^2
    tangent_begin_x2_RED=always_redraw(
    lambda: axes_begin.get_secant_slope_group(
    x=2,
    graph=graph_begin,
    dx=dx.get_value(),
    secant_line_color=RED,
    secant_line_length=15,
    dx_line_color=BLACK,
    dy_line_color=BLACK)
    )

    tangent_begin_x2_RED_2=always_redraw(
    lambda: axes_begin.get_secant_slope_group(
    x=2,
    graph=graph_begin,
    dx=dx.get_value(),
    secant_line_color=RED,
    secant_line_length=15,
    dx_line_color=YELLOW,
    dy_line_color=PURPLE)
    )

    tangent_begin_point_x2_1=always_redraw(
    lambda: Dot()
    .move_to(axes_begin.c2p(2+dx.get_value(), graph_begin.underlying_function(2+dx.get_value())))
    )

    tangent_begin_point_x2_2=always_redraw(
    lambda: Dot()
    .move_to(axes_begin.c2p(2, graph_begin.underlying_function(2)))
    )



######## Animation
    self.add(axes_begin, graph_begin, tangent_begin_point_x2_1, tangent_begin_point_x2_2,tangent_begin_x2_RED)

    self.wait(1)

    self.play(Uncreate(tangent_begin_x2_RED))
    self.play(dx.animate.set_value(1))

    self.play(Create(tangent_begin_x2_RED_2), run_time=2)

    self.play(dx.animate.set_value(0.7))
    self.play(dx.animate.set_value(0.3))
    self.play(dx.animate.set_value(1))

和渲染:

manim -pqh wstep.py TestingField

有人可以指出导致问题的原因吗?

您 运行 遇到的问题是 always_redraw 基本上创建了一个附有更新程序函数的对象。具有更新程序但尚未添加到场景中的对象(在您的情况下 tangent_begin_x2_RED_2 直到 Created 才更新)不会更新。

您可以通过添加

来解决问题
tangent_begin_x2_RED_2.update()

在创建割线组的 self.play 调用之前。