Exemplo n.º 1
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(), consts.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(), consts.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)))

            area.become(new_area)
            left_v_line.become(new_left_v_line)
            right_v_line.become(new_right_v_line)
            return group
Exemplo n.º 2
0
 def interpolate_color(self, mobject1, mobject2, alpha):
     self.rgbas = interpolate(mobject1.rgbas, mobject2.rgbas, alpha)
     self.set_stroke_width(
         interpolate(
             mobject1.get_stroke_width(),
             mobject2.get_stroke_width(),
             alpha,
         ))
     return self
Exemplo n.º 3
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)
     group.become(new_group)
     return group
Exemplo n.º 4
0
def random_bright_color():
    color = random_color()
    curr_rgb = color_to_rgb(color)
    new_rgb = interpolate(
        curr_rgb, np.ones(len(curr_rgb)), 0.5
    )
    return colour.Color(rgb=new_rgb)
Exemplo n.º 5
0
 def add_line_to(self, point):
     nppcc = self.n_points_per_cubic_curve
     self.add_cubic_bezier_curve_to(*[
         interpolate(self.get_last_point(), point, a)
         for a in np.linspace(0, 1, nppcc)[1:]
     ])
     return self
Exemplo n.º 6
0
 def interpolate_submobject(self, submobject, starting_sumobject, alpha):
     submobject.points[:, :] = starting_sumobject.points
     submobject.scale(interpolate(1, self.scale_value,
                                  there_and_back(alpha)),
                      about_point=self.get_scale_about_point())
     submobject.rotate(wiggle(alpha, self.n_wiggles) * self.rotation_angle,
                       about_point=self.get_rotate_about_point())
Exemplo n.º 7
0
 def get_bounds(self, alpha):
     tw = self.time_width
     upper = interpolate(0, 1 + tw, alpha)
     lower = upper - tw
     upper = min(upper, 1)
     lower = max(lower, 0)
     return lower, upper
Exemplo n.º 8
0
def straight_path(start_points, end_points, alpha):
    """
    Same function as interpolate, but renamed to reflect
    intent of being used to determine how a set of points move
    to another set.  For instance, it should be a specific case
    of path_along_arc
    """
    return interpolate(start_points, end_points, alpha)
Exemplo n.º 9
0
 def set_points_as_corners(self, points):
     nppcc = self.n_points_per_cubic_curve
     points = np.array(points)
     self.set_anchors_and_handles(*[
         interpolate(points[:-1], points[1:], a)
         for a in np.linspace(0, 1, nppcc)
     ])
     return self
Exemplo n.º 10
0
    def point_to_number(self, point):
        start_point, end_point = self.get_start_and_end()
        full_vect = end_point - start_point
        unit_vect = normalize(full_vect)

        def distance_from_start(p):
            return np.dot(p - start_point, unit_vect)

        proportion = fdiv(distance_from_start(point),
                          distance_from_start(end_point))
        return interpolate(self.x_min, self.x_max, proportion)
Exemplo n.º 11
0
 def add_line(self, start, end, color=None):
     start, end = list(map(np.array, [start, end]))
     length = get_norm(end - start)
     if length == 0:
         points = [start]
     else:
         epsilon = self.epsilon / length
         points = [
             interpolate(start, end, t) for t in np.arange(0, 1, epsilon)
         ]
     self.add_points(points, color=color)
Exemplo n.º 12
0
 def func(values):
     alphas = inverse_interpolate(
         min_value, max_value, np.array(values)
     )
     alphas = np.clip(alphas, 0, 1)
     # if flip_alphas:
     #     alphas = 1 - alphas
     scaled_alphas = alphas * (len(rgbs) - 1)
     indices = scaled_alphas.astype(int)
     next_indices = np.clip(indices + 1, 0, len(rgbs) - 1)
     inter_alphas = scaled_alphas % 1
     inter_alphas = inter_alphas.repeat(3).reshape((len(indices), 3))
     result = interpolate(rgbs[indices], rgbs[next_indices], inter_alphas)
     return result
Exemplo n.º 13
0
 def build_animations_with_timings(self):
     """
     Creates a list of triplets of the form
     (anim, start_time, end_time)
     """
     self.anims_with_timings = []
     curr_time = 0
     for anim in self.animations:
         start_time = curr_time
         end_time = start_time + anim.run_time
         self.anims_with_timings.append((anim, start_time, end_time))
         # Start time of next animation is based on
         # the lag_ratio
         curr_time = interpolate(start_time, end_time, self.lag_ratio)
