Пример #1
0
    def get_division_change_animations(
        self, sample_space, parts, p_list,
        dimension=1,
        new_label_kwargs=None,
        **kwargs
    ):
        if new_label_kwargs is None:
            new_label_kwargs = {}
        anims = []
        p_list = sample_space.complete_p_list(p_list)
        space_copy = sample_space.copy()

        vect = DOWN if dimension == 1 else RIGHT
        parts.generate_target()
        for part, p in zip(parts.target, p_list):
            part.replace(space_copy, stretch=True)
            part.stretch(p, dimension)
        parts.target.arrange_submobjects(vect, buff=0)
        parts.target.move_to(space_copy)
        anims.append(MoveToTarget(parts))
        if hasattr(parts, "labels") and parts.labels is not None:
            label_kwargs = parts.label_kwargs
            label_kwargs.update(new_label_kwargs)
            new_braces, new_labels = sample_space.get_subdivision_braces_and_labels(
                parts.target, **label_kwargs
            )
            anims += [
                Transform(parts.braces, new_braces),
                Transform(parts.labels, new_labels),
            ]
        return anims
Пример #2
0
        def update_group(group, alpha):
            area, left_v_line, left_T_label, right_v_line, right_T_label = group
            t_min = interpolate(curr_t_min, new_t_min, alpha)
            t_max = interpolate(curr_t_max, new_t_max, alpha)
            new_area = self.get_area(graph, t_min, t_max)

            new_left_v_line = self.get_vertical_line_to_graph(t_min, graph)
            new_left_v_line.set_color(left_v_line.get_color())
            left_T_label.move_to(new_left_v_line.get_bottom(), UP)

            new_right_v_line = self.get_vertical_line_to_graph(t_max, graph)
            new_right_v_line.set_color(right_v_line.get_color())
            right_T_label.move_to(new_right_v_line.get_bottom(), UP)

            # Fade close to 0
            if fade_close_to_origin:
                if len(left_T_label) > 0:
                    left_T_label[0].set_fill(opacity=min(1, np.abs(t_min)))
                if len(right_T_label) > 0:
                    right_T_label[0].set_fill(opacity=min(1, np.abs(t_max)))

            Transform(area, new_area).update(1)
            Transform(left_v_line, new_left_v_line).update(1)
            Transform(right_v_line, new_right_v_line).update(1)
            return group
Пример #3
0
 def __init__(self, mobject, **kwargs):
     target = mobject.copy()
     Transform.__init__(self, mobject, target, **kwargs)
     self.starting_mobject.fade(1)
     if isinstance(self.starting_mobject, VMobject):
         self.starting_mobject.set_stroke(width=0)
         self.starting_mobject.set_fill(opacity=0)
Пример #4
0
 def __init__(self, mobject, direction=None, **kwargs):
     digest_config(self, kwargs)
     target = mobject.copy()
     if direction is None:
         direction = self.direction
     mobject.shift(direction)
     mobject.fade(1)
     Transform.__init__(self, mobject, target, **kwargs)
Пример #5
0
 def __init__(self, mobject, point, **kwargs):
     digest_config(self, kwargs)
     target = mobject.copy()
     point_mob = VectorizedPoint(point)
     if self.point_color:
         point_mob.set_color(self.point_color)
     mobject.replace(point_mob)
     mobject.set_color(point_mob.get_color())
     Transform.__init__(self, mobject, target, **kwargs)
Пример #6
0
    def __init__(self, mobject_or_point, **kwargs):
        digest_config(self, kwargs)
        big_dot = Dot(
            radius=FRAME_X_RADIUS + FRAME_Y_RADIUS,
            stroke_width=0,
            fill_color=self.color,
            fill_opacity=0,
        )
        little_dot = Dot(radius=0)
        little_dot.set_fill(self.color, opacity=self.opacity)
        little_dot.move_to(mobject_or_point)

        Transform.__init__(self, big_dot, little_dot, **kwargs)
Пример #7
0
 def __init__(self, mobject, angle=np.pi, axis=OUT, **kwargs):
     if "path_arc" not in kwargs:
         kwargs["path_arc"] = angle
     if "path_arc_axis" not in kwargs:
         kwargs["path_arc_axis"] = axis
     digest_config(self, kwargs, locals())
     target = mobject.copy()
     if self.in_place:
         self.about_point = mobject.get_center()
     target.rotate(
         angle,
         axis=axis,
         about_point=self.about_point,
     )
     Transform.__init__(self, mobject, target, **kwargs)
