GitHub →
← Back

Geometry Demos

Perpendicular and parallel line construction utilities

CopyAtBasicDemo

Demo: CopyAtBasicDemo

Preview
CopyAtBasicDemo preview
Video
Code Example
# Code not found for CopyAtBasicDemo

CopyAtParallelogramComparisonDemo

Demo: CopyAtParallelogramComparisonDemo

Preview
CopyAtParallelogramComparisonDemo preview
Video
Code Example
# Code not found for CopyAtParallelogramComparisonDemo

CopyAtParallelogramDemo

Demo: CopyAtParallelogramDemo

Preview
CopyAtParallelogramDemo preview
Video
Code Example
# Code not found for CopyAtParallelogramDemo

DynamicParallelExample

Dynamic parallel line following reference line

Preview
DynamicParallelExample preview
Video
Code Example
ref_line = Line(LEFT * 2 + UP, RIGHT * 2 + UP, color=BLUE)
parallel_dot = Dot(DOWN * 0.5, color=YELLOW)

parallel_line = always_redraw(
    lambda: parallel(ref_line, parallel_dot, length=4, placement="mid").set_color(GREEN)
)

self.play(Create(ref_line))
self.play(FadeIn(parallel_dot))
self.play(Create(parallel_line))
self.wait()

self.play(ref_line.animate.shift(DOWN * 2), run_time=2)
self.wait()

self.play(Rotate(ref_line, angle=PI/4), run_time=2)
self.wait()

self.play(
    ref_line.animate.shift(UP * 2),
    Rotate(ref_line, angle=-PI/4),
    run_time=2
)
self.wait()

DynamicPerpExample

Dynamic perpendicular with always_redraw()

Preview
DynamicPerpExample preview
Video
Code Example
base_line = Line(LEFT * 2, RIGHT * 2, color=BLUE)
center_dot = Dot(ORIGIN, color=YELLOW)

perp_line = always_redraw(
    lambda: perp(base_line, center_dot, length=3, placement="mid").set_color(RED)
)

self.play(Create(base_line))
self.play(FadeIn(center_dot))
self.play(Create(perp_line))
self.wait()

self.play(Rotate(base_line, angle=PI/3, about_point=ORIGIN), run_time=3)
self.wait()

self.play(Rotate(base_line, angle=-PI/3, about_point=ORIGIN), run_time=3)
self.wait()

ExtendedLineBasicDemo

Demo: ExtendedLineBasicDemo

Preview
ExtendedLineBasicDemo preview
Video
Code Example
base_line = Line(LEFT * 3, RIGHT * 3, color=BLUE)
self.play(Create(base_line))
self.wait(0.5)

# Extend from start (proportion=0.0)
ext_start = extended_line(base_line, proportion=0.0, length=1.5).set_color(RED)
self.play(Create(ext_start))
self.wait(0.5)

# Extend from midpoint (proportion=0.5)
ext_mid = extended_line(base_line, proportion=0.5, length=1.5).set_color(GREEN)
self.play(Create(ext_mid))
self.wait(0.5)

# Extend from end (proportion=1.0)
ext_end = extended_line(base_line, proportion=1.0, length=1.5).set_color(YELLOW)
self.play(Create(ext_end))
self.wait(2)

ExtendedLineDiagonalDemo

Demo: ExtendedLineDiagonalDemo

Preview
ExtendedLineDiagonalDemo preview
Video
Code Example
base_line = Line(LEFT * 2 + DOWN, RIGHT * 2 + UP, color=BLUE)
self.play(Create(base_line))
self.wait(0.5)

proportions = [0.0, 0.33, 0.67, 1.0]
colors = [RED, ORANGE, YELLOW, GREEN]

ext_lines = VGroup()
for prop, color in zip(proportions, colors):
    ext = extended_line(base_line, proportion=prop, length=1.2).set_color(color)
    ext_lines.add(ext)

self.play(LaggedStart(*[Create(line) for line in ext_lines], lag_ratio=0.4))
self.wait(2)

ExtendedLineDynamicDemo

Demo: ExtendedLineDynamicDemo

Preview
ExtendedLineDynamicDemo preview
Video
Code Example
base_line = Line(LEFT * 2, RIGHT * 2, color=BLUE)
t_tracker = ValueTracker(0.0)

ext_line = always_redraw(
    lambda: extended_line(
        base_line,
        proportion=t_tracker.get_value(),
        length=1.5
    ).set_color(RED)
)

self.play(Create(base_line))
self.add(ext_line)
self.wait(0.5)

self.play(t_tracker.animate.set_value(0.5), run_time=2)
self.wait(0.5)

self.play(t_tracker.animate.set_value(1.0), run_time=2)
self.wait(0.5)

self.play(t_tracker.animate.set_value(0.0), run_time=3)
self.wait(2)

ExtendedLinePolygonDemo

Demo: ExtendedLinePolygonDemo

Preview
ExtendedLinePolygonDemo preview
Video
Code Example
# Create a triangle
triangle = Polygon(
    LEFT * 2 + DOWN,
    RIGHT * 2 + DOWN,
    UP * 2,
    color=BLUE
)
self.play(Create(triangle))
self.wait(0.5)

# Get the three sides as lines
vertices = triangle.get_vertices()
side1 = Line(vertices[0], vertices[1], color=BLUE)
side2 = Line(vertices[1], vertices[2], color=BLUE)
side3 = Line(vertices[2], vertices[0], color=BLUE)

