Merge branch 'lighthouse2' into lighthouse-grant

This commit is contained in:
Grant Sanderson
2018-03-05 19:45:55 -08:00
4 changed files with 65 additions and 33 deletions

View File

@ -406,7 +406,6 @@ class IntroScene(PiCreatureScene):
self.ellipsis = TexMobject("\cdots") self.ellipsis = TexMobject("\cdots")
self.ellipsis.scale(0.4) self.ellipsis.scale(0.4)
for i in range(5, max_n1): for i in range(5, max_n1):
if i == 5: if i == 5:
@ -421,7 +420,6 @@ class IntroScene(PiCreatureScene):
GrowFromPoint(self.rects[i], self.euler_sum[10].get_center(), GrowFromPoint(self.rects[i], self.euler_sum[10].get_center(),
run_time = 0.5) run_time = 0.5)
) )
for i in range(max_n1, max_n2): for i in range(max_n1, max_n2):
self.play( self.play(
GrowFromPoint(self.rects[i], self.euler_sum[10].get_center(), GrowFromPoint(self.rects[i], self.euler_sum[10].get_center(),
@ -935,6 +933,7 @@ class MorphIntoSunScene(PiCreatureScene):
max_opacity_spotlight = SPOTLIGHT_FULL, max_opacity_spotlight = SPOTLIGHT_FULL,
) )
self.wait()
self.light_source.move_source_to(source_point) self.light_source.move_source_to(source_point)
@ -960,7 +959,6 @@ class MorphIntoSunScene(PiCreatureScene):
fill_opacity = 1.0, fill_opacity = 1.0,
stroke_width = 0.0 stroke_width = 0.0
) )
self.screen.next_to(morty,LEFT) self.screen.next_to(morty,LEFT)
self.light_source.set_screen(self.screen) self.light_source.set_screen(self.screen)

View File