Пример #8
0
    def animate_product(self, left, right, result):
        l_matrix = left.get_mob_matrix()
        r_matrix = right.get_mob_matrix()
        result_matrix = result.get_mob_matrix()
        circle = Circle(radius=l_matrix[0][0].get_height(), color=GREEN)
        circles = VGroup(*[
            entry.get_point_mobject()
            for entry in (l_matrix[0][0], r_matrix[0][0])
        ])
        (m, k), n = l_matrix.shape, r_matrix.shape[1]
        for mob in result_matrix.flatten():
            mob.set_color(BLACK)
        lagging_anims = []
        for a in range(m):
            for b in range(n):
                for c in range(k):
                    l_matrix[a][c].set_color(YELLOW)
                    r_matrix[c][b].set_color(YELLOW)
                for c in range(k):
                    start_parts = VGroup(l_matrix[a][c].copy(),
                                         r_matrix[c][b].copy())
                    result_entry = result_matrix[a][b].split()[c]

                    new_circles = VGroup(*[
                        circle.copy().shift(part.get_center())
                        for part in start_parts.split()
                    ])
                    self.play(Transform(circles, new_circles))
                    self.play(
                        Transform(
                            start_parts,
                            result_entry.copy().set_color(YELLOW),
                            path_arc=-np.pi / 2,
                            submobject_mode="all_at_once",
                        ), *lagging_anims)
                    result_entry.set_color(YELLOW)
                    self.remove(start_parts)
                    lagging_anims = [
                        ApplyMethod(result_entry.set_color, WHITE)
                    ]

                for c in range(k):
                    l_matrix[a][c].set_color(WHITE)
                    r_matrix[c][b].set_color(WHITE)
        self.play(FadeOut(circles), *lagging_anims)
        self.wait()
Пример #9
0
 def update_func(group, alpha):
     dx = interpolate(start_dx, target_dx, alpha)
     x = interpolate(start_x, target_x, alpha)
     kwargs = dict(secant_slope_group.kwargs)
     kwargs["dx"] = dx
     kwargs["x"] = x
     new_group = self.get_secant_slope_group(**kwargs)
     Transform(group, new_group).update(1)
     return group
Пример #10
0
    def show_ghost_movement(self, vector):
        if isinstance(vector, Arrow):
            vector = vector.get_end() - vector.get_start()
        elif len(vector) == 2:
            vector = np.append(np.array(vector), 0.0)
        x_max = int(FRAME_X_RADIUS + abs(vector[0]))
        y_max = int(FRAME_Y_RADIUS + abs(vector[1]))
        dots = VMobject(*[
            Dot(x * RIGHT + y * UP) for x in range(-x_max, x_max)
            for y in range(-y_max, y_max)
        ])
        dots.set_fill(BLACK, opacity=0)
        dots_halfway = dots.copy().shift(vector / 2).set_fill(WHITE, 1)
        dots_end = dots.copy().shift(vector)

        self.play(Transform(dots, dots_halfway, rate_func=rush_into))
        self.play(Transform(dots, dots_end, rate_func=rush_from))
        self.remove(dots)
Пример #11
0
 def blink_anim(self, **kwargs):
     target = self.copy()
     bottom_y = self.get_bottom()[1]
     for submob in target:
         submob.apply_function(
             lambda p: [p[0], bottom_y, p[2]]
         )
     if "rate_func" not in kwargs:
         kwargs["rate_func"] = squish_rate_func(there_and_back)
     return Transform(self, target, **kwargs)
Пример #12
0
    def vector_to_coords(self, vector, integer_labels=True, clean_up=True):
        starting_mobjects = list(self.mobjects)
        show_creation = False
        if isinstance(vector, Arrow):
            arrow = vector
            vector = arrow.get_end()[:2]
        else:
            arrow = Vector(vector)
            show_creation = True
        array = vector_coordinate_label(arrow, integer_labels=integer_labels)
        x_line = Line(ORIGIN, vector[0] * RIGHT)
        y_line = Line(x_line.get_end(), arrow.get_end())
        x_line.set_color(X_COLOR)
        y_line.set_color(Y_COLOR)
        x_coord, y_coord = array.get_mob_matrix().flatten()
        x_coord_start = self.position_x_coordinate(x_coord.copy(), x_line,
                                                   vector)
        y_coord_start = self.position_y_coordinate(y_coord.copy(), y_line,
                                                   vector)
        brackets = array.get_brackets()

        if show_creation:
            self.play(ShowCreation(arrow))
        self.play(ShowCreation(x_line), Write(x_coord_start), run_time=1)
        self.play(ShowCreation(y_line), Write(y_coord_start), run_time=1)
        self.wait()
        self.play(
            Transform(x_coord_start, x_coord, submobject_mode="all_at_once"),
            Transform(y_coord_start, y_coord, submobject_mode="all_at_once"),
            Write(brackets, run_time=1),
        )
        self.wait()

        self.remove(x_coord_start, y_coord_start, brackets)
        self.add(array)
        if clean_up:
            self.clear()
            self.add(*starting_mobjects)
        return array, x_line, y_line
Пример #13
0
 def update_sectors(self):
     if self.screen is None:
         return
     for submob in self.submobjects:
         if type(submob) == AnnularSector:
             lower_angle, upper_angle = self.viewing_angles(self.screen)
             # dr = submob.outer_radius - submob.inner_radius
             dr = self.radius / self.num_levels
             new_submob = self.new_sector(submob.inner_radius, dr,
                                          lower_angle, upper_angle)
             # submob.points = new_submob.points
             # submob.set_fill(opacity = 10 * self.opacity_function(submob.outer_radius))
             Transform(submob, new_submob).update(1)
