Watch this animation first.
The manim code to generate the above animation is given below:
class ValueSliderLine(VMobject): def __init__(self,variable='x',range=[-5,5,1],tracker=ValueTracker(0), **kwargs): super().__init__(**kwargs) self.number_line = NumberLine( x_range=range, length=5, color=BLUE, include_numbers=True, ).scale(0.75) self.pointer = Dot(point=self.number_line.n2p(tracker.get_value()),radius=0.08) self.label = MathTex(variable).add_updater(lambda m: m.next_to(self.pointer, UP)).scale(0.8) self.tracker = tracker self.pointer.add_updater( lambda m: m.move_to(self.number_line.n2p(self.tracker.get_value())) ) self.Value_slider = VGroup(self.label, self.number_line,self.pointer)
class PolarPlane_WithSettings(VMobject): def __init__(self, radius=2, **kwargs): super().__init__(**kwargs) self.radius = radius * 1.125 background_line_style = { "stroke_color": BLUE_E, "stroke_width": 0.5, "stroke_opacity": 1, } self.plane = PolarPlane(radius_max=self.radius, size=self.radius * 2, azimuth_units="degrees", azimuth_step=12, background_line_style=background_line_style ).add_coordinates() ax = self.plane.get_axes() ax.set_stroke(color=WHITE, width=0.5)
class a_plus_b_cos_c_theta(Scene): """Animate r= a cos(b*theta) in polar coordinates""" def construct(self): r_color = YELLOW a = 1 b = 2 c = 3 a_value_tracker = ValueTracker(a) b_value_tracker = ValueTracker(b) c_value_tracker = ValueTracker(1) def period(c): return abs(c*TAU) polar_plane = PolarPlane_WithSettings(radius=a+b).plane ftext = MathTex("r=a+b\\cos(\\theta/c)").next_to(polar_plane, UP,buff=0.05) func = lambda t: polar_plane.polar_to_point(a+b * np.cos(t/c), t) graph = ParametricFunction(func, t_range=[0, period(c)], color=r_color) def graph_update_fun(x): if (c_value_tracker.get_value()).is_integer() and (c_value_tracker.get_value() != 0): x.become(ParametricFunction(lambda t: polar_plane.polar_to_point(a_value_tracker.get_value()+ b_value_tracker.get_value() * np.cos(t/int(c_value_tracker.get_value())), t), t_range=[0, period(int(c_value_tracker.get_value()))], color=r_color)) graph.add_updater(graph_update_fun) graph_group=VGroup(polar_plane,ftext,graph) graph_group.shift(LEFT*2) a_slider = ValueSliderLine(variable='a', range=[-a, a, 1], tracker=a_value_tracker) b_slider = ValueSliderLine(variable='b', range=[-b, b, 1], tracker=b_value_tracker) c_slider = ValueSliderLine(variable='c', range=[1, c, 1], tracker=c_value_tracker) slider_group=VGroup(a_slider.Value_slider,b_slider.Value_slider, c_slider.Value_slider).arrange(DOWN,buff=1.0).next_to(graph_group,RIGHT,buff=1.0) scene_group=VGroup(graph_group,slider_group) scene_group.scale(0.75) self.play(Create(polar_plane)) self.play(Create(ftext)) self.wait() self.play(Create(slider_group)) self.play(Create(graph)) self.play(slider_group[0].animate.scale(1.2)) self.play(a_value_tracker.animate.set_value(-a), run_time=2, rate_functions=linear) self.play(a_value_tracker.animate.set_value(a), run_time=1, rate_functions=linear) self.play(slider_group[0].animate.scale(1.0 / 1.2)) self.play(slider_group[1].animate.scale(1.2)) self.play(b_value_tracker.animate.set_value(-b), run_time=2, rate_functions=linear) self.play(b_value_tracker.animate.set_value(b), run_time=1, rate_functions=linear) self.play(slider_group[1].animate.scale(1.0 / 1.2)) self.wait() c_val=c_value_tracker.get_value() c_inc=1 while c_val