Exemplo n.º 14
0
def color_gradient(reference_colors, length_of_output):
    if length_of_output == 0:
        return reference_colors[0]
    rgbs = list(map(color_to_rgb, reference_colors))
    alphas = np.linspace(0, (len(rgbs) - 1), length_of_output)
    floors = alphas.astype('int')
    alphas_mod1 = alphas % 1
    # End edge case
    alphas_mod1[-1] = 1
    floors[-1] = len(rgbs) - 2
    return [
        rgb_to_color(interpolate(rgbs[i], rgbs[i + 1], alpha))
        for i, alpha in zip(floors, alphas_mod1)
    ]
Exemplo n.º 15
0
 def change_anchor_mode(self, mode):
     assert (mode in ["jagged", "smooth"])
     nppcc = self.n_points_per_cubic_curve
     for submob in self.family_members_with_points():
         subpaths = submob.get_subpaths()
         submob.clear_points()
         for subpath in subpaths:
             anchors = np.append(
                 subpath[::nppcc],
                 subpath[-1:],
                 0
             )
             if mode == "smooth":
                 h1, h2 = get_smooth_handle_points(anchors)
             elif mode == "jagged":
                 a1 = anchors[:-1]
                 a2 = anchors[1:]
                 h1 = interpolate(a1, a2, 1.0 / 3)
                 h2 = interpolate(a1, a2, 2.0 / 3)
             new_subpath = np.array(subpath)
             new_subpath[1::nppcc] = h1
             new_subpath[2::nppcc] = h2
             submob.append_points(new_subpath)
     return self
Exemplo n.º 16
0
    def get_number_design(self, value, symbol):
        num = int(value)
        n_rows = {
            2: 2,
            3: 3,
            4: 2,
            5: 2,
            6: 3,
            7: 3,
            8: 3,
            9: 4,
            10: 4,
        }[num]
        n_cols = 1 if num in [2, 3] else 2
        insertion_indices = {
            5: [0],
            7: [0],
            8: [0, 1],
            9: [1],
            10: [0, 2],
        }.get(num, [])

        top = self.get_top() + symbol.get_height() * consts.DOWN
        bottom = self.get_bottom() + symbol.get_height() * consts.UP
        column_points = [
            interpolate(top, bottom, alpha)
            for alpha in np.linspace(0, 1, n_rows)
        ]

        design = VGroup(*[
            symbol.copy().move_to(point)
            for point in column_points
        ])
        if n_cols == 2:
            space = 0.2 * self.get_width()
            column_copy = design.copy().shift(space * consts.RIGHT)
            design.shift(space * consts.LEFT)
            design.add(*column_copy)
        design.add(*[
            symbol.copy().move_to(
                center_of_mass(column_points[i:i + 2])
            )
            for i in insertion_indices
        ])
        for symbol in design:
            if symbol.get_center()[1] < self.get_center()[1]:
                symbol.rotate_in_place(np.pi)
        return design
Exemplo n.º 17
0
    def set_colors_by_radial_gradient(self,
                                      center=None,
                                      radius=1,
                                      inner_color=Color('WHITE'),
                                      outer_color=Color('BLACK')):
        start_rgba, end_rgba = list(
            map(color_to_rgba, [inner_color, outer_color]))
        if center is None:
            center = self.get_center()
        for mob in self.family_members_with_points():
            num_points = mob.get_num_points()
            t = min(1, np.abs(mob.get_center() - center) / radius)

            mob.rgbas = np.array([interpolate(start_rgba, end_rgba, t)] *
                                 num_points)
        return self
Exemplo n.º 18
0
 def interpolate_color(self, mobject1, mobject2, alpha):
     attrs = [
         "fill_rgbas",
         "stroke_rgbas",
         "background_stroke_rgbas",
         "stroke_width",
         "background_stroke_width",
         "sheen_direction",
         "sheen_factor",
     ]
     for attr in attrs:
         setattr(self, attr, interpolate(
             getattr(mobject1, attr),
             getattr(mobject2, attr),
             alpha
         ))
         if alpha == 1.0:
             setattr(self, attr, getattr(mobject2, attr))
