PondScene, created InfiniteCircleScene

This commit is contained in:
Ben Hambrecht 2018-03-01 00:15:01 +01:00
parent 16cdc01003
commit 56f74388a0

View file

@ -3070,6 +3070,7 @@ class PondScene(ThreeDScene):
self.cumulated_zoom_factor = 1
#self.force_skipping()
def right_angle(pointA, pointB, pointC, size = 1):
@ -3163,7 +3164,7 @@ class PondScene(ThreeDScene):
self.zoomable_mobs.add(lake0)
# Morty and indicator
morty = Randolph().scale(0.3)
morty = Randolph(color = MAROON_D).scale(0.3)
morty.next_to(OBSERVER_POINT,DOWN)
indicator = LightIndicator(precision = 2,
radius = INDICATOR_RADIUS,
@ -3436,6 +3437,7 @@ class PondScene(ThreeDScene):
self.new_legs_2 = []
self.new_hypotenuses = []
# WE ALWAYS USE THIS CASE BRANCH
if simultaneous_splitting == False:
for i in range(2**n):
@ -3497,6 +3499,9 @@ class PondScene(ThreeDScene):
self.wait()
# WE DON'T USE THIS CASE BRANCH ANYMORE
else: # simultaneous splitting
old_lake = self.outer_lake.copy()
@ -3685,14 +3690,16 @@ class PondScene(ThreeDScene):
# simultaneous_splitting = True)
#print "starting simultaneous expansion"
# simultaneous expansion of light sources from now on
self.play(FadeOut(self.inner_lake))
for n in range(3,max_it + 1):
print "working on n = ", n, "..."
new_lake = self.outer_lake.copy().scale(2,about_point = self.obs_dot.get_center())
for ls in self.light_sources_array:
for (i,ls) in enumerate(self.light_sources_array[:2**n]):
#print i
lsp = ls.copy()
self.light_sources.add(lsp)
self.add(lsp)
@ -3701,26 +3708,32 @@ class PondScene(ThreeDScene):
new_lake_center = new_lake.get_center()
new_lake_radius = 0.5 * new_lake.get_width()
shift_list = (Transform(self.outer_lake,new_lake),)
shift_list = [Transform(self.outer_lake,new_lake)]
#print shift_list
for i in range(2**n):
theta = -TAU/4 + (i + 0.5) * TAU / 2**n
#print "==========="
#print i
theta = -TAU/4 + (i + 0.5) * TAU / 2**(n+1)
v = np.array([np.cos(theta), np.sin(theta),0])
pos1 = new_lake_center + new_lake_radius * v
pos2 = new_lake_center - new_lake_radius * v
shift_list += (self.light_sources.submobjects[i].move_source_to,pos1)
shift_list += (self.light_sources.submobjects[i+2**n].move_source_to,pos2)
ls1 = self.light_sources.submobjects[i]
ls2 = self.light_sources.submobjects[i+2**n]
shift_list.append(ls1.move_source_to)
shift_list.append(pos1)
shift_list.append(ls2.move_source_to)
shift_list.append(pos2)
#print shift_list
self.play(*shift_list)
print "...done"
return
#self.revert_to_original_skipping_status()
# Now create a straight number line and transform into it
MAX_N = 17
MAX_N = 7
origin_point = self.obs_dot.get_center()
@ -3731,16 +3744,17 @@ class PondScene(ThreeDScene):
number_at_center = 0,
stroke_width = LAKE_STROKE_WIDTH,
stroke_color = LAKE_STROKE_COLOR,
#numbers_with_elongated_ticks = range(-MAX_N,MAX_N + 1),
numbers_to_show = range(-MAX_N,MAX_N + 1,2),
numbers_with_elongated_ticks = [],
numbers_to_show = range(-MAX_N,MAX_N + 1),#,2),
unit_size = LAKE0_RADIUS * TAU/4 / 2 * scale,
tick_frequency = 1,
tick_size = LAKE_STROKE_WIDTH,
number_scale_val = 3,
line_to_number_buff = LARGE_BUFF,
label_direction = UP,
).shift(scale * 2.5 * DOWN)
self.number_line.label_direction = DOWN
self.number_line.tick_marks.fade(1)
self.number_line_labels = self.number_line.get_number_mobjects()
self.wait()
@ -3757,25 +3771,29 @@ class PondScene(ThreeDScene):
self.add(pond_sources)
self.remove(self.light_sources)
for ls in self.light_sources_array:
self.remove(ls)
self.outer_lake.rotate(TAU/8)
# open sea
open_sea = Rectangle(
width = 20 * scale,
height = 10 * scale,
width = 200 * scale,
height = 100 * scale,
stroke_width = LAKE_STROKE_WIDTH,
stroke_color = LAKE_STROKE_COLOR,
fill_color = LAKE_COLOR,
fill_opacity = LAKE_OPACITY,
).flip().next_to(origin_point,UP,buff = 0)
self.revert_to_original_skipping_status()
self.play(
ReplacementTransform(pond_sources,nl_sources),
#FadeOut(pond_sources),
#FadeIn(nl_sources),
ReplacementTransform(self.outer_lake,open_sea),
FadeOut(self.inner_lake)
#FadeOut(self.inner_lake)
)
self.play(FadeIn(self.number_line))
@ -3797,11 +3815,12 @@ class PondScene(ThreeDScene):
origin_point = self.number_line.number_to_point(0)
#self.remove(self.obs_dot)
self.play(
indicator.move_to, origin_point + scale * UP,
indicator_reading.move_to, origin_point + scale * UP,
indicator.move_to, origin_point + scale * UP + 2 * UP,
indicator_reading.move_to, origin_point + scale * UP + 2 * UP,
FadeOut(open_sea),
FadeOut(morty),
FadeIn(self.number_line_labels)
FadeIn(self.number_line_labels),
FadeIn(self.number_line.tick_marks),
)
two_sided_sum = TexMobject("\dots", "+", "{1\over (-11)^2}",\
@ -3821,13 +3840,20 @@ class PondScene(ThreeDScene):
self.play(Write(two_sided_sum))
for i in range(MAX_N - 5, MAX_N):
self.remove(nl_sources.submobjects[i].ambient_light)
for i in range(MAX_N, MAX_N + 5):
self.add_foreground_mobject(nl_sources.submobjects[i].ambient_light)
self.wait()
for ls in nl_sources.submobjects:
if ls.get_source_point()[0] < 0:
self.remove_foreground_mobject(ls.ambient_light)
self.remove(ls.ambient_light)
else:
self.add_foreground_mobject(ls.ambient_light)
for label in self.number_line_labels.submobjects:
if label.get_center()[0] <= 0:
self.remove(label)
self.wait()
covering_rectangle = Rectangle(
width = SPACE_WIDTH * scale,
@ -3837,8 +3863,8 @@ class PondScene(ThreeDScene):
fill_opacity = 1,
)
covering_rectangle.next_to(ORIGIN,LEFT,buff = 0)
for i in range(10):
self.add_foreground_mobject(nl_sources.submobjects[i])
#for i in range(10):
# self.add_foreground_mobject(nl_sources.submobjects[i])
self.add_foreground_mobject(indicator)
self.add_foreground_mobject(indicator_reading)
@ -3869,7 +3895,7 @@ class PondScene(ThreeDScene):
self.revert_to_original_skipping_status()
# show Randy admiring the result
randy = Randolph(color = MAROON_E).scale(scale).move_to(2*scale*DOWN+5*scale*LEFT)
randy = Randolph(color = MAROON_D).scale(scale).move_to(2*scale*DOWN+5*scale*LEFT)
self.play(FadeIn(randy))
self.play(randy.change,"happy")
self.play(randy.change,"hooray")
@ -3917,8 +3943,8 @@ class FinalSumManipulationScene(PiCreatureScene):
sum_vertical_spacing = 1.5
randy = self.get_primary_pi_creature()
randy.highlight(MAROON_E)
randy.color = MAROON_E
randy.highlight(MAROON_D)
randy.color = MAROON_D
randy.scale(0.7).flip().to_edge(DOWN + LEFT)
self.wait()
@ -4311,14 +4337,17 @@ class ThumbnailScene(Scene):
def construct(self):
equation = TexMobject("1+{1\over 4}+{1\over 9}+{1\over 16}+{1\over 25}+\dots")
equation.scale(2.)
equation.to_edge(UP)
q_mark = TexMobject("?").scale(5)
q_mark.next_to(equation)
equation.scale(1.5)
equation.move_to(1.5 * UP)
q_mark = TexMobject("=?", color = LIGHT_COLOR).scale(5)
q_mark.next_to(equation, DOWN, buff = 1.5)
#equation.move_to(2 * UP)
#q_mark = TexMobject("={\pi^2\over 6}", color = LIGHT_COLOR).scale(3)
#q_mark.next_to(equation, DOWN, buff = 1)
lake_radius = 2
lake_center = DOWN
op_scale = 0.5
lake_radius = 6
lake_center = ORIGIN
op_scale = 0.4
lake = Circle(
fill_color = LAKE_COLOR,
@ -4329,13 +4358,13 @@ class ThumbnailScene(Scene):
)
lake.move_to(lake_center)
for i in range(8):
theta = -TAU/4 + (i + 0.5) * TAU/8
for i in range(16):
theta = -TAU/4 + (i + 0.5) * TAU/16
pos = lake_center + lake_radius * np.array([np.cos(theta), np.sin(theta), 0])
ls = LightSource(
radius = 5.0,
num_levels = 100,
max_opacity_ambient = 0.8,
radius = 15.0,
num_levels = 150,
max_opacity_ambient = 1.0,
opacity_function = inverse_quadratic(1,op_scale,1)
)
ls.move_source_to(pos)
@ -4343,7 +4372,87 @@ class ThumbnailScene(Scene):
self.add(lake)
self.add(equation) #, q_mark)
self.add(equation, q_mark)
self.wait()
class InfiniteCircleScene(PiCreatureScene):
def construct(self):
morty = self.get_primary_pi_creature()
morty.highlight(MAROON_D).flip()
morty.color = MAROON_D
morty.scale(0.5).move_to(ORIGIN)
arrow = Arrow(ORIGIN, 2.4 * RIGHT)
dot = Dot(color = BLUE).next_to(arrow)
ellipsis = TexMobject("\dots")
infsum = VGroup()
infsum.add(ellipsis.copy())
for i in range(3):
infsum.add(arrow.copy().next_to(infsum.submobjects[-1]))
infsum.add(dot.copy().next_to(infsum.submobjects[-1]))
infsum.add(arrow.copy().next_to(infsum.submobjects[-1]))
infsum.add(ellipsis.copy().next_to(infsum.submobjects[-1]))
infsum.next_to(morty,DOWN, buff = 1)
self.wait()
self.play(
LaggedStart(FadeIn,infsum,lag_ratio = 0.2)
)
self.wait()
A = infsum.submobjects[-1].get_center() + 0.5 * RIGHT
B = A + RIGHT + 1.3 * UP + 0.025 * LEFT
right_arc = DashedLine(TAU/4*UP, ORIGIN, stroke_color = YELLOW,
stroke_width = 8).apply_complex_function(np.exp)
right_arc.rotate(-TAU/4).next_to(infsum, RIGHT).shift(0.5 * UP)
right_tip_line = Arrow(B - UP, B, color = WHITE)
right_tip_line.add_tip()
right_tip = right_tip_line.get_tip()
right_tip.set_fill(color = YELLOW)
right_arc.add(right_tip)
C = B + 3.2 * UP
right_line = DashedLine(B + 0.2 * DOWN,C + 0.2 * UP, stroke_color = YELLOW,
stroke_width = 8)
ru_arc = right_arc.copy().rotate(angle = TAU/4)
ru_arc.remove(ru_arc.submobjects[-1])
ru_arc.to_edge(UP+RIGHT, buff = 0.15)
D = np.array([5.85, 3.85,0])
E = np.array([-D[0],D[1],0])
up_line = DashedLine(D, E, stroke_color = YELLOW,
stroke_width = 8)
lu_arc = ru_arc.copy().flip().to_edge(LEFT + UP, buff = 0.15)
left_line = right_line.copy().flip(axis = RIGHT).to_edge(LEFT, buff = 0.15)
left_arc = right_arc.copy().rotate(-TAU/4)
left_arc.next_to(infsum, LEFT).shift(0.5 * UP + 0.1 * LEFT)
right_arc.shift(0.2 * RIGHT)
right_line.shift(0.2 * RIGHT)
self.play(FadeIn(right_arc))
self.play(ShowCreation(right_line))
self.play(FadeIn(ru_arc))
self.play(ShowCreation(up_line))
self.play(FadeIn(lu_arc))
self.play(ShowCreation(left_line))
self.play(FadeIn(left_arc))
self.wait()
@ -4353,3 +4462,14 @@ class ThumbnailScene(Scene):