tweaking PondScene, added RightAngleOverlay

This commit is contained in:
Ben Hambrecht 2018-03-01 18:28:16 +01:00
parent 56f74388a0
commit ee889d6be4

View file

@ -2576,12 +2576,13 @@ class InscribedAngleScene(ThreeDScene):
# check if the light sources are on screen
ls_old_loc = np.array(ls1.get_source_point())
onscreen_old = np.any(np.abs(ls_old_loc) < 10)
onscreen_1 = np.any(np.abs(ls_new_loc1) < 10)
onscreen_2 = np.any(np.abs(ls_new_loc2) < 10)
onscreen_old = np.all(np.abs(ls_old_loc[:2]) < 10 ** 2**step)
onscreen_1 = np.all(np.abs(ls_new_loc1[:2][:2]) < 10 ** 2**step)
onscreen_2 = np.all(np.abs(ls_new_loc2[:2]) < 10 ** 2**step)
show_animation = (onscreen_old or onscreen_1 or onscreen_2)
if show_animation:
print "animating (", i, ",", step, ")"
self.play(
ApplyMethod(ls1.move_source_to,ls_new_loc1, run_time = run_time),
ApplyMethod(ls2.move_source_to,ls_new_loc2, run_time = run_time),
@ -3070,6 +3071,9 @@ class PondScene(ThreeDScene):
self.cumulated_zoom_factor = 1
STEP_RUN_TIME = 0.5
#self.force_skipping()
@ -3176,7 +3180,7 @@ class PondScene(ThreeDScene):
# first lighthouse
original_op_func = inverse_quadratic(LIGHT_MAX_INT,LIGHT_SCALE,LIGHT_CUTOFF)
ls0 = LightSource(opacity_function = original_op_func, radius = 15.0, num_levels = 150)
ls0 = LightSource(opacity_function = original_op_func, radius = 15.0, num_levels = 15)
ls0.lighthouse.scale_to_fit_height(LIGHTHOUSE_HEIGHT)
ls0.lighthouse.height = LIGHTHOUSE_HEIGHT
ls0.move_source_to(OBSERVER_POINT + LAKE0_RADIUS * 2 * UP)
@ -3353,12 +3357,13 @@ class PondScene(ThreeDScene):
# check if the light sources are on screen
ls_old_loc = np.array(ls1.get_source_point())
onscreen_old = np.any(np.abs(ls_old_loc) < 10)
onscreen_1 = np.any(np.abs(ls_new_loc1) < 10)
onscreen_2 = np.any(np.abs(ls_new_loc2) < 10)
onscreen_old = np.all(np.abs(ls_old_loc[:2]) < 10 * 2**3)
onscreen_1 = np.all(np.abs(ls_new_loc1[:2]) < 10 * 2**3)
onscreen_2 = np.all(np.abs(ls_new_loc2[:2]) < 10 * 2**3)
show_animation = (onscreen_old or onscreen_1 or onscreen_2)
if show_animation or animate:
print "animating (", i, ",", step, ")"
self.play(
ApplyMethod(ls1.move_source_to,ls_new_loc1, run_time = run_time),
ApplyMethod(ls2.move_source_to,ls_new_loc2, run_time = run_time),
@ -3616,7 +3621,7 @@ class PondScene(ThreeDScene):
self.new_hypotenuses = []
construction_step(0)
construction_step(0, run_time = STEP_RUN_TIME)
my_triangle = triangle(
self.light_sources[0].get_source_point(),
@ -3660,13 +3665,13 @@ class PondScene(ThreeDScene):
zoom_out_scene(2)
construction_step(1)
construction_step(1, run_time = STEP_RUN_TIME)
indicator_wiggle()
#self.play(FadeOut(self.ls0_dot))
zoom_out_scene(2)
construction_step(2)
construction_step(2, run_time = STEP_RUN_TIME)
indicator_wiggle()
self.play(FadeOut(self.ls0_dot))
@ -3679,8 +3684,8 @@ class PondScene(ThreeDScene):
FadeOut(self.legs)
)
max_it = 6
scale = 2**(max_it - 4)
max_it = 10
scale = 2**(max_it - 5)
TEX_SCALE *= scale
@ -3708,8 +3713,8 @@ 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)]
#print shift_list
self.play(Transform(self.outer_lake,new_lake))
shift_list = []
for i in range(2**n):
#print "==========="
@ -3720,10 +3725,26 @@ class PondScene(ThreeDScene):
pos2 = new_lake_center - new_lake_radius * v
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)
ls_old_loc = np.array(ls1.get_source_point())
onscreen_old = np.all(np.abs(ls_old_loc[:2]) < 10 * 2**2)
onscreen_1 = np.all(np.abs(pos1[:2]) < 10 * 2**2)
onscreen_2 = np.all(np.abs(pos2[:2]) < 10 * 2**2)
if onscreen_old or onscreen_1:
print "anim1 for step", n, "part", i
print "------------------ moving from", ls_old_loc[:2], "to", pos1[:2]
shift_list.append(ApplyMethod(ls1.move_source_to, pos1, run_time = STEP_RUN_TIME))
else:
ls1.move_source_to(pos1)
if onscreen_old or onscreen_2:
print "anim2 for step", n, "part", i
print "------------------ moving from", ls_old_loc[:2], "to", pos2[:2]
shift_list.append(ApplyMethod(ls2.move_source_to, pos2, run_time = STEP_RUN_TIME))
else:
ls2.move_source_to(pos2)
#print shift_list
self.play(*shift_list)
@ -3752,7 +3773,11 @@ class PondScene(ThreeDScene):
number_scale_val = 3,
line_to_number_buff = LARGE_BUFF,
label_direction = UP,
).shift(scale * 2.5 * DOWN)
).shift(origin_point - self.number_line.number_to_point(0)) # .shift(scale * 2.5 * DOWN)
print "scale ", scale
print "number line at", self.number_line.get_center()
print "should be at", origin_point, "or", OBSERVER_POINT
self.number_line.tick_marks.fade(1)
self.number_line_labels = self.number_line.get_number_mobjects()
@ -3784,7 +3809,7 @@ class PondScene(ThreeDScene):
stroke_color = LAKE_STROKE_COLOR,
fill_color = LAKE_COLOR,
fill_opacity = LAKE_OPACITY,
).flip().next_to(origin_point,UP,buff = 0)
).flip().next_to(self.obs_dot.get_center(),UP,buff = 0)
self.revert_to_original_skipping_status()
@ -3797,7 +3822,6 @@ class PondScene(ThreeDScene):
)
self.play(FadeIn(self.number_line))
self.wait()
v = 4 * scale * UP
@ -3862,7 +3886,7 @@ class PondScene(ThreeDScene):
fill_color = BLACK,
fill_opacity = 1,
)
covering_rectangle.next_to(ORIGIN,LEFT,buff = 0)
covering_rectangle.next_to(ORIGIN, LEFT, buff = 0)
#for i in range(10):
# self.add_foreground_mobject(nl_sources.submobjects[i])
@ -4459,8 +4483,67 @@ class InfiniteCircleScene(PiCreatureScene):
class RightAnglesOverlay(Scene):
def construct(self):
BASELINE_YPOS = -2.5
OBSERVER_POINT = [0,BASELINE_YPOS,0]
LAKE0_RADIUS = 1.5 * 2
INDICATOR_RADIUS = 0.6
TICK_SIZE = 0.5
LIGHTHOUSE_HEIGHT = 0.2
LAKE_COLOR = BLUE
LAKE_OPACITY = 0.15
LAKE_STROKE_WIDTH = 5.0
LAKE_STROKE_COLOR = BLUE
TEX_SCALE = 0.8
DOT_COLOR = BLUE
RIGHT_ANGLE_SIZE = 0.3
def right_angle(pointA, pointB, pointC, size = 1):
v1 = pointA - pointB
v1 = size * v1/np.linalg.norm(v1)
v2 = pointC - pointB
v2 = size * v2/np.linalg.norm(v2)
P = pointB
Q = pointB + v1
R = Q + v2
S = R - v1
angle_sign = VMobject()
angle_sign.set_points_as_corners([P,Q,R,S,P])
angle_sign.mark_paths_closed = True
angle_sign.set_fill(color = WHITE, opacity = 1)
angle_sign.set_stroke(width = 0)
return angle_sign
lake_center = OBSERVER_POINT + LAKE0_RADIUS * UP
points = []
lines = VGroup()
for i in range(4):
theta = -TAU/4 + (i+0.5)*TAU/4
v = np.array([np.cos(theta), np.sin(theta), 0])
P = lake_center + LAKE0_RADIUS * v
points.append(P)
lines.add(Line(lake_center, P, stroke_width = 8))
self.play(FadeIn(lines))
self.wait()
for i in range(4):
sign = right_angle(points[i-1], lake_center, points[i],RIGHT_ANGLE_SIZE)
self.play(FadeIn(sign))
self.play(FadeOut(sign))
self.wait()
self.play(FadeOut(lines))