Exemplo n.º 19
0
 def __init__(self, decimal_mob, target_number, **kwargs):
     start_number = decimal_mob.number
     super().__init__(decimal_mob,
                      lambda a: interpolate(start_number, target_number, a),
                      **kwargs)
Exemplo n.º 20
0
 def interpolate_color(self, mobject1, mobject2, alpha):
     assert (mobject1.pixel_array.shape == mobject2.pixel_array.shape)
     self.pixel_array = interpolate(mobject1.pixel_array,
                                    mobject2.pixel_array,
                                    alpha).astype(self.pixel_array_dtype)
Exemplo n.º 21
0
 def interpolate_submobject(self, submob, start, alpha):
     submob.set_stroke(
         opacity=interpolate(0, start.get_stroke_opacity(), alpha))
     submob.set_fill(
         opacity=interpolate(0, start.get_fill_opacity(), alpha))
Exemplo n.º 22
0
 def number_to_point(self, number):
     alpha = float(number - self.x_min) / (self.x_max - self.x_min)
     return interpolate(self.get_start(), self.get_end(), alpha)
Exemplo n.º 23
0
 def parameterized_function(alpha):
     x = interpolate(x_min, x_max, alpha)
     y = func(x)
     if not np.isfinite(y):
         y = self.y_max
     return self.coords_to_point(x, y)
Exemplo n.º 24
0
def interpolate_color(color1, color2, alpha):
    rgb = interpolate(color_to_rgb(color1), color_to_rgb(color2), alpha)
    return rgb_to_color(rgb)
Exemplo n.º 25
0
 def fade_to(self, color, alpha):
     self.rgbas = interpolate(self.rgbas, color_to_rgba(color), alpha)
     for mob in self.submobjects:
         mob.fade_to(color, alpha)
     return self
Exemplo n.º 26
0
    def add_spikes(self):
        layers = VGroup()
        radii = np.linspace(
            self.outer_radius,
            self.pupil_radius,
            self.n_spike_layers,
            endpoint=False,
        )
        radii[:2] = radii[1::-1]  # Swap first two
        if self.n_spike_layers > 2:
            radii[-1] = interpolate(
                radii[-1], self.pupil_radius, 0.25
            )

        for radius in radii:
            tip_angle = self.spike_angle
            half_base = radius * np.tan(tip_angle)
            triangle, right_half_triangle = [
                Polygon(
                    radius * consts.UP,
                    half_base * consts.RIGHT,
                    vertex3,
                    fill_opacity=1,
                    stroke_width=0,
                )
                for vertex3 in (half_base * consts.LEFT, consts.ORIGIN,)
            ]
            left_half_triangle = right_half_triangle.copy()
            left_half_triangle.flip(consts.UP, about_point=consts.ORIGIN)

            n_spikes = self.n_spikes
            full_spikes = [
                triangle.copy().rotate(
                    -angle,
                    about_point=consts.ORIGIN
                )
                for angle in np.linspace(
                    0, consts.TAU, n_spikes, endpoint=False
                )
            ]
            index = (3 * n_spikes) // 4
            if radius == radii[0]:
                layer = VGroup(*full_spikes)
                layer.rotate(
                    -consts.TAU / n_spikes / 2,
                    about_point=consts.ORIGIN
                )
                layer.brown_index = index
            else:
                half_spikes = [
                    right_half_triangle.copy(),
                    left_half_triangle.copy().rotate(
                        90 * consts.DEGREES, about_point=consts.ORIGIN,
                    ),
                    right_half_triangle.copy().rotate(
                        90 * consts.DEGREES, about_point=consts.ORIGIN,
                    ),
                    left_half_triangle.copy()
                ]
                layer = VGroup(*it.chain(
                    half_spikes[:1],
                    full_spikes[1:index],
                    half_spikes[1:3],
                    full_spikes[index + 1:],
                    half_spikes[3:],
                ))
                layer.brown_index = index + 1

            layers.add(layer)

        # Color spikes
        blues = self.blue_spike_colors
        browns = self.brown_spike_colors
        for layer, blue, brown in zip(layers, blues, browns):
            index = layer.brown_index
            layer[:index].set_color(blue)
            layer[index:].set_color(brown)

        self.spike_layers = layers
        self.add(layers)