mirror of
https://github.com/3b1b/manim.git
synced 2025-07-29 21:12:35 +08:00
112 lines
2.9 KiB
Python
112 lines
2.9 KiB
Python
from mobject.geometry import *
|
|
from mobject.svg.tex_mobject import *
|
|
from active_projects.eop.reusables.upright_coins import *
|
|
|
|
|
|
class CoinStack(VGroup):
|
|
CONFIG = {
|
|
"coin_thickness": COIN_THICKNESS,
|
|
"size": 5,
|
|
"face": FlatCoin,
|
|
}
|
|
|
|
def generate_points(self):
|
|
for n in range(self.size):
|
|
coin = self.face(thickness = self.coin_thickness)
|
|
coin.shift(n * self.coin_thickness * UP)
|
|
self.add(coin)
|
|
if self.size == 0:
|
|
point = VectorizedPoint()
|
|
self.add(point)
|
|
|
|
class HeadsStack(CoinStack):
|
|
CONFIG = {
|
|
"face": FlatHeads
|
|
}
|
|
|
|
class TailsStack(CoinStack):
|
|
CONFIG = {
|
|
"face": FlatTails
|
|
}
|
|
|
|
|
|
|
|
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 TallyStack(VGroup):
|
|
CONFIG = {
|
|
"coin_thickness": COIN_THICKNESS,
|
|
"show_decimals": True
|
|
}
|
|
|
|
def __init__(self, h, t, anchor = ORIGIN, **kwargs):
|
|
self.nb_heads = h
|
|
self.nb_tails = t
|
|
self.anchor = anchor
|
|
VGroup.__init__(self,**kwargs)
|
|
|
|
def generate_points(self):
|
|
stack1 = HeadsStack(size = self.nb_heads, coin_thickness = self.coin_thickness)
|
|
stack2 = TailsStack(size = self.nb_tails, coin_thickness = self.coin_thickness)
|
|
stack1.next_to(self.anchor, LEFT, buff = 0.5 * SMALL_BUFF)
|
|
stack2.next_to(self.anchor, RIGHT, buff = 0.5 * SMALL_BUFF)
|
|
stack1.align_to(self.anchor, DOWN)
|
|
stack2.align_to(self.anchor, DOWN)
|
|
self.heads_stack = stack1
|
|
self.tails_stack = stack2
|
|
self.add(stack1, stack2)
|
|
self.background_rect = background_rect = RoundedRectangle(
|
|
width = TALLY_BACKGROUND_WIDTH,
|
|
height = TALLY_BACKGROUND_WIDTH,
|
|
corner_radius = 0.1,
|
|
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)
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|