2016-07-19 14:37:18 -07:00
|
|
|
|
2017-08-05 20:47:06 -07:00
|
|
|
from mobject.vectorized_mobject import VMobject, VGroup, VectorizedPoint
|
2016-07-19 14:37:18 -07:00
|
|
|
from mobject.tex_mobject import TexMobject
|
|
|
|
from animation import Animation
|
2017-09-06 20:18:19 -07:00
|
|
|
from animation.continual_animation import ContinualAnimation
|
2016-09-14 13:53:23 -07:00
|
|
|
from scene import Scene
|
2016-07-19 14:37:18 -07:00
|
|
|
from helpers import *
|
|
|
|
|
2016-07-21 11:00:45 -07:00
|
|
|
class DecimalNumber(VMobject):
|
2016-07-19 14:37:18 -07:00
|
|
|
CONFIG = {
|
|
|
|
"num_decimal_points" : 2,
|
2018-01-17 15:18:02 -08:00
|
|
|
"digit_to_digit_buff" : 0.05,
|
|
|
|
"show_ellipsis" : False
|
2016-07-19 14:37:18 -07:00
|
|
|
}
|
2017-10-12 17:38:25 -07:00
|
|
|
def __init__(self, number, **kwargs):
|
|
|
|
digest_config(self, kwargs, locals())
|
|
|
|
num_string = '%.*f'%(self.num_decimal_points, number)
|
2018-01-18 18:20:38 -08:00
|
|
|
negative_zero_string = "-%.*f"%(self.num_decimal_points, 0.)
|
|
|
|
if num_string == negative_zero_string:
|
|
|
|
num_string = num_string[1:]
|
2016-07-21 11:00:45 -07:00
|
|
|
VMobject.__init__(self, *[
|
|
|
|
TexMobject(char)
|
|
|
|
for char in num_string
|
|
|
|
], **kwargs)
|
2018-01-17 15:18:02 -08:00
|
|
|
|
|
|
|
if self.show_ellipsis:
|
|
|
|
self.add(TexMobject("\\dots"))
|
|
|
|
|
2016-07-19 14:37:18 -07:00
|
|
|
self.arrange_submobjects(
|
|
|
|
buff = self.digit_to_digit_buff,
|
|
|
|
aligned_edge = DOWN
|
|
|
|
)
|
2018-01-18 18:20:38 -08:00
|
|
|
if num_string.startswith("-"):
|
2016-07-19 14:37:18 -07:00
|
|
|
minus = self.submobjects[0]
|
|
|
|
minus.next_to(
|
|
|
|
self.submobjects[1], LEFT,
|
|
|
|
buff = self.digit_to_digit_buff
|
|
|
|
)
|
|
|
|
|
2017-05-12 14:55:30 -07:00
|
|
|
class Integer(VGroup):
|
2017-05-16 14:29:14 -07:00
|
|
|
CONFIG = {
|
|
|
|
"digit_buff" : 0.8*SMALL_BUFF
|
|
|
|
}
|
2017-05-12 14:55:30 -07:00
|
|
|
def __init__(self, integer, **kwargs):
|
2017-12-01 16:42:57 -08:00
|
|
|
self.number = integer
|
2017-05-12 14:55:30 -07:00
|
|
|
num_str = str(integer)
|
|
|
|
VGroup.__init__(self, *map(TexMobject, num_str), **kwargs)
|
|
|
|
self.arrange_submobjects(
|
2017-05-16 14:29:14 -07:00
|
|
|
RIGHT, buff = self.digit_buff, aligned_edge = DOWN
|
2017-05-12 14:55:30 -07:00
|
|
|
)
|
|
|
|
if num_str[0] == "-":
|
|
|
|
self[0].next_to(self[1], LEFT, buff = SMALL_BUFF)
|
|
|
|
|
2017-08-05 20:47:06 -07:00
|
|
|
class ChangingDecimal(Animation):
|
2016-07-19 14:37:18 -07:00
|
|
|
CONFIG = {
|
2017-10-26 21:30:24 -07:00
|
|
|
"num_decimal_points" : None,
|
2018-01-17 15:18:02 -08:00
|
|
|
"show_ellipsis" : None,
|
2017-08-05 20:47:06 -07:00
|
|
|
"spare_parts" : 2,
|
|
|
|
"position_update_func" : None,
|
2018-01-09 17:11:40 -08:00
|
|
|
"tracked_mobject" : None
|
2016-07-19 14:37:18 -07:00
|
|
|
}
|
2018-01-09 17:11:40 -08:00
|
|
|
def __init__(self, decimal_number_mobject, number_update_func, **kwargs):
|
2016-07-19 14:37:18 -07:00
|
|
|
digest_config(self, kwargs, locals())
|
2017-10-26 21:30:24 -07:00
|
|
|
if self.num_decimal_points is None:
|
2018-01-09 17:11:40 -08:00
|
|
|
self.num_decimal_points = decimal_number_mobject.num_decimal_points
|
2018-01-17 15:18:02 -08:00
|
|
|
if self.show_ellipsis is None:
|
|
|
|
self.show_ellipsis = decimal_number_mobject.show_ellipsis
|
2018-01-09 17:11:40 -08:00
|
|
|
decimal_number_mobject.add(*[
|
|
|
|
VectorizedPoint(decimal_number_mobject.get_corner(DOWN+LEFT))
|
2017-08-05 20:47:06 -07:00
|
|
|
for x in range(self.spare_parts)]
|
2016-07-19 14:37:18 -07:00
|
|
|
)
|
2018-01-09 17:11:40 -08:00
|
|
|
if self.tracked_mobject:
|
2018-01-17 22:18:05 -08:00
|
|
|
dmc = decimal_number_mobject.get_center()
|
|
|
|
tmc = self.tracked_mobject.get_center()
|
|
|
|
self.diff_from_tracked_mobject = dmc - tmc
|
2018-01-09 17:11:40 -08:00
|
|
|
Animation.__init__(self, decimal_number_mobject, **kwargs)
|
2017-08-05 20:47:06 -07:00
|
|
|
|
|
|
|
def update_mobject(self, alpha):
|
|
|
|
self.update_number(alpha)
|
|
|
|
self.update_position()
|
|
|
|
|
|
|
|
def update_number(self, alpha):
|
2018-01-09 17:11:40 -08:00
|
|
|
decimal = self.decimal_number_mobject
|
2017-10-12 17:38:25 -07:00
|
|
|
new_number = self.number_update_func(alpha)
|
2017-08-08 21:42:23 -07:00
|
|
|
new_decimal = DecimalNumber(
|
2018-01-17 15:18:02 -08:00
|
|
|
new_number,
|
|
|
|
num_decimal_points = self.num_decimal_points,
|
|
|
|
show_ellipsis = self.show_ellipsis
|
2017-08-08 21:42:23 -07:00
|
|
|
)
|
2017-08-05 20:47:06 -07:00
|
|
|
new_decimal.replace(decimal, dim_to_match = 1)
|
|
|
|
new_decimal.highlight(decimal.get_color())
|
2018-01-17 22:17:05 -08:00
|
|
|
|
|
|
|
decimal.submobjects = new_decimal.submobjects
|
|
|
|
decimal.number = new_number
|
2017-08-05 20:47:06 -07:00
|
|
|
|
|
|
|
def update_position(self):
|
|
|
|
if self.position_update_func is not None:
|
2018-01-09 17:11:40 -08:00
|
|
|
self.position_update_func(self.decimal_number_mobject)
|
2017-08-05 20:47:06 -07:00
|
|
|
elif self.tracked_mobject is not None:
|
2018-01-09 17:11:40 -08:00
|
|
|
self.decimal_number_mobject.move_to(self.tracked_mobject.get_center() + self.diff_from_tracked_mobject)
|
2017-08-05 20:47:06 -07:00
|
|
|
|
2018-01-16 15:51:19 -08:00
|
|
|
class ChangeDecimalToValue(ChangingDecimal):
|
2018-01-16 15:49:24 -08:00
|
|
|
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)
|
|
|
|
|
2017-09-06 20:18:19 -07:00
|
|
|
class ContinualChangingDecimal(ContinualAnimation):
|
2018-01-09 17:11:40 -08:00
|
|
|
def __init__(self, decimal_number_mobject, number_update_func, **kwargs):
|
|
|
|
self.anim = ChangingDecimal(decimal_number_mobject, number_update_func, **kwargs)
|
|
|
|
ContinualAnimation.__init__(self, decimal_number_mobject, **kwargs)
|
2017-09-06 20:18:19 -07:00
|
|
|
|
|
|
|
def update_mobject(self, dt):
|
|
|
|
self.anim.update(self.internal_time)
|
|
|
|
|
|
|
|
|
2017-08-05 20:47:06 -07:00
|
|
|
|
2017-09-06 20:18:19 -07:00
|
|
|
|
2017-08-05 20:47:06 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-09-14 13:53:23 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-07-19 14:37:18 -07:00
|
|
|
|
|
|
|
|