@ -96,6 +96,57 @@ class Arc(VMobject):
return self return self
class ArcBetweenPoints(Arc):
def __init__(self, start_point, end_point, angle = TAU/4, **kwargs):
if angle == 0:
raise Exception("Arc with zero curve angle: use Line instead.")
midpoint = 0.5 * (start_point + end_point)
distance_vector = end_point - start_point
normal_vector = np.array([-distance_vector[1], distance_vector[0],0])
distance = np.linalg.norm(normal_vector)
normal_vector /= distance
if angle < 0:
normal_vector *= -1
radius = distance/2 / np.sin(0.5 * np.abs(angle))
l = distance/2 / np.tan(0.5 * np.abs(angle))
arc_center = midpoint + l * normal_vector
w = start_point - arc_center
if w[0] != 0:
start_angle = np.arctan2(w[1],w[0])
else:
start_angle = np.pi/2
Arc.__init__(self, angle,
radius = radius,
start_angle = start_angle,
**kwargs)
self.move_arc_center_to(arc_center)
class CurvedArrow(ArcBetweenPoints):
def __init__(self, start_point, end_point, angle = TAU/4, **kwargs):
# I know this is in reverse, but it works
if angle >= 0:
ArcBetweenPoints.__init__(self, start_point, end_point, angle = angle, **kwargs)
self.add_tip(at_start = True, at_end = False)
else:
ArcBetweenPoints.__init__(self, end_point, start_point, angle = -angle, **kwargs)
self.add_tip(at_start = False, at_end = True)
class CurvedDoubleArrow(ArcBetweenPoints):
def __init__(self, start_point, end_point, angle = TAU/4, **kwargs):
ArcBetweenPoints.__init__(self, start_point, end_point, angle = angle, **kwargs)
self.add_tip(at_start = True, at_end = True)
class Circle(Arc): class Circle(Arc):
CONFIG = { CONFIG = {
"color" : RED, "color" : RED,

View File

@ -29,10 +29,10 @@ NUM_LEVELS = 30
NUM_CONES = 7 # in first lighthouse scene NUM_CONES = 7 # in first lighthouse scene
NUM_VISIBLE_CONES = 5 # ibidem NUM_VISIBLE_CONES = 5 # ibidem
ARC_TIP_LENGTH = 0.2 ARC_TIP_LENGTH = 0.2
AMBIENT_FULL = 0.5 AMBIENT_FULL = 0.8
AMBIENT_DIMMED = 0.2 AMBIENT_DIMMED = 0.5
SPOTLIGHT_FULL = 0.9 SPOTLIGHT_FULL = 0.8
SPOTLIGHT_DIMMED = 0.2 SPOTLIGHT_DIMMED = 0.5
LIGHTHOUSE_HEIGHT = 0.8 LIGHTHOUSE_HEIGHT = 0.8
DEGREES = TAU/360 DEGREES = TAU/360
@ -57,7 +57,7 @@ class LightSource(VMobject):
"source_point": VectorizedPoint(location = ORIGIN, stroke_width = 0, fill_opacity = 0), "source_point": VectorizedPoint(location = ORIGIN, stroke_width = 0, fill_opacity = 0),
"color": LIGHT_COLOR, "color": LIGHT_COLOR,
"num_levels": 10, "num_levels": 10,
"radius": 5, "radius": 10.0,
"screen": None, "screen": None,
"opacity_function": inverse_quadratic(1,2,1), "opacity_function": inverse_quadratic(1,2,1),
"max_opacity_ambient": AMBIENT_FULL, "max_opacity_ambient": AMBIENT_FULL,
@ -142,7 +142,9 @@ class LightSource(VMobject):
num_levels = self.num_levels, num_levels = self.num_levels,
radius = self.radius, radius = self.radius,
screen = new_screen, screen = new_screen,
camera_mob = self.camera_mob camera_mob = self.camera_mob,
opacity_function = self.opacity_function,
max_opacity = self.max_opacity_spotlight,
) )
self.spotlight.move_source_to(self.get_source_point()) self.spotlight.move_source_to(self.get_source_point())
@ -423,7 +425,7 @@ class Spotlight(VMobject):
"color" : GREEN, # LIGHT_COLOR, "color" : GREEN, # LIGHT_COLOR,
"max_opacity" : 1.0, "max_opacity" : 1.0,
"num_levels" : 10, "num_levels" : 10,
"radius" : 5.0, "radius" : 10.0,
"screen" : None, "screen" : None,
"camera_mob": None "camera_mob": None
} }

View File

@ -120,6 +120,9 @@ class NumberLine(VMobject):
result.add(mob) result.add(mob)
return result return result
def get_labels(self):
return self.get_number_mobjects()
def add_numbers(self, *numbers, **kwargs): def add_numbers(self, *numbers, **kwargs):
self.numbers = self.get_number_mobjects( self.numbers = self.get_number_mobjects(
*numbers, **kwargs *numbers, **kwargs
@ -219,29 +222,7 @@ class Axes(VGroup):
return graph return graph
def input_to_graph_point(self, x, graph): def input_to_graph_point(self, x, graph):
if hasattr(graph, "underlying_function"): return self.coords_to_point(x, graph.underlying_function(x))
return self.coords_to_point(x, graph.underlying_function(x))
else:
#binary search
lh, rh = 0, 1
while abs(lh - rh) > 0.001:
mh = np.mean([lh, rh])
hands = [lh, mh, rh]
points = map(graph.point_from_proportion, hands)
lx, mx, rx = map(self.x_axis.point_to_number, points)
if lx <= x and rx >= x:
if mx > x:
rh = mh
else:
lh = mh
elif lx <= x and rx <= x:
return points[2]
elif lx >= x and rx >= x:
return points[0]
elif lx > x and rx < x:
lh, rh = rh, lh
return points[1]
class ThreeDAxes(Axes): class ThreeDAxes(Axes):
CONFIG = { CONFIG = {