mirror of
https://github.com/3b1b/manim.git
synced 2025-04-13 09:47:07 +00:00
62 lines
2.4 KiB
Python
62 lines
2.4 KiB
Python
![]() |
from __future__ import absolute_import
|
||
|
|
||
|
from constants import *
|
||
|
|
||
|
from animation.animation import Animation
|
||
|
from mobject.numbers import DecimalNumber
|
||
|
from utils.bezier import interpolate
|
||
|
from utils.config_ops import digest_config
|
||
|
|
||
|
class ChangingDecimal(Animation):
|
||
|
CONFIG = {
|
||
|
"num_decimal_points" : None,
|
||
|
"show_ellipsis" : None,
|
||
|
"position_update_func" : None,
|
||
|
"tracked_mobject" : None,
|
||
|
}
|
||
|
def __init__(self, decimal_number_mobject, number_update_func, **kwargs):
|
||
|
digest_config(self, kwargs, locals())
|
||
|
self.decimal_number_config = dict(
|
||
|
decimal_number_mobject.initial_config
|
||
|
)
|
||
|
for attr in "num_decimal_points", "show_ellipsis":
|
||
|
value = getattr(self, attr)
|
||
|
if value is not None:
|
||
|
self.decimal_number_config[attr] = value
|
||
|
if hasattr(self.decimal_number_mobject, "background_rectangle"):
|
||
|
self.decimal_number_config["include_background_rectangle"] = True
|
||
|
if self.tracked_mobject:
|
||
|
dmc = decimal_number_mobject.get_center()
|
||
|
tmc = self.tracked_mobject.get_center()
|
||
|
self.diff_from_tracked_mobject = dmc - tmc
|
||
|
Animation.__init__(self, decimal_number_mobject, **kwargs)
|
||
|
|
||
|
def update_mobject(self, alpha):
|
||
|
self.update_number(alpha)
|
||
|
self.update_position()
|
||
|
|
||
|
def update_number(self, alpha):
|
||
|
decimal = self.decimal_number_mobject
|
||
|
new_number = self.number_update_func(alpha)
|
||
|
new_decimal = DecimalNumber(
|
||
|
new_number, **self.decimal_number_config
|
||
|
)
|
||
|
new_decimal.match_height(decimal)
|
||
|
new_decimal.move_to(decimal)
|
||
|
new_decimal.match_style(decimal)
|
||
|
|
||
|
decimal.submobjects = new_decimal.submobjects
|
||
|
decimal.number = new_number
|
||
|
|
||
|
def update_position(self):
|
||
|
if self.position_update_func is not None:
|
||
|
self.position_update_func(self.decimal_number_mobject)
|
||
|
elif self.tracked_mobject is not None:
|
||
|
self.decimal_number_mobject.move_to(self.tracked_mobject.get_center() + self.diff_from_tracked_mobject)
|
||
|
|
||
|
class ChangeDecimalToValue(ChangingDecimal):
|
||
|
def __init__(self, decimal_number_mobject, target_number, **kwargs):
|
||
|
start_number = decimal_number_mobject.number
|
||
|
func = lambda alpha : interpolate(start_number, target_number, alpha)
|
||
|
ChangingDecimal.__init__(self, decimal_number_mobject, func, **kwargs)
|