Пример #14
0
 def get_student_changes(self, *modes, **kwargs):
     pairs = list(zip(self.get_students(), modes))
     pairs = [(s, m) for s, m in pairs if m is not None]
     start = VGroup(*[s for s, m in pairs])
     target = VGroup(*[s.copy().change_mode(m) for s, m in pairs])
     if "look_at_arg" in kwargs:
         for pi in target:
             pi.look_at(kwargs["look_at_arg"])
     submobject_mode = kwargs.get("submobject_mode", "lagged_start")
     return Transform(
         start, target,
         submobject_mode=submobject_mode,
         run_time=2
     )
Пример #15
0
 def change_mode(self, mode):
     new_self = self.__class__(
         mode=mode,
     )
     new_self.match_style(self)
     new_self.match_height(self)
     if self.is_flipped() != new_self.is_flipped():
         new_self.flip()
     new_self.shift(self.eyes.get_center() - new_self.eyes.get_center())
     if hasattr(self, "purposeful_looking_direction"):
         new_self.look(self.purposeful_looking_direction)
     Transform(self, new_self).update(1)
     self.mode = mode
     return self
Пример #16
0
 def transform_between_riemann_rects(self, curr_rects, new_rects, **kwargs):
     transform_kwargs = {"run_time": 2, "submobject_mode": "lagged_start"}
     added_anims = kwargs.get("added_anims", [])
     transform_kwargs.update(kwargs)
     curr_rects.align_submobjects(new_rects)
     x_coords = set()  # Keep track of new repetitions
     for rect in curr_rects:
         x = rect.get_center()[0]
         if x in x_coords:
             rect.set_fill(opacity=0)
         else:
             x_coords.add(x)
     self.play(Transform(curr_rects, new_rects, **transform_kwargs),
               *added_anims)
Пример #17
0
 def get_digit_increment_animations(self):
     result = []
     self.number += 1
     is_next_digit = self.is_next_digit()
     if is_next_digit:
         self.max_place += 1
     new_number_mob = self.get_number_mob(self.number)
     new_number_mob.move_to(self.number_mob, RIGHT)
     if is_next_digit:
         self.add_configuration()
         place = len(new_number_mob.split()) - 1
         result.append(FadeIn(self.dot_templates[place]))
         arrow = Arrow(
             new_number_mob[place].get_top(),
             self.dot_templates[place].get_bottom(),
             color=self.digit_place_colors[place]
         )
         self.arrows.add(arrow)
         result.append(ShowCreation(arrow))
     result.append(Transform(
         self.number_mob, new_number_mob,
         submobject_mode="lagged_start"
     ))
     return result
Пример #18
0
 def get_piece_movement(self, pieces):
     start = VMobject(*pieces)
     target = VMobject(*[mob.target for mob in pieces])
     if self.leave_ghost_vectors:
         self.add(start.copy().fade(0.7))
     return Transform(start, target, submobject_mode="all_at_once")
Пример #19
0
 def clean_up(self, surrounding_scene=None):
     Transform.clean_up(self, surrounding_scene)
     self.update(0)
Пример #20
0
 def look_at_anim(self, point_or_mobject, **kwargs):
     self.thing_looked_at = point_or_mobject
     return Transform(
         self, self.get_eyes(thing_to_look_at=point_or_mobject),
         **kwargs
     )
Пример #21
0
 def __init__(self, mobject, **kwargs):
     digest_config(self, kwargs)
     target = mobject.copy()
     target.scale_in_place(self.scale_factor)
     target.set_color(self.color)
     Transform.__init__(self, mobject, target, **kwargs)
Пример #22
0
 def transition_between_states(self, start_state, target_state, **kwargs):
     self.play(Transform(start_state, target_state, **kwargs))
     self.wait()
Пример #23
0
 def __init__(self, mobject, **kwargs):
     mob_copy = mobject.copy()
     mob_copy.reverse_points()
     Transform.__init__(self, mobject, mob_copy, **kwargs)
Пример #24
0
 def __init__(self, mobject, **kwargs):
     target = mobject.copy()
     target.fade(1)
     Transform.__init__(self, mobject, target, **kwargs)
Пример #25
0
 def change_mode_anim(self, mode, **kwargs):
     self.mode = mode
     return Transform(self, self.get_eyes(mode=mode), **kwargs)
Пример #26
0
 def update_rects(rects):
     new_rects = self.get_posterior_rectangles()
     Transform(rects, new_rects).update(1)
     if hasattr(rects, "braces"):
         self.update_posterior_braces(rects)
     return rects
Пример #27
0
 def __init__(self, mobject, **kwargs):
     Transform.__init__(self, mobject, mobject.get_point_mobject(),
                        **kwargs)