3b1b-manim/old_projects/fc1.py
2019-05-02 20:36:14 -07:00

272 lines
7.8 KiB
Python

from manimlib.imports import *
from old_projects.efvgt import get_confetti_animations
class CrossingOneMillion(TeacherStudentsScene):
def construct(self):
self.increment_count()
self.comment_on_real_milestone()
self.reflect()
def increment_count(self):
number = self.number = Integer(0)
number.move_to(UP, LEFT)
number.scale(3)
self.look_at(number, run_time=0)
confetti_spirils = self.confetti_spirils = list(map(
turn_animation_into_updater,
get_confetti_animations(50)
))
self.add(*confetti_spirils)
self.play(
ChangeDecimalToValue(
number, 10**6,
position_update_func=lambda m: m.move_to(
UP, LEFT
),
rate_func=bezier([0, 0, 0, 1, 1, 1]),
run_time=5,
),
LaggedStartMap(
ApplyMethod, self.get_pi_creatures(),
lambda m: (m.change, "hooray", number),
rate_func=squish_rate_func(smooth, 0, 0.5),
run_time=4,
),
)
self.wait()
def comment_on_real_milestone(self):
number = self.number
remainder = Integer(2**20 - 10**6)
words = TextMobject(
"Just",
"{:,}".format(remainder.number),
"to go \\\\ before the real milestone",
)
self.student_says(
words,
added_anims=[
ApplyMethod(self.teacher.change, "hesitant"),
self.get_student_changes(
"sassy", "speaking", "happy"
),
number.scale, 0.5,
number.center,
number.to_edge, UP,
]
)
self.wait()
self.remove(*self.confetti_spirils)
remainder.replace(words[1])
words.submobjects[1] = remainder
self.play(
ChangeDecimalToValue(number, 2**20, run_time=3),
ChangeDecimalToValue(remainder, 0.1, run_time=3),
self.teacher.change, "pondering", number,
self.get_student_changes(
*["pondering"] * 3,
look_at_arg=number
),
)
self.play(
FadeOut(self.students[1].bubble),
FadeOut(self.students[1].bubble.content),
)
self.wait(2)
def reflect(self):
bubble = ThoughtBubble(
direction=RIGHT,
height=4,
width=7,
)
bubble.pin_to(self.teacher)
q_marks = TexMobject("???")
q_marks.scale(2)
q_marks.set_color_by_gradient(BLUE_D, BLUE_B)
q_marks.next_to(bubble[-1].get_top(), DOWN)
arrow = Vector(0.5 * DOWN, color=WHITE)
arrow.next_to(q_marks, DOWN)
number = self.number
number.generate_target()
number.target.next_to(arrow, DOWN)
self.play(
ShowCreation(
bubble,
rate_func=squish_rate_func(smooth, 0, 0.3)
),
Write(q_marks),
GrowArrow(arrow),
MoveToTarget(number),
run_time=3
)
self.wait()
class ShareWithFriends(PiCreatureScene):
def construct(self):
randy, morty = self.pi_creatures
self.pi_creature_says(
randy,
"Wanna see why \\\\" +
"$1 - \\frac{1}{3} + \\frac{1}{5}" +
"- \\frac{1}{7} + \\cdots = \\frac{\\pi}{4}$?",
target_mode="tease",
added_anims=[morty.look, UP]
)
self.play(morty.change, "maybe", UP)
self.wait()
def create_pi_creatures(self):
randy = Randolph(color=GREEN)
morty = Mortimer(color=RED_E)
randy.to_edge(DOWN).shift(4 * LEFT)
morty.to_edge(DOWN)
return randy, morty
class AllFeaturedCreators(MortyPiCreatureScene):
def construct(self):
morty = self.pi_creature
title = Title("Featured creators")
dots = VGroup(*[Dot(color=WHITE) for x in range(4)])
dots.arrange(DOWN, buff=LARGE_BUFF)
dots.to_edge(LEFT, buff=2)
creators = VGroup(*list(map(TextMobject, [
"Think Twice",
"LeiosOS",
"Welch Labs",
"Infinity plus one",
])))
for creator, dot in zip(creators, dots):
creator.next_to(dot, RIGHT)
dot.save_state()
dot.scale(4)
dot.set_fill(opacity=0)
rects = VGroup(*list(map(SurroundingRectangle, creators)))
rects.set_stroke(WHITE, 2)
rects.set_fill(BLUE_E, 1)
think_words = VGroup(*list(map(TextMobject, [
"(thinks visually)",
"(thinks in terms of communities)",
"(thinks in terms of series)",
"(thinks playfully)",
])))
for word, creator in zip(think_words, creators):
# word.move_to(creator, RIGHT)
# word.align_to(RIGHT, LEFT)
word.next_to(creator, RIGHT)
word.set_color(YELLOW)
self.play(
morty.change, "raise_right_hand",
Write(title)
)
self.wait()
self.play(LaggedStartMap(
ApplyMethod, dots,
lambda m: (m.restore,)
))
self.play(
LaggedStartMap(FadeIn, rects, lag_ratio=0.7),
morty.change, "happy"
)
self.add(creators, rects)
self.wait()
modes = ["hooray", "tease", "raise_right_hand", "hooray"]
for rect, word, mode in zip(rects, think_words, modes):
self.play(
self.get_rect_removal(rect),
morty.change, mode,
)
self.wait()
self.play(Write(word))
self.wait()
self.add(think_words)
def get_rect_removal(self, rect):
rect.generate_target()
rect.target.stretch(0, 0, about_edge=LEFT)
rect.target.set_stroke(width=0)
return MoveToTarget(rect)
class GeneralWrapper(Scene):
CONFIG = {
"title_text": ""
}
def construct(self):
title = TextMobject(self.title_text)
title.to_edge(UP)
rect = ScreenRectangle(height=6.5)
rect.next_to(title, DOWN)
self.play(Write(title), ShowCreation(rect))
self.wait()
class ThinkTwiceWrapper(GeneralWrapper):
CONFIG = {"title_text": "Think Twice"}
class LeiosOSWrapper(GeneralWrapper):
CONFIG = {"title_text": "LeiosOS"}
class WelchLabsWrapper(GeneralWrapper):
CONFIG = {"title_text": "Welch Labs"}
class InfinityPlusOneWrapper(GeneralWrapper):
CONFIG = {"title_text": "Infinity Plus One"}
class EndScreen(PiCreatureScene):
CONFIG = {
"seconds_to_blink": 3,
}
def construct(self):
words = TextMobject("Clicky stuffs")
words.scale(1.5)
words.next_to(self.pi_creature, UP)
words.to_edge(UP)
self.play(
FadeIn(
words,
run_time=2,
lag_ratio=0.5
),
self.pi_creature.change_mode, "hooray"
)
self.wait()
mode_point_pairs = [
("raise_left_hand", 5 * LEFT + 3 * UP),
("raise_right_hand", 5 * RIGHT + 3 * UP),
("thinking", 5 * LEFT + 2 * DOWN),
("thinking", 5 * RIGHT + 2 * DOWN),
("thinking", 5 * RIGHT + 2 * DOWN),
("happy", 5 * LEFT + 3 * UP),
("raise_right_hand", 5 * RIGHT + 3 * UP),
]
for mode, point in mode_point_pairs:
self.play(self.pi_creature.change, mode, point)
self.wait()
self.wait(3)
def create_pi_creature(self):
self.pi_creature = Randolph()
self.pi_creature.shift(2 * DOWN + 1.5 * LEFT)
return self.pi_creature