mirror of
https://github.com/3b1b/manim.git
synced 2025-09-19 04:41:56 +00:00
added decimal tallies
This commit is contained in:
parent
282c0a19fe
commit
a222181d77
1 changed files with 114 additions and 15 deletions
|
@ -20,6 +20,7 @@ GRADE_COLOR_1 = COLOR_HEADS = RED
|
|||
GRADE_COLOR_2 = COLOR_TAILS = BLUE_E
|
||||
|
||||
TALLY_BACKGROUND_WIDTH = 1.0
|
||||
TALLY_BACKGROUND_COLOR = BLACK
|
||||
|
||||
def get_example_quiz():
|
||||
quiz = get_quiz(
|
||||
|
@ -312,10 +313,11 @@ class TailsStack(CoinStack):
|
|||
|
||||
class TallyStack(VGroup):
|
||||
CONFIG = {
|
||||
"coin_thickness": COIN_THICKNESS
|
||||
"coin_thickness": COIN_THICKNESS,
|
||||
"show_decimals": True
|
||||
}
|
||||
|
||||
def __init__(self,h,t,anchor = ORIGIN, **kwargs):
|
||||
def __init__(self, h, t, anchor = ORIGIN, **kwargs):
|
||||
self.nb_heads = h
|
||||
self.nb_tails = t
|
||||
self.anchor = anchor
|
||||
|
@ -331,21 +333,36 @@ class TallyStack(VGroup):
|
|||
self.heads_stack = stack1
|
||||
self.tails_stack = stack2
|
||||
self.add(stack1, stack2)
|
||||
background_rect = RoundedRectangle(
|
||||
self.background_rect = background_rect = RoundedRectangle(
|
||||
width = TALLY_BACKGROUND_WIDTH,
|
||||
height = TALLY_BACKGROUND_WIDTH,
|
||||
corner_radius = 0.1,
|
||||
fill_color = DARK_GREY,
|
||||
fill_color = TALLY_BACKGROUND_COLOR,
|
||||
fill_opacity = 1.0,
|
||||
stroke_width = 3
|
||||
).align_to(self.anchor, DOWN).shift(0.1 * DOWN)
|
||||
self.add_to_back(background_rect)
|
||||
|
||||
self.decimal_tally = DecimalTally(self.nb_heads, self.nb_tails)
|
||||
self.position_decimal_tally(self.decimal_tally)
|
||||
if self.show_decimals:
|
||||
self.add(self.decimal_tally)
|
||||
|
||||
def position_decimal_tally(self, decimal_tally):
|
||||
decimal_tally.match_width(self.background_rect)
|
||||
print self.background_rect.get_center()
|
||||
decimal_tally.scale(0.6)
|
||||
decimal_tally.next_to(self.background_rect.get_top(), DOWN, buff = 0.15)
|
||||
return decimal_tally
|
||||
|
||||
|
||||
def move_anchor_to(self, new_anchor):
|
||||
for submob in self.submobjects:
|
||||
submob.shift(new_anchor - self.anchor)
|
||||
|
||||
self.anchor = new_anchor
|
||||
self.position_decimal_tally(self.decimal_tally)
|
||||
|
||||
return self
|
||||
|
||||
class CoinFlipTree(VGroup):
|
||||
|
@ -1582,6 +1599,17 @@ class WhatDoesItReallyMean(TeacherStudentsScene):
|
|||
self.wait()
|
||||
|
||||
|
||||
class DecimalTally(TextMobject):
|
||||
|
||||
def __init__(self, heads, tails, **kwargs):
|
||||
|
||||
TextMobject.__init__(self, str(heads), "\\textemdash\,", str(tails), **kwargs)
|
||||
self[0].set_color(COLOR_HEADS)
|
||||
self[-1].set_color(COLOR_TAILS)
|
||||
# this only works for single-digit tallies
|
||||
|
||||
|
||||
|
||||
class BrickRowScene(Scene):
|
||||
|
||||
|
||||
|
@ -1809,8 +1837,8 @@ class BrickRowScene(Scene):
|
|||
n = np.random.randint(1,10)
|
||||
seq = [np.random.choice(["H", "T"]) for j in range(n)]
|
||||
coin_seq = CoinSequence(seq).scale(1.5)
|
||||
loc = np.random.uniform(low = -1, high = 1) * FRAME_X_RADIUS * RIGHT
|
||||
loc += np.random.uniform(low = -1, high = 1) * FRAME_Y_RADIUS * UP
|
||||
loc = np.random.uniform(low = -10, high = 10) * RIGHT
|
||||
loc += np.random.uniform(low = -6, high = 6) * UP
|
||||
coin_seq.move_to(loc)
|
||||
|
||||
coin_seq.target = coin_seq.copy().scale(0.3).move_to(0.4 * loc)
|
||||
|
@ -1833,8 +1861,8 @@ class BrickRowScene(Scene):
|
|||
#
|
||||
# put tallies on top
|
||||
|
||||
self.single_flip_labels = VGroup(UprightHeads(), UprightTails())
|
||||
for (label, rect) in zip(self.single_flip_labels, self.row.rects):
|
||||
single_flip_labels = VGroup(UprightHeads(), UprightTails())
|
||||
for (label, rect) in zip(single_flip_labels, self.row.rects):
|
||||
label.next_to(rect, UP)
|
||||
self.play(FadeIn(label))
|
||||
self.wait()
|
||||
|
@ -1848,36 +1876,107 @@ class BrickRowScene(Scene):
|
|||
# self.play(FadeIn(label))
|
||||
# self.wait()
|
||||
|
||||
self.add_foreground_mobject(self.single_flip_labels)
|
||||
#self.add_foreground_mobject(single_flip_labels)
|
||||
self.wait()
|
||||
|
||||
return
|
||||
|
||||
# # # # # # # #
|
||||
# SECOND FLIP #
|
||||
# # # # # # # #
|
||||
|
||||
|
||||
|
||||
self.play(FlipCoin(randy))
|
||||
self.wait()
|
||||
|
||||
|
||||
self.play(
|
||||
SplitRectsInBrickWall(self.row)
|
||||
)
|
||||
self.wait()
|
||||
|
||||
|
||||
# split sequences
|
||||
single_flip_labels_copy = single_flip_labels.copy()
|
||||
self.add(single_flip_labels_copy)
|
||||
|
||||
|
||||
v = self.row.get_outcome_centers_for_level(2)[0] - single_flip_labels[0].get_center()
|
||||
self.play(
|
||||
single_flip_labels.shift, v
|
||||
)
|
||||
new_heads = VGroup(UprightHeads(), UprightHeads())
|
||||
for i in range(2):
|
||||
new_heads[i].move_to(single_flip_labels[i])
|
||||
new_heads[i].shift(COIN_SEQUENCE_SPACING * DOWN)
|
||||
self.play(FadeIn(new_heads))
|
||||
|
||||
v = self.row.get_outcome_centers_for_level(2)[-1] - single_flip_labels_copy[-1].get_center()
|
||||
self.play(
|
||||
single_flip_labels_copy.shift, v
|
||||
)
|
||||
new_tails = VGroup(UprightTails(), UprightTails())
|
||||
for i in range(2):
|
||||
new_tails[i].move_to(single_flip_labels_copy[i])
|
||||
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)):
|
||||
tally = DecimalTally(2-i, i)
|
||||
tally.next_to(rect, UP)
|
||||
decimal_tallies.add(tally)
|
||||
self.play(FadeIn(tally))
|
||||
self.wait()
|
||||
|
||||
self.add_foreground_mobject(single_flip_labels)
|
||||
self.add_foreground_mobject(new_heads)
|
||||
self.add_foreground_mobject(single_flip_labels_copy)
|
||||
self.add_foreground_mobject(new_tails)
|
||||
|
||||
# show individual outcomes
|
||||
outcomes = self.row.get_outcome_rects_for_level(2, with_labels = True)
|
||||
outcomes = self.row.get_outcome_rects_for_level(2, with_labels = False)
|
||||
|
||||
|
||||
self.play(
|
||||
LaggedStart(FadeIn, outcomes)
|
||||
)
|
||||
self.wait()
|
||||
self.play(
|
||||
LaggedStart(FadeOut, outcomes)
|
||||
LaggedStart(FadeOut, outcomes),
|
||||
)
|
||||
|
||||
self.play(
|
||||
FadeOut(single_flip_labels),
|
||||
FadeOut(new_heads),
|
||||
FadeOut(single_flip_labels_copy),
|
||||
FadeOut(new_tails)
|
||||
)
|
||||
|
||||
self.tallies = VGroup()
|
||||
for (i, rect) in enumerate(self.row.get_rects_for_level(2)):
|
||||
tally = TallyStack(2-i, i, show_decimals = False)
|
||||
tally.move_to(rect)
|
||||
self.tallies.add(tally)
|
||||
|
||||
|
||||
self.play(FadeIn(self.tallies))
|
||||
|
||||
anims = []
|
||||
for (decimal_tally, tally_stack) in zip(decimal_tallies, self.tallies):
|
||||
anims.append(ApplyFunction(
|
||||
tally_stack.position_decimal_tally, decimal_tally
|
||||
))
|
||||
|
||||
self.play(*anims)
|
||||
|
||||
# replace the original decimal tallies with
|
||||
# the ones that belong to the TallyStacks
|
||||
for (decimal_tally, tally_stack) in zip(decimal_tallies, self.tallies):
|
||||
self.remove(decimal_tally)
|
||||
tally_stack.position_decimal_tally(tally_stack.decimal_tally)
|
||||
tally_stack.add(tally_stack.decimal_tally)
|
||||
return
|
||||
|
||||
self.split_tallies_in_two_steps()
|
||||
self.wait()
|
||||
self.merge_rects_by_subdiv()
|
||||
|
|
Loading…
Add table
Reference in a new issue