From 7219ff95f752de413d0739235eec58ad09003198 Mon Sep 17 00:00:00 2001 From: Ben Hambrecht Date: Wed, 9 May 2018 16:36:00 +0200 Subject: [PATCH] made brick row scene reusable for brick wall --- .../eop/chapter1/brick_row_scene.py | 96 ++++++++++--------- 1 file changed, 49 insertions(+), 47 deletions(-) diff --git a/active_projects/eop/chapter1/brick_row_scene.py b/active_projects/eop/chapter1/brick_row_scene.py index 49365c6e..b11a66ca 100644 --- a/active_projects/eop/chapter1/brick_row_scene.py +++ b/active_projects/eop/chapter1/brick_row_scene.py @@ -5,7 +5,7 @@ from active_projects.eop.reusable_imports import * class BrickRowScene(PiCreatureScene): - def split_tallies(self, direction = DOWN): + def split_tallies(self, row, direction = DOWN): # Split all tally symbols at once and move the copies # either horizontally on top of the brick row # or diagonally into the bricks @@ -15,12 +15,12 @@ class BrickRowScene(PiCreatureScene): tally_targets_left = [ rect.get_center() + 0.25 * rect.get_width() * LEFT - for rect in self.row.rects + for rect in row.rects ] tally_targets_right = [ rect.get_center() + 0.25 * rect.get_width() * RIGHT - for rect in self.row.rects + for rect in row.rects ] if np.all(direction == LEFT) or np.all(direction == RIGHT): @@ -63,7 +63,7 @@ class BrickRowScene(PiCreatureScene): - def tally_split_animations(self, direction = DOWN): + def tally_split_animations(self, row, direction = DOWN): # Just creates the animations and returns them # Execution can be timed afterwards # Returns two lists: first all those going left, then those to the right @@ -73,12 +73,12 @@ class BrickRowScene(PiCreatureScene): tally_targets_left = [ rect.get_center() + 0.25 * rect.get_width() * LEFT - for rect in self.row.rects + for rect in row.rects ] tally_targets_right = [ rect.get_center() + 0.25 * rect.get_width() * RIGHT - for rect in self.row.rects + for rect in row.rects ] if np.all(direction == LEFT) or np.all(direction == RIGHT): @@ -122,13 +122,14 @@ class BrickRowScene(PiCreatureScene): return anims1, anims2 - def split_tallies_at_once(self, direction = DOWN): - anims1, anims2 = self.tally_split_animations(direction = direction) + + def split_tallies_at_once(self, row, direction = DOWN): + anims1, anims2 = self.tally_split_animations(row, direction = direction) self.play(*(anims1 + anims2)) - def split_tallies_in_two_steps(self, direction = DOWN): + def split_tallies_in_two_steps(self, row, direction = DOWN): # First all those to the left, then those to the right - anims1, anims2 = self.tally_split_animations(direction = direction) + anims1, anims2 = self.tally_split_animations(row, direction = direction) self.play(*anims1) self.wait(0.3) self.play(*anims2) @@ -136,31 +137,31 @@ class BrickRowScene(PiCreatureScene): - def merge_rects_by_subdiv(self): + def merge_rects_by_subdiv(self, row): - half_merged_row = self.row.copy() + half_merged_row = row.copy() half_merged_row.subdiv_level += 1 half_merged_row.generate_points() - half_merged_row.move_to(self.row) + half_merged_row.move_to(row) self.play(FadeIn(half_merged_row)) - self.remove(self.row) - self.row = half_merged_row + self.remove(row) + return half_merged_row - def merge_tallies(self, target_pos = UP): + def merge_tallies(self, row, target_pos = UP): - r = self.row.subdiv_level + r = row.subdiv_level if np.all(target_pos == DOWN): tally_targets = [ rect.get_center() - for rect in self.row.get_rects_for_level(r) + for rect in row.get_rects_for_level(r) ] elif np.all(target_pos == UP): - y_pos = self.row.get_center()[1] + 1.2 * 0.5 * self.row.get_height() + y_pos = row.get_center()[1] + 1.2 * 0.5 * row.get_height() for target in tally_targets: target[1] = y_pos else: @@ -186,25 +187,25 @@ class BrickRowScene(PiCreatureScene): self.tallies.add(self.tallies_copy[-1]) - def merge_rects_by_coloring(self): + def merge_rects_by_coloring(self, row): - merged_row = self.row.copy() + merged_row = row.copy() merged_row.coloring_level += 1 merged_row.generate_points() - merged_row.move_to(self.row) + merged_row.move_to(row) self.play(FadeIn(merged_row)) - self.remove(self.row) - self.row = merged_row + self.remove(row) + return merged_row - def move_tallies_on_top(self): + def move_tallies_on_top(self, row): self.play( - self.tallies.shift, 1.2 * 0.5 * self.row.height * UP + self.tallies.shift, 1.2 * 0.5 * row.height * UP ) for tally in self.tallies: - tally.anchor += 1.2 * 0.5 * self.row.height * UP + tally.anchor += 1.2 * 0.5 * row.height * UP def create_pi_creature(self): randy = CoinFlippingPiCreature(color = MAROON_E) @@ -256,12 +257,11 @@ class BrickRowScene(PiCreatureScene): # # # # # # # # - self.play(FlipCoin(randy)) self.play(SplitRectsInBrickWall(self.row)) - self.merge_rects_by_subdiv() - self.merge_rects_by_coloring() + self.row = self.merge_rects_by_subdiv(self.row) + self.row = self.merge_rects_by_coloring(self.row) # # put tallies on top @@ -312,7 +312,6 @@ class BrickRowScene(PiCreatureScene): new_tails[i].shift(COIN_SEQUENCE_SPACING * DOWN) self.play(FadeIn(new_tails)) - decimal_tallies = VGroup() # introduce notion of tallies for (i, rect) in enumerate(self.row.get_rects_for_level(2)): @@ -347,6 +346,7 @@ class BrickRowScene(PiCreatureScene): ) self.wait() + self.tallies = VGroup() for (i, rect) in enumerate(self.row.get_rects_for_level(2)): tally = TallyStack(2-i, i, show_decimals = False) @@ -357,6 +357,7 @@ class BrickRowScene(PiCreatureScene): self.play(FadeIn(self.tallies)) self.wait() + anims = [] for (decimal_tally, tally_stack) in zip(decimal_tallies, self.tallies): anims.append(ApplyFunction( @@ -366,6 +367,7 @@ class BrickRowScene(PiCreatureScene): self.play(*anims) self.wait() + # replace the original decimal tallies with # the ones that belong to the TallyStacks for (decimal_tally, tally_stack) in zip(decimal_tallies, self.tallies): @@ -374,9 +376,9 @@ class BrickRowScene(PiCreatureScene): tally_stack.add(tally_stack.decimal_tally) self.add_foreground_mobject(self.tallies) - self.merge_rects_by_subdiv() + self.row = self.merge_rects_by_subdiv(self.row) self.wait() - self.merge_rects_by_coloring() + self.row = self.merge_rects_by_coloring(self.row) self.wait() @@ -494,7 +496,7 @@ class BrickRowScene(PiCreatureScene): ) self.wait() - self.split_tallies_in_two_steps() + self.split_tallies_in_two_steps(self.row) self.wait() self.add_foreground_mobject(self.tallies) @@ -554,7 +556,7 @@ class BrickRowScene(PiCreatureScene): # self.wait() - # self.merge_rects_by_subdiv() + # self.row = self.merge_rects_by_subdiv(self.row) # self.wait() # self.play( @@ -575,9 +577,9 @@ class BrickRowScene(PiCreatureScene): # self.wait() - # self.merge_tallies(target_pos = DOWN) + # self.merge_tallies(self.row, target_pos = DOWN) # self.add_foreground_mobject(self.tallies) - # self.merge_rects_by_coloring() + # self.row = self.merge_rects_by_coloring(self.row) # self.wait() @@ -645,7 +647,7 @@ class BrickRowScene(PiCreatureScene): self.wait() - self.merge_rects_by_subdiv() + self.row = self.merge_rects_by_subdiv(self.row) self.wait() self.play( @@ -666,9 +668,9 @@ class BrickRowScene(PiCreatureScene): self.wait() - self.merge_tallies(target_pos = DOWN) + self.merge_tallies(self.row, target_pos = DOWN) self.add_foreground_mobject(self.tallies) - self.merge_rects_by_coloring() + self.row = self.merge_rects_by_coloring(self.row) self.wait() @@ -759,7 +761,7 @@ class BrickRowScene(PiCreatureScene): ) self.wait() - self.merge_rects_by_subdiv() + self.row = self.merge_rects_by_subdiv(self.row) self.wait() @@ -876,7 +878,7 @@ class BrickRowScene(PiCreatureScene): FadeOut(self.tallies), ) - self.merge_rects_by_coloring() + self.row = self.merge_rects_by_coloring(self.row) self.play( FadeIn(new_tallies[0]), @@ -886,9 +888,9 @@ class BrickRowScene(PiCreatureScene): - # # # # # # # # - # FIFTH FLIP # - # # # # # # # # + # # # # # # # # # # + # EVEN MORE FLIPS # + # # # # # # # # # # self.play(FadeOut(new_tallies)) self.clear() @@ -909,9 +911,9 @@ class BrickRowScene(PiCreatureScene): SplitRectsInBrickWall(self.row) ) self.wait() - self.merge_rects_by_subdiv() + self.row = self.merge_rects_by_subdiv(self.row) self.wait() - self.merge_rects_by_coloring() + self.row = self.merge_rects_by_coloring(self.row) self.wait() self.play(FadeOut(previous_row))