Demo: CopyAtBasicDemo
# Code not found for CopyAtBasicDemo
Demo: CopyAtParallelogramComparisonDemo
# Code not found for CopyAtParallelogramComparisonDemo
Demo: CopyAtParallelogramDemo
# Code not found for CopyAtParallelogramDemo
Dynamic parallel line following reference line
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()
Dynamic perpendicular with always_redraw()
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()
Demo: ExtendedLineBasicDemo
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)
Demo: ExtendedLineDiagonalDemo
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)
Demo: ExtendedLineDynamicDemo
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)
Demo: ExtendedLinePolygonDemo
# 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)
Demo: ExtendedLineRotatingDemo
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)
Demo: FourDirectionsDemo
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)
Basic parallel line construction
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)
Dynamic parallelogram construction
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()
Basic perpendicular line construction
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)