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
直到 Create
d 才更新)不会更新。
您可以通过添加
来解决问题
tangent_begin_x2_RED_2.update()
在创建割线组的 self.play
调用之前。
我正在做一个关于衍生品的学校项目,我遇到了一个问题。我尝试通过点 (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
直到 Create
d 才更新)不会更新。
您可以通过添加
来解决问题tangent_begin_x2_RED_2.update()
在创建割线组的 self.play
调用之前。