-
Notifications
You must be signed in to change notification settings - Fork 0
/
slide3.py
123 lines (98 loc) · 5.5 KB
/
slide3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
from gruvbox_manim import gruvbox
from manim import *
import numpy as np
from utils import *
from manim_revealjs import PresentationScene
class Slide3(PresentationScene):
def construct(self):
title = Tex(r"What about the area?", color = gruvbox.PRIMARY).scale(2)
self.add(title)
circle = Circle(color=gruvbox.FG, fill_color=gruvbox.SECONDARY, fill_opacity=0.75, stroke_width=3, radius=1).scale(2)
self.play(title.animate.to_edge(UP, buff=0.5))
self.play(DrawBorderThenFill(circle))
self.end_fragment()
n = 8
sectors = sector_dissect_circle(circle, n, stroke_width=2).set_opacity(0)
dissection = dissect_circle(circle, n, stroke_width=2)
self.play(draw_dissection(dissection))
self.add(sectors)
self.play(sectors.animate.set_opacity(1), circle.animate.set_opacity(0))
self.remove(*dissection)
self.end_fragment()
group = VGroup(circle, sectors)
laid_sectors = sectors.copy()
dtheta = TAU/n
angles = np.arange(0, TAU, dtheta)
for sector, angle in zip(laid_sectors, angles):
sector.rotate(-90*DEGREES - angle - dtheta/2, about_point=circle.get_center())
laid_sectors.arrange(RIGHT, buff=0, aligned_edge=DOWN)
laid_sectors.scale(0.5).to_edge(RIGHT, buff=0.75)
self.play(group.animate.to_edge(LEFT, buff=1))
self.play(TransformFromCopy(sectors, laid_sectors), run_time=2)
lh, rh = VGroup(*laid_sectors[:n // 2]), VGroup(*laid_sectors[n // 2:])
d = circle.get_width()*(1-np.cos(PI/n))/8
lh.generate_target()
rh.generate_target()
rh.target.rotate(PI).shift(lh.get_width()*LEFT/2)
lh.target.move_to(rh.target).shift(LEFT*rh[0].get_width()/2 + (0.5 + d)*DOWN)
rh.target.shift((0.5 + d)*UP)
self.play(MoveToTarget(lh), MoveToTarget(rh, path_arc=PI), run_time=2)
self.wait(0.5)
self.play(lh.animate.shift(0.5*UP), rh.animate.shift(0.5*DOWN))
rectangle = VGroup(lh, rh)
self.play(rectangle.animate.scale(2))
self.end_fragment()
for n in [16, 32, 64, 128, 256, 512, 1024]:
new_sectors = sector_dissect_circle(circle, n, stroke_width=16/n)
laid_sectors = new_sectors.copy()
dtheta = TAU/n
angles = np.arange(0, TAU, dtheta)
for sector, angle in zip(laid_sectors, angles):
sector.rotate(-90*DEGREES - angle - dtheta/2, about_point=circle.get_center())
laid_sectors.scale(0.5).arrange(RIGHT, buff=0, aligned_edge=DOWN)
laid_sectors.to_edge(RIGHT, buff=0.75)
next_lh, next_rh = VGroup(*laid_sectors[:n // 2]), VGroup(*laid_sectors[n // 2:])
d = circle.get_width()*(1-np.cos(PI/n))/8
next_rh.rotate(PI).shift(next_lh.get_width()*LEFT/2)
next_lh.move_to(next_rh).shift(LEFT*next_rh[0].get_width()/2 + (d*DOWN))
next_rh.shift(d*UP)
VGroup(next_lh, next_rh).scale(2)
self.play(Transform(sectors, new_sectors), Transform(lh, next_lh), Transform(rh, next_rh))
self.wait(0.5)
if n in [16, 32, 64]:
self.end_fragment()
rectangle = VGroup(lh, rh)
next_rectangle = Rectangle(width=PI*circle.get_width()/2, height=circle.get_width()/2, fill_color=darken_color(gruvbox.SECONDARY, 0.1), fill_opacity=1, stroke_width=0).move_to(rectangle)
circle.set_fill(color=darken_color(gruvbox.SECONDARY, 0.1)).set_stroke(width=0)
self.play(FadeTransform(rectangle, next_rectangle), sectors.animate.set_opacity(0), circle.animate.set_opacity(1))
rectangle = next_rectangle
self.end_fragment()
base = Line(rectangle.get_corner(DL), rectangle.get_corner(DR), color=gruvbox.PRIMARY, stroke_width=4)
self.play(Create(base))
self.wait(0.5)
halfcircle = ArcBetweenPoints(circle.get_left(), circle.get_right(), angle=-PI, color=gruvbox.PRIMARY, stroke_width=4)
self.play(TransformFromCopy(base, halfcircle), run_time=1.5)
self.wait(0.5)
base_text = Tex(r"$\pi r$", color=gruvbox.PRIMARY).next_to(base, DOWN, buff=0.3)
self.play(Write(base_text))
self.end_fragment()
height = Line(rectangle.get_corner(UL), rectangle.get_corner(DL), color=gruvbox.PRIMARY, stroke_width=4)
self.play(Create(height), FadeOut(halfcircle))
self.wait(0.5)
radius = Line(circle.get_center(), circle.get_right(), color=gruvbox.PRIMARY, stroke_width=4)
self.play(TransformFromCopy(height, radius))
self.wait(0.5)
height_text = Tex(r"$r$", color=gruvbox.PRIMARY).next_to(height, LEFT, buff=0.3)
self.play(Write(height_text))
self.end_fragment()
formula = Tex(r"$A = r \cdot \pi r = \pi r^2$", color=gruvbox.CYAN).to_edge(DOWN, buff=1)
formula2 = Tex(r"$A = \pi r^2$", color=gruvbox.CYAN).move_to(formula)
self.play(FadeOut(radius), Write(formula[0][:2]), TransformFromCopy(height_text, formula[0][2]), Write(formula[0][3]), TransformFromCopy(base_text, formula[0][4:6]))
self.end_fragment()
self.play(Write(formula[0][6:]))
self.wait(0.5)
self.play(Transform(formula[0][:2], formula2[0][:2]), Transform(formula[0][7:], formula2[0][2:]), FadeOut(formula[0][2:7]))
self.end_fragment()
area_text = Tex("$\\pi r^2$", color=gruvbox.FG).scale(2).move_to(circle)
self.play(TransformFromCopy(formula[0][7:], area_text))
self.end_fragment()