# Extend each side outward from both ends
ext1_start = extended_line(side1, proportion=0.0, length=1.0).set_color(RED)
ext1_end = extended_line(side1, proportion=1.0, length=1.0).set_color(RED)

ext2_start = extended_line(side2, proportion=0.0, length=1.0).set_color(RED)
ext2_end = extended_line(side2, proportion=1.0, length=1.0).set_color(RED)

ext3_start = extended_line(side3, proportion=0.0, length=1.0).set_color(RED)
ext3_end = extended_line(side3, proportion=1.0, length=1.0).set_color(RED)

extensions = VGroup(ext1_start, ext1_end, ext2_start, ext2_end, ext3_start, ext3_end)

self.play(LaggedStart(*[Create(ext) for ext in extensions], lag_ratio=0.2))
self.wait(2)

ExtendedLineRotatingDemo

Demo: ExtendedLineRotatingDemo

Preview
ExtendedLineRotatingDemo preview
Video
Code Example
base_line = Line(LEFT * 2, RIGHT * 2, color=BLUE)

ext_line = always_redraw(
    lambda: extended_line(base_line, proportion=1.0, length=1.5).set_color(GREEN)
)

self.play(Create(base_line))
self.add(ext_line)
self.wait(0.5)

self.play(Rotate(base_line, angle=PI, about_point=ORIGIN), run_time=4)
self.wait(0.5)

self.play(Rotate(base_line, angle=-PI, about_point=ORIGIN), run_time=4)
self.wait(2)

FourDirectionsDemo

Demo: FourDirectionsDemo

Preview
FourDirectionsDemo preview
Video
Code Example
source = Arrow(LEFT * 0.5, RIGHT * 0.5, color=YELLOW, buff=0)
self.play(GrowArrow(source))
self.wait()

distance = 1.5

forward = VectorUtils.forward(source, distance).set_color(GREEN)
backward = VectorUtils.backward(source, distance).set_color(ORANGE)
perp_up = VectorUtils.perp_move(source, distance).set_color(BLUE)
perp_down = VectorUtils.perp_move(source, -distance).set_color(RED)

self.play(TransformFromCopy(source, forward), run_time=1)
self.wait(0.3)
self.play(TransformFromCopy(source, backward), run_time=1)
self.wait(0.3)
self.play(TransformFromCopy(source, perp_up), run_time=1)
self.wait(0.3)
self.play(TransformFromCopy(source, perp_down), run_time=1)
self.wait(2)

ParallelDemo

Basic parallel line construction

Preview
ParallelDemo preview
Video
Code Example
ref_line = Line(LEFT + DOWN, RIGHT + UP, color=BLUE)
dot = Dot(UP * 2, color=RED)
parallel_line = parallel(ref_line, dot, length=3.0, placement="mid").set_color(YELLOW)

self.play(Create(ref_line))
self.play(Create(dot))
self.play(Create(parallel_line))
self.wait(2)

ParallelogramUpdater

Dynamic parallelogram construction

Preview
ParallelogramUpdater preview
Video
Code Example
base = Line(LEFT * 2 + DOWN, RIGHT * 2 + DOWN, color=BLUE)
top_left_dot = Dot(LEFT * 1.5 + UP, color=YELLOW)

side = always_redraw(
    lambda: Line(base.get_start(), top_left_dot.get_center(), color=BLUE)
)

top = always_redraw(
    lambda: parallel(
        base, top_left_dot,
        length=base.get_length(),
        placement="start"
    ).set_color(GREEN)
)

top_right_dot = always_redraw(lambda: Dot(top.get_end(), color=YELLOW))

right_side = always_redraw(
    lambda: parallel(
        side, top_right_dot,
        length=side.get_length(),
        placement="end"
    ).set_color(GREEN)
)

self.play(Create(base))
self.play(FadeIn(top_left_dot))
self.add(side, top, right_side)
self.wait()

self.play(top_left_dot.animate.move_to(LEFT * 2.5 + UP * 2), run_time=3)
self.wait()

self.play(top_left_dot.animate.move_to(LEFT * 0.5 + UP * 0.5), run_time=3)
self.wait()

self.play(top_left_dot.animate.move_to(LEFT * 1.5 + UP), run_time=2)
self.wait()

PerpDemo

Basic perpendicular line construction

Preview
PerpDemo preview
Video
Code Example
ref_line = Line(LEFT * 3, RIGHT * 3, color=BLUE)

# Mid placement
dot_mid = Dot(ORIGIN, color=RED)
perp_mid = perp(ref_line, dot_mid, length=2.0, placement="mid").set_color(RED)

# Start placement
dot_start = Dot(UP * 1.5, color=GREEN)
perp_start = perp(ref_line, dot_start, length=2.0, placement="start").set_color(GREEN)

# End placement
dot_end = Dot(DOWN * 1.5, color=YELLOW)
perp_end = perp(ref_line, dot_end, length=2.0, placement="end").set_color(YELLOW)

self.play(Create(ref_line))
self.wait(0.5)

self.play(Create(dot_mid), Create(perp_mid))
self.wait(0.5)

self.play(Create(dot_start), Create(perp_start))
self.wait(0.5)

self.play(Create(dot_end), Create(perp_end))
self.wait(1)