Cycloids

Learn how a circle rolls along a straight line, creating a cycloid, and explore its variations: epicycloid and hypocycloid, formed when they roll along the outside or inside edge of another circle. Roll circles in different configurations to draw various cycloidal curves and visualize the intriguing patterns. Simulate to study the applications of these fascinating curves in multiple fields, including mathematics, physics, and engineering. Perfect for anyone curious about the geometry of rolling circles.

Scenes

Cycloid

cycloid

Epicycloid

epicycloid

Hypocycloid

hypocycloid

Setup

Review the documentation before exploring the scenes; plugins are required to render them. Docs

Create a new Colab notebook at colab.new and run the cells below.

The session will restart to apply changes.

%pip install mscene
import mscene
%mscene -l manim plugins
from mscene.manim import *
from mscene.plugins import *

Cycloids

%%manim -qm Cycloids
class Cycloids(Scene):
    def construct(self):

        radius = 0.8
        length = TAU * radius

        circle_one = Circle(radius=radius, color=ManimColor("#C5C9C7")).rotate(PI / 2)

        circle_two = Circle(radius=3 * radius, color=ManimColor("#C5C9C7")).rotate(
            PI / 2
        )

        line_end = circle_two.get_bottom()
        line_start = line_end + length * LEFT

        line = Line(line_start, line_end, color=ManimColor("#C5C9C7"))

        wheel = Wheel(radius=radius, color=ManimColor("#04D9FF"))

        self.play(GrowFromCenter(wheel))
        self.wait()

        self.play(Create(line), wheel.animate.move(line_start, UP))
        self.bring_to_front(wheel)

        marker = [(1, PI / 2, ManimColor("#6019E3"))]
        self.play(wheel.draw_markers(marker))

        path = wheel.trace_paths(dissipating_time=2)
        self.add(path)

        # rolls along the line
        self.play(wheel.roll(length * RIGHT, run_time=2.5))
        self.wait()

        self.play(ReplacementTransform(line, circle_one))
        self.wait()

        # rolls along the outer edge of circle one
        self.play(wheel.roll(TAU, about=circle_one, run_time=2.5))
        self.wait()

        self.play(ReplacementTransform(circle_one, circle_two))
        self.wait()

        # rolls along the inner edge of circle two
        self.play(wheel.roll(TAU, about=circle_two, run_time=3))
        self.wait(2)
        path.clear_updaters()
        self.remove(path)
        self.play(wheel.undraw_markers())

        self.play(Uncreate(circle_two), wheel.animate.move(ORIGIN))
        self.wait()

        self.play(ShrinkToCenter(wheel))
        self.wait(0.5)