我怎样才能只改变 theta 来旋转线?

how can I rotate line with only changing theta?

我是用manim做动画的,我试着做一端固定,一端沿弧线移动的线。我想解决这个问题的方法是用theta定义每个点,让点随着弧线的移动而移动。但是即使改了setta,线也没有动,所以用了rotate,但是线的长度没有变,所以线偏离了圆弧,失败了。我想知道当以theta为参数将theta值更改为任意值时,如何使线随着角度的大小平滑移动。

from manim import *
import numpy as np

class RotateVector(Scene):
    def construct(self):
        theta = 1/9*np.pi
        semicircle = Arc(angle=PI, radius=4, stroke_color = GREY, arc_center=np.array([0, -1.5, 0]))
        bottom_line = Line(start=np.array([-4.0,-1.5,0]), end=np.array([4.0,-1.5,0]), stroke_color = GREY)
        
        dot_A = np.array([-4.0,-1.5,0])
        dot_A_text = Text('A', font_size=35).next_to(dot_A, LEFT+DOWN, buff=0.05)
        dot_P = np.array([4*np.cos(theta*2),4*np.sin(theta*2)-1.5,0])
        dot_P_text = Text('P', font_size=35).next_to(dot_P, RIGHT+UP, buff=0.05)

        line_AP = Line(start=np.array([-4.0,-1.5,0]), end=np.array([4*np.cos(2*theta),4*np.sin(2*theta)-1.5,0]), stroke_color = GREY)

        self.play(Create(semicircle), Create(bottom_line), Create(dot_A_text))
        self.play(Create(line_AP), Create(dot_P_text))
        self.wait(3)

你的 mobjects 没有改变,因为在初始化 mobject 后没有保留对 Theta 的依赖 - 但它不需要太多就可以工作!

你的问题的解决方案是使用 ValueTracker 作为 theta 的值(以轻松地允许动画更改它)和你想要更改的 mobjects 的更新程序功能。换句话说:

theta_vt = ValueTracker(theta)

dot_P_text.add_updater(lambda mobj: mobj.next_to([4*np.cos(theta_vt.get_value()*2),4*np.sin(theta_vt.get_value()*2)-1.5,0]))
line_AP.add_updater(lambda mobj: mobj.put_start_and_end_on([-4, 1.5, 0], [4*np.cos(theta_vt.get_value()*2),4*np.sin(theta_vt.get_value()*2)-1.5,0]))

self.play(theta_vt.animate.set_value(2*PI))

您甚至可以避免使用价值跟踪器并使用辅助(空)mobject 进行定位:

P = Mobject().move_to([4*np.cos(theta*2),4*np.sin(theta*2)-1.5,0])

然后更改更新器以使用 P 的位置而不是 theta,并使点沿所需的弧线移动。 (这一点实际上是变得稍微复杂一点,而更新程序简化了一点。)