Graphs of polar functions: r= a +b*cos( theta / c)

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

Author: learnsharewithdp

I am a mechanical engineer, digital content creator, ,blogger, educator and excited to learn everyday.

Leave a comment