Improved first lighthouse scene (now with series on top)

This commit is contained in:
Ben Hambrecht
2018-01-22 14:41:45 -08:00
parent 75fcb30e77
commit 2eb6f7f614

View File

@@ -40,9 +40,13 @@ INDICATOR_STROKE_WIDTH = 1
INDICATOR_STROKE_COLOR = WHITE
INDICATOR_TEXT_COLOR = WHITE
INDICATOR_UPDATE_TIME = 0.2
FAST_INDICATOR_UPDATE_TIME = 0.1
OPACITY_FOR_UNIT_INTENSITY = 0.2
SWITCH_ON_RUN_TIME = 2.0
LIGHT_CONE_NUM_SECTORS = 50
FAST_SWITCH_ON_RUN_TIME = 0.1
LIGHT_CONE_NUM_SECTORS = 10
NUM_CONES = 10
NUM_VISIBLE_CONES = 6
@@ -506,13 +510,16 @@ class FirstLightHouseScene(PiCreatureScene):
color = WHITE,
number_at_center = 1.6,
stroke_width = 1,
numbers_with_elongated_ticks = [0,1,2,3],
numbers_to_show = np.arange(1,5),
numbers_with_elongated_ticks = range(1,5),
numbers_to_show = range(1,5),
unit_size = 2,
tick_frequency = 0.2,
line_to_number_buff = LARGE_BUFF
line_to_number_buff = LARGE_BUFF,
label_direction = UP,
)
self.number_line.label_direction = DOWN
self.number_line_labels = self.number_line.get_number_mobjects()
self.add(self.number_line,self.number_line_labels)
self.wait()
@@ -549,9 +556,22 @@ class FirstLightHouseScene(PiCreatureScene):
lighthouse_pos = []
light_cones = []
num_cones = 6
for i in range(1,num_cones+1):
euler_sum_above = TexMobject("1", "+", "{1\over 4}",
"+", "{1\over 9}", "+", "{1\over 16}", "+", "{1\over 25 }", "+", "{1\over 36}")
euler_sum_above.fill_color = YELLOW
for (i,term) in zip(range(len(euler_sum_above)),euler_sum_above):
#horizontal alignment with tick marks
term.next_to(self.number_line.number_to_point(0.5*i+1),UP,buff = 2)
# vertical alignment with light indicator
old_y = term.get_center()[1]
new_y = light_indicator.get_center()[1]
term.shift([0,new_y - old_y,0])
for i in range(1,NUM_CONES+1):
lighthouse = LightHouse()
point = self.number_line.number_to_point(i)
light_cone = Candle(
@@ -571,33 +591,64 @@ class FirstLightHouseScene(PiCreatureScene):
light_indicator.set_intensity(0)
intensities = np.cumsum(np.array([1./n**2 for n in range(1,num_cones+1)]))
intensities = np.cumsum(np.array([1./n**2 for n in range(1,NUM_CONES+1)]))
opacities = intensities * light_indicator.opacity_for_unit_intensity
self.remove_foreground_mobjects(light_indicator)
for (i,lc) in zip(range(num_cones),light_cones):
# slowly switch on visible light cones and increment indicator
for (i,lc) in zip(range(NUM_VISIBLE_CONES),light_cones[:NUM_VISIBLE_CONES]):
print i
indicator_start_time = 0.5 * (i+1) * SWITCH_ON_RUN_TIME/lc.radius * self.number_line.unit_size
indicator_stop_time = indicator_start_time + INDICATOR_UPDATE_TIME
indicator_rate_func = squish_rate_func(#smooth, 0.8, 0.9)
smooth,indicator_start_time,indicator_stop_time)
self.play(
SwitchOn(lc),
FadeIn(euler_sum_above[2*i], run_time = SWITCH_ON_RUN_TIME,
rate_func = indicator_rate_func),
FadeIn(euler_sum_above[2*i - 1], run_time = SWITCH_ON_RUN_TIME,
rate_func = indicator_rate_func),
ChangeDecimalToValue(light_indicator.reading,intensities[i],
rate_func = indicator_rate_func, run_time = SWITCH_ON_RUN_TIME),
ApplyMethod(light_indicator.foreground.set_fill,None,opacities[i])
)
if i == 0:
# mvoe a copy out of the thought bubble for comparison
# move a copy out of the thought bubble for comparison
light_indicator_copy = light_indicator.copy()
old_y = light_indicator_copy.get_center()[1]
new_y = self.number_line.get_center()[1]
self.play(
light_indicator_copy.shift,[2,0,0]
light_indicator_copy.shift,[0, new_y - old_y,0]
)
print "fast now"
# quickly switch on off-screen light cones and increment indicator
for (i,lc) in zip(range(NUM_VISIBLE_CONES,NUM_CONES),light_cones[NUM_VISIBLE_CONES:NUM_CONES]):
print i
indicator_start_time = 0.5 * (i+1) * FAST_SWITCH_ON_RUN_TIME/lc.radius * self.number_line.unit_size
indicator_stop_time = indicator_start_time + FAST_INDICATOR_UPDATE_TIME
indicator_rate_func = squish_rate_func(#smooth, 0.8, 0.9)
smooth,indicator_start_time,indicator_stop_time)
self.play(
SwitchOn(lc, run_time = FAST_SWITCH_ON_RUN_TIME),
ChangeDecimalToValue(light_indicator.reading,intensities[i],
rate_func = indicator_rate_func, run_time = FAST_SWITCH_ON_RUN_TIME),
ApplyMethod(light_indicator.foreground.set_fill,None,opacities[i])
)
# show limit value in light indicator and an equals sign
limit_reading = TexMobject("{\pi^2 \over 6}")
limit_reading.move_to(light_indicator.reading)
self.play(
FadeOut(indicator.reading),
FadeIn(limit_reading)
# Transform(light_indicator.reading,limit_reading)
)
@@ -622,7 +673,7 @@ class SingleLightHouseScene(PiCreatureScene):
lighthouse = LightHouse()
candle = Candle(
opacity_function = inverse_quadratic(0.3,1),
opacity_function = inverse_quadratic(1,1),
num_sectors = LIGHT_CONE_NUM_SECTORS,
radius = 10
)
@@ -650,6 +701,10 @@ class SingleLightHouseScene(PiCreatureScene):
light_screen.screen.fill_opacity = 1
light_screen.update_light_cone(light_cone)
self.add(light_screen)
# dim the light that misses the screen
self.play(
ApplyMethod(light_cone.set_intensity,0.3)
)
lc_updater = lambda lc: light_screen.update_light_cone(lc)
sh_updater = lambda sh: light_screen.update_shadow(sh)