Beginning Leibniz project

This commit is contained in:
Grant Sanderson 2017-05-09 14:54:58 -07:00
parent f3eb43f96f
commit 58d329e8b3
3 changed files with 214 additions and 3 deletions

197
leibniz.py Normal file
View file

@ -0,0 +1,197 @@
from helpers import *
from mobject.tex_mobject import TexMobject
from mobject import Mobject
from mobject.image_mobject import ImageMobject
from mobject.vectorized_mobject import *
from animation.animation import Animation
from animation.transform import *
from animation.simple_animations import *
from animation.playground import *
from topics.geometry import *
from topics.characters import *
from topics.functions import *
from topics.fractals import *
from topics.number_line import *
from topics.combinatorics import *
from topics.numerals import *
from topics.three_dimensions import *
from topics.objects import *
from topics.complex_numbers import *
from scene import Scene
from scene.reconfigurable_scene import ReconfigurableScene
from scene.zoomed_scene import *
from camera import Camera
from mobject.svg_mobject import *
from mobject.tex_mobject import *
# revert_to_original_skipping_status
class Introduction(PiCreatureScene):
def construct(self):
self.introduce_three_objects()
self.show_screen()
def introduce_three_objects(self):
primes = self.get_primes()
primes.to_corner(UP+RIGHT)
primes.shift(DOWN)
plane = self.get_complex_numbers()
plane.shift(2*LEFT)
pi_group = self.get_pi_group()
pi_group.next_to(primes, DOWN, buff = MED_LARGE_BUFF)
pi_group.shift_onto_screen()
morty = self.get_primary_pi_creature()
video = VideoIcon()
video.highlight(TEAL)
video.next_to(morty.get_corner(UP+LEFT), UP)
self.play(
morty.change_mode, "raise_right_hand",
DrawBorderThenFill(video)
)
self.dither()
self.play(
Write(primes, run_time = 2),
morty.change_mode, "happy",
video.scale_to_fit_height, 2*SPACE_WIDTH,
video.center,
video.set_fill, None, 0
)
self.dither()
self.play(
Write(plane, run_time = 2),
morty.change, "raise_right_hand"
)
self.dither()
self.remove(morty)
morty = morty.copy()
self.add(morty)
self.play(
ReplacementTransform(
morty.body,
pi_group.get_part_by_tex("pi"),
run_time = 1
),
FadeOut(VGroup(morty.eyes, morty.mouth)),
Write(VGroup(*pi_group[1:]))
)
self.dither(2)
self.play(
plane.scale_to_fit_width, pi_group.get_width(),
plane.next_to, pi_group, DOWN, MED_LARGE_BUFF
)
def show_screen(self):
screen = ScreenRectangle(height = 4.3)
screen.to_edge(LEFT)
titles = VGroup(
TextMobject("From zeta video"),
TextMobject("Coming up")
)
for title in titles:
title.next_to(screen, UP)
title.highlight(YELLOW)
self.play(
ShowCreation(screen),
FadeIn(titles[0])
)
self.show_frame()
self.dither(2)
self.play(Transform(*titles))
self.dither(3)
def get_primes(self):
return TexMobject("2, 3, 5, 7, 11, 13, \\dots")
def get_complex_numbers(self):
plane = ComplexPlane(
x_radius = 3,
y_radius = 2.5,
)
plane.add_coordinates()
point = plane.number_to_point(complex(1, 2))
dot = Dot(point, color = YELLOW)
label = TexMobject("1 + 2i")
label.add_background_rectangle()
label.next_to(dot, UP+RIGHT, buff = SMALL_BUFF)
label.highlight(YELLOW)
plane.label = label
plane.add(dot, label)
return plane
def get_pi_group(self):
result = TexMobject("\\pi", "=", "%.8f\\dots"%np.pi)
pi = result.get_part_by_tex("pi")
pi.scale(2, about_point = pi.get_right())
pi.highlight(MAROON_B)
return result
class ThisWontBeEasy(TeacherStudentsScene):
def construct(self):
self.say_words()
self.show_sum()
def say_words(self):
self.teacher_says("This won't be easy")
self.change_student_modes(
"hooray", "sassy", "angry"
)
self.dither(2)
self.play(RemovePiCreatureBubble(
self.teacher,
target_mode = "raise_right_hand",
))
self.change_student_modes(
*["pondering"]*3,
look_at_arg = 3*UP
)
def show_sum(self):
line = NumberLine()
line.add_numbers()

View file

@ -176,11 +176,12 @@ def complex_string(complex_num):
class ComplexPlane(NumberPlane): class ComplexPlane(NumberPlane):
CONFIG = { CONFIG = {
"color" : GREEN, "color" : BLUE,
"unit_to_spatial_width" : 1, "unit_to_spatial_width" : 1,
"line_frequency" : 1, "line_frequency" : 1,
"faded_line_frequency" : 0.5, "faded_line_frequency" : 0.5,
"number_at_center" : complex(0), "number_at_center" : complex(0),
"number_scale_factor" : 0.5,
} }
def __init__(self, **kwargs): def __init__(self, **kwargs):
digest_config(self, kwargs) digest_config(self, kwargs)
@ -239,7 +240,6 @@ class ComplexPlane(NumberPlane):
self.add(Line(ORIGIN, end_point, **config)) self.add(Line(ORIGIN, end_point, **config))
return self return self
class ComplexFunction(ApplyPointwiseFunction): class ComplexFunction(ApplyPointwiseFunction):
def __init__(self, function, mobject = ComplexPlane, **kwargs): def __init__(self, function, mobject = ComplexPlane, **kwargs):
if "path_func" not in kwargs: if "path_func" not in kwargs:

View file

@ -232,12 +232,26 @@ class FactorialBase(CountingScene):
} }
def construct(self): def construct(self):
self.count(30, 0.4) self.count(30, 0.4)
def is_next_digit(self): def is_next_digit(self):
return self.number == self.factorial(self.max_place + 1) return self.number == self.factorial(self.max_place + 1)
def get_place_max(self, place): def get_place_max(self, place):
return place + 2 return place + 2
def get_place_num(self, num, place): def get_place_num(self, num, place):
return (num / self.factorial(place + 1)) % self.get_place_max(place) return (num / self.factorial(place + 1)) % self.get_place_max(place)
def factorial(self, n): def factorial(self, n):
if (n == 1): return 1 if (n == 1): return 1
else: return n * self.factorial(n - 1) else: return n * self.factorial(n - 1)