Ejemplo n.º 1
0
    def add_bars(self, values):
        buff = float(self.width) / (2 * len(values) + 1)
        bars = VGroup()
        for i, value in enumerate(values):
            bar = Rectangle(
                height=(value / self.max_value) * self.height,
                width=buff,
                stroke_width=self.bar_stroke_width,
                fill_opacity=self.bar_fill_opacity,
            )
            bar.move_to((2 * i + 1) * buff * consts.RIGHT,
                        consts.DOWN + consts.LEFT)
            bars.add(bar)
        bars.set_color_by_gradient(*self.bar_colors)

        bar_labels = VGroup()
        for bar, name in zip(bars, self.bar_names):
            label = TexMobject(str(name))
            label.scale(self.bar_label_scale_val)
            label.next_to(bar, consts.DOWN, consts.SMALL_BUFF)
            bar_labels.add(label)

        self.add(bars, bar_labels)
        self.bars = bars
        self.bar_labels = bar_labels
Ejemplo n.º 2
0
    def add_T_label(self, x_val, side=consts.RIGHT, label=None, color=Color('WHITE'), animated=False, **kwargs):
        triangle = RegularPolygon(n=3, start_angle=np.pi / 2)
        triangle.set_height(consts.MED_SMALL_BUFF)
        triangle.move_to(self.coords_to_point(x_val, 0), consts.UP)
        triangle.set_fill(color, 1)
        triangle.set_stroke(width=0)
        if label is None:
            T_label = TexMobject(self.variable_point_label, fill_color=color)
        else:
            T_label = TexMobject(label, fill_color=color)

        T_label.next_to(triangle, consts.DOWN)
        v_line = self.get_vertical_line_to_graph(
            x_val, self.v_graph,
            color=Color('YELLOW')
        )

        if animated:
            self.play(
                DrawBorderThenFill(triangle),
                ShowCreation(v_line),
                Write(T_label, run_time=1),
                **kwargs
            )

        if np.all(side == consts.LEFT):
            self.left_T_label_group = VGroup(T_label, triangle)
            self.left_v_line = v_line
            self.add(self.left_T_label_group, self.left_v_line)
        elif np.all(side == consts.RIGHT):
            self.right_T_label_group = VGroup(T_label, triangle)
            self.right_v_line = v_line
            self.add(self.right_T_label_group, self.right_v_line)
Ejemplo n.º 3
0
    def get_mobjects_from(self, element):
        result = []
        if not isinstance(element, minidom.Element):
            return result
        if element.tagName == 'defs':
            self.update_ref_to_element(element)
        elif element.tagName == 'style':
            pass  # TODO, handle style
        elif element.tagName in ['g', 'svg', 'symbol']:
            result += it.chain(*[
                self.get_mobjects_from(child) for child in element.childNodes
            ])
        elif element.tagName == 'path':
            result.append(
                self.path_string_to_mobject(element.getAttribute('d')))
        elif element.tagName == 'use':
            result += self.use_to_mobjects(element)
        elif element.tagName == 'rect':
            result.append(self.rect_to_mobject(element))
        elif element.tagName == 'circle':
            result.append(self.circle_to_mobject(element))
        elif element.tagName == 'ellipse':
            result.append(self.ellipse_to_mobject(element))
        elif element.tagName in ['polygon', 'polyline']:
            result.append(self.polygon_to_mobject(element))
        else:
            pass  # TODO
            # warnings.warn("Unknown element type: " + element.tagName)
        result = [m for m in result if m is not None]
        self.handle_transforms(element, VGroup(*result))
        if len(result) > 1 and not self.unpack_groups:
            result = [VGroup(*result)]

        return result
Ejemplo n.º 4
0
    def get_corner_numbers(self, value, symbol):
        value_mob = TextMobject(value)
        width = self.get_width() / self.card_width_to_corner_num_width
        height = self.get_height() / self.card_height_to_corner_num_height
        value_mob.set_width(width)
        value_mob.stretch_to_fit_height(height)
        value_mob.next_to(
            self.get_corner(
                consts.UP +
                consts.LEFT),
            consts.DOWN +
            consts.RIGHT,
            buff=consts.MED_LARGE_BUFF *
            width)
        value_mob.set_color(symbol.get_color())
        corner_symbol = symbol.copy()
        corner_symbol.set_width(width)
        corner_symbol.next_to(
            value_mob, consts.DOWN,
            buff=consts.MED_SMALL_BUFF * width
        )
        corner_group = VGroup(value_mob, corner_symbol)
        opposite_corner_group = corner_group.copy()
        opposite_corner_group.rotate(
            np.pi, about_point=self.get_center()
        )

        return VGroup(corner_group, opposite_corner_group)
Ejemplo n.º 5
0
    def get_subdivision_braces_and_labels(self,
                                          parts,
                                          labels,
                                          direction,
                                          buff=consts.SMALL_BUFF,
                                          min_num_quads=1):
        label_mobs = VGroup()
        braces = VGroup()
        for label, part in zip(labels, parts):
            brace = Brace(part,
                          direction,
                          min_num_quads=min_num_quads,
                          buff=buff)
            if isinstance(label, Mobject):
                label_mob = label
            else:
                label_mob = TexMobject(label)
                label_mob.scale(self.default_label_scale_val)
            label_mob.next_to(brace, direction, buff)

            braces.add(brace)
            label_mobs.add(label_mob)
        parts.braces = braces
        parts.labels = label_mobs
        parts.label_kwargs = {
            "labels": label_mobs.copy(),
            "direction": direction,
            "buff": buff,
        }
        return VGroup(parts.braces, parts.labels)
Ejemplo n.º 6
0
 def get_blue_part_and_brown_part(self):
     if len(self.pupil) == 1:
         self.cut_pupil()
     # circle = Circle()
     # circle.set_stroke(width=0)
     # circle.set_fill(Color('BLACK'), opacity=1)
     # circle.match_width(self)
     # circle.move_to(self)
     blue_part = VGroup(
         self.iris_background[0],
         *[
             layer[:layer.brown_index]
             for layer in self.spike_layers
         ],
         self.pupil[0],
     )
     brown_part = VGroup(
         self.iris_background[1],
         *[
             layer[layer.brown_index:]
             for layer in self.spike_layers
         ],
         self.pupil[1],
     )
     return blue_part, brown_part
Ejemplo n.º 7
0
    def setup(self):
        self.default_graph_colors_cycle = it.cycle(self.default_graph_colors)

        self.left_T_label = VGroup()
        self.left_v_line = VGroup()
        self.right_T_label = VGroup()
        self.right_v_line = VGroup()
Ejemplo n.º 8
0
    def add_axes(self):
        x_axis = Line(self.tick_width * consts.LEFT / 2,
                      self.width * consts.RIGHT)
        y_axis = Line(consts.MED_LARGE_BUFF * consts.DOWN,
                      self.height * consts.UP)
        ticks = VGroup()
        heights = np.linspace(0, self.height, self.n_ticks + 1)
        values = np.linspace(0, self.max_value, self.n_ticks + 1)
        for y, value in zip(heights, values):
            tick = Line(consts.LEFT, consts.RIGHT)
            tick.set_width(self.tick_width)
            tick.move_to(y * consts.UP)
            ticks.add(tick)
        y_axis.add(ticks)

        self.add(x_axis, y_axis)
        self.x_axis, self.y_axis = x_axis, y_axis

        if self.label_y_axis:
            labels = VGroup()
            for tick, value in zip(ticks, values):
                label = TexMobject(str(np.round(value, 2)))
                label.set_height(self.y_axis_label_height)
                label.next_to(tick, consts.LEFT, consts.SMALL_BUFF)
                labels.add(label)
            self.y_axis_labels = labels
            self.add(labels)
Ejemplo n.º 9
0
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        body = Cube(side_length=1)
        for dim, scale_factor in enumerate(self.body_dimensions):
            body.stretch(scale_factor, dim=dim)
        body.set_width(self.width)
        body.set_fill(self.shaded_body_color, opacity=1)
        body.sort(lambda p: p[2])
        body[-1].set_fill(self.body_color)
        screen_plate = body.copy()
        keyboard = VGroup(*[
            VGroup(*[
                Square(**self.key_color_kwargs)
                for x in range(12 - y % 2)
            ]).arrange(consts.RIGHT, buff=consts.SMALL_BUFF)
            for y in range(4)
        ]).arrange(consts.DOWN, buff=consts.MED_SMALL_BUFF)
        keyboard.stretch_to_fit_width(
            self.keyboard_width_to_body_width * body.get_width(),
        )
        keyboard.stretch_to_fit_height(
            self.keyboard_height_to_body_height * body.get_height(),
        )
        keyboard.next_to(body, consts.OUT, buff=0.1 * consts.SMALL_BUFF)
        keyboard.shift(consts.MED_SMALL_BUFF * consts.UP)
        body.add(keyboard)

        screen_plate.stretch(self.screen_thickness /
                             self.body_dimensions[2], dim=2)
        screen = Rectangle(
            stroke_width=0,
            fill_color=Color('BLACK'),
            fill_opacity=1,
        )
        screen.replace(screen_plate, stretch=True)
        screen.scale_in_place(self.screen_width_to_screen_plate_width)
        screen.next_to(screen_plate, consts.OUT, buff=0.1 * consts.SMALL_BUFF)
        screen_plate.add(screen)
        screen_plate.next_to(body, consts.UP, buff=0)
        screen_plate.rotate(
            self.open_angle, consts.RIGHT,
            about_point=screen_plate.get_bottom()
        )
        self.screen_plate = screen_plate
        self.screen = screen

        axis = Line(
            body.get_corner(consts.UP + consts.LEFT + consts.OUT),
            body.get_corner(consts.UP + consts.RIGHT + consts.OUT),
            color=Color('BLACK'),
            stroke_width=2
        )
        self.axis = axis

        self.add(body, screen_plate, axis)
        self.rotate(5 * np.pi / 12, consts.LEFT, about_point=consts.ORIGIN)
        self.rotate(np.pi / 6, consts.DOWN, about_point=consts.ORIGIN)
Ejemplo n.º 10
0
 def add_tick_marks(self):
     tick_size = self.tick_size
     self.tick_marks = VGroup(
         *[self.get_tick(x, tick_size) for x in self.get_tick_numbers()])
     big_tick_size = tick_size * self.longer_tick_multiple
     self.big_tick_marks = VGroup(*[
         self.get_tick(x, big_tick_size)
         for x in self.numbers_with_elongated_ticks
     ])
     self.add(
         self.tick_marks,
         self.big_tick_marks,
     )
Ejemplo n.º 11
0
    def __init__(self, **kwargs):
        SVGMobject.__init__(self, **kwargs)
        self.set_height(self.height)
        if self.pi_creature is not None:
            self.next_to(self.pi_creature.eyes, consts.UP, buff=0)

        self.frills = VGroup(*self[:self.NUM_FRILLS])
        self.cone = self[self.NUM_FRILLS]
        self.dots = VGroup(*self[self.NUM_FRILLS + 1:])

        self.frills.set_color_by_gradient(*self.frills_colors)
        self.cone.set_color(self.cone_color)
        self.dots.set_color_by_gradient(*self.dots_colors)
Ejemplo n.º 12
0
    def get_riemann_rectangles(
        self,
        graph,
        x_min=None,
        x_max=None,
        dx=0.1,
        input_sample_type="left",
        stroke_width=1,
        stroke_color=Color('BLACK'),
        fill_opacity=1,
        start_color=None,
        end_color=None,
        show_signed_area=True,
        width_scale_factor=1.001
    ):
        x_min = x_min if x_min is not None else self.x_min
        x_max = x_max if x_max is not None else self.x_max
        if start_color is None:
            start_color = self.default_riemann_start_color
        if end_color is None:
            end_color = self.default_riemann_end_color
        rectangles = VGroup()
        x_range = np.arange(x_min, x_max, dx)
        colors = color_gradient([start_color, end_color], len(x_range))
        for x, color in zip(x_range, colors):
            if input_sample_type == "left":
                sample_input = x
            elif input_sample_type == "right":
                sample_input = x + dx
            elif input_sample_type == "center":
                sample_input = x + 0.5 * dx
            else:
                raise Exception("Invalid input sample type")
            graph_point = self.input_to_graph_point(sample_input, graph)
            points = VGroup(*list(map(VectorizedPoint, [
                self.coords_to_point(x, 0),
                self.coords_to_point(x + width_scale_factor * dx, 0),
                graph_point
            ])))

            rect = Rectangle()
            rect.replace(points, stretch=True)
            if graph_point[1] < self.graph_origin[1] and show_signed_area:
                fill_color = invert_color(color)
            else:
                fill_color = color
            rect.set_fill(fill_color, opacity=fill_opacity)
            rect.set_stroke(stroke_color, width=stroke_width)
            rectangles.add(rect)
        return rectangles
Ejemplo n.º 13
0
 def setup_in_uv_space(self):
     u_values, v_values = self.get_u_values_and_v_values()
     faces = VGroup()
     for i in range(len(u_values) - 1):
         for j in range(len(v_values) - 1):
             u1, u2 = u_values[i:i + 2]
             v1, v2 = v_values[j:j + 2]
             face = ThreeDVMobject()
             face.set_points_as_corners([
                 [u1, v1, 0],
                 [u2, v1, 0],
                 [u2, v2, 0],
                 [u1, v2, 0],
                 [u1, v1, 0],
             ])
             faces.add(face)
             face.u_index = i
             face.v_index = j
             face.u1 = u1
             face.u2 = u2
             face.v1 = v1
             face.v2 = v2
     faces.set_fill(color=self.fill_color, opacity=self.fill_opacity)
     faces.set_stroke(
         color=self.stroke_color,
         width=self.stroke_width,
         opacity=self.stroke_opacity,
     )
     self.add(*faces)
     if self.checkerboard_colors:
         self.set_fill_by_checkerboard(*self.checkerboard_colors)
Ejemplo n.º 14
0
 def use_to_mobjects(self, use_element):
     # Remove initial "#" character
     ref = use_element.getAttribute("xlink:href")[1:]
     if ref not in self.ref_to_element:
         warnings.warn("%s not recognized" % ref)
         return VGroup()
     return self.get_mobjects_from(self.ref_to_element[ref])
Ejemplo n.º 15
0
def get_submobject_index_labels(mobject, label_height=0.15):
    labels = VGroup()
    for n, submob in enumerate(mobject):
        label = Integer(n)
        label.set_height(label_height)
        label.move_to(submob)
        label.set_stroke(Color('BLACK'), 5, background=True)
        labels.add(label)
    return labels
Ejemplo n.º 16
0
    def get_coordinate_labels(self, x_vals=None, y_vals=None):
        if x_vals is None:
            x_vals = []
        if y_vals is None:
            y_vals = []
        x_mobs = self.get_x_axis().get_number_mobjects(*x_vals)
        y_mobs = self.get_y_axis().get_number_mobjects(*y_vals)

        self.coordinate_labels = VGroup(x_mobs, y_mobs)
        return self.coordinate_labels
Ejemplo n.º 17
0
    def get_animation_integral_bounds_change(
        self,
        graph,
        curr_t_min,
        curr_t_max,
        new_t_min,
        new_t_max,
        fade_close_to_origin=True,
        run_time=1.0
    ):
        self.area = self.get_area(graph, curr_t_min, curr_t_max)
        curr_t_min = self.x_axis.point_to_number(self.area.get_left())
        curr_t_max = self.x_axis.point_to_number(self.area.get_right())
        if new_t_min is None:
            new_t_min = curr_t_min
        if new_t_max is None:
            new_t_max = curr_t_max

        group = VGroup(self.area)
        group.add(self.left_v_line)
        group.add(self.left_T_label_group)
        group.add(self.right_v_line)
        group.add(self.right_T_label_group)

        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

        return UpdateFromAlphaFunc(group, update_group, run_time=run_time)
Ejemplo n.º 18
0
 def create_lines(self):
     lines = VGroup()
     for angle in np.arange(0, consts.TAU, consts.TAU / self.num_lines):
         line = Line(consts.ORIGIN, self.line_length * consts.RIGHT)
         line.shift((self.flash_radius - self.line_length) * consts.RIGHT)
         line.rotate(angle, about_point=consts.ORIGIN)
         lines.add(line)
     lines.set_color(self.color)
     lines.set_stroke(width=3)
     lines.add_updater(lambda l: l.move_to(self.point))
     return lines
Ejemplo n.º 19
0
 def pop_tips(self):
     start, end = self.get_start_and_end()
     result = VGroup()
     if self.has_tip():
         result.add(self.tip)
         self.remove(self.tip)
     if self.has_start_tip():
         result.add(self.start_tip)
         self.remove(self.start_tip)
     self.put_start_and_end_on(start, end)
     return result
Ejemplo n.º 20
0
    def get_lines_parallel_to_axis(self, axis1, axis2, freq, ratio):
        line = Line(axis1.get_start(), axis1.get_end())
        dense_freq = (1 + ratio)
        step = (1 / dense_freq) * freq

        lines1 = VGroup()
        lines2 = VGroup()
        ranges = (
            np.arange(0, axis2.x_max, step),
            np.arange(0, axis2.x_min, -step),
        )
        for inputs in ranges:
            for k, x in enumerate(inputs):
                new_line = line.copy()
                new_line.move_to(axis2.number_to_point(x))
                if k % (1 + ratio) == 0:
                    lines1.add(new_line)
                else:
                    lines2.add(new_line)
        return lines1, lines2
Ejemplo n.º 21
0
 def get_tips(self):
     """
     Returns a VGroup (collection of VMobjects) containing
     the TipableVMObject instance's tips.
     """
     result = VGroup()
     if hasattr(self, "tip"):
         result.add(self.tip)
     if hasattr(self, "start_tip"):
         result.add(self.start_tip)
     return result
Ejemplo n.º 22
0
 def add_brackets(self):
     bracket_pair = TexMobject("\\big[", "\\big]")
     bracket_pair.scale(2)
     bracket_pair.stretch_to_fit_height(
         self.get_height() + 2 * self.bracket_v_buff
     )
     l_bracket, r_bracket = bracket_pair.split()
     l_bracket.next_to(self, consts.LEFT, self.bracket_h_buff)
     r_bracket.next_to(self, consts.RIGHT, self.bracket_h_buff)
     self.add(l_bracket, r_bracket)
     self.brackets = VGroup(l_bracket, r_bracket)
     return self
Ejemplo n.º 23
0
    def get_lines(self):
        x_axis = self.get_x_axis()
        y_axis = self.get_y_axis()
        x_freq = self.x_line_frequency
        y_freq = self.y_line_frequency

        x_lines1, x_lines2 = self.get_lines_parallel_to_axis(
            x_axis,
            y_axis,
            x_freq,
            self.faded_line_ratio,
        )
        y_lines1, y_lines2 = self.get_lines_parallel_to_axis(
            y_axis,
            x_axis,
            y_freq,
            self.faded_line_ratio,
        )
        lines1 = VGroup(*x_lines1, *y_lines1)
        lines2 = VGroup(*x_lines2, *y_lines2)
        return lines1, lines2
Ejemplo n.º 24
0
 def get_basis_vectors(self, i_hat_color=X_COLOR, j_hat_color=Y_COLOR):
     return VGroup(*[
         Vector(
             vect,
             color=color,
             stroke_width=self.basis_vector_stroke_width
         )
         for vect, color in [
             ([1, 0], i_hat_color),
             ([0, 1], j_hat_color)
         ]
     ])
Ejemplo n.º 25
0
    def get_parts_by_tex(self, tex, substring=True, case_sensitive=True):
        def test(tex1, tex2):
            if not case_sensitive:
                tex1 = tex1.lower()
                tex2 = tex2.lower()
            if substring:
                return tex1 in tex2
            else:
                return tex1 == tex2

        return VGroup(
            *[m for m in self.submobjects if test(tex, m.get_tex_string())])
Ejemplo n.º 26
0
 def __init__(self, **kwargs):
     VGroup.__init__(self, **kwargs)
     self.x_axis = self.create_axis(self.x_min, self.x_max,
                                    self.x_axis_config)
     self.y_axis = self.create_axis(self.y_min, self.y_max,
                                    self.y_axis_config)
     self.y_axis.rotate(90 * consts.DEGREES, about_point=consts.ORIGIN)
     # Add as a separate group incase various other
     # mobjects are added to self, as for example in
     # NumberPlane below
     self.axes = VGroup(self.x_axis, self.y_axis)
     self.add(*self.axes)
     self.shift(self.center_point)
Ejemplo n.º 27
0
 def get_basis_vector_labels(self, **kwargs):
     i_hat, j_hat = self.get_basis_vectors()
     return VGroup(*[
         self.get_vector_label(
             vect, label, color=color,
             label_scale_factor=1,
             **kwargs
         )
         for vect, label, color in [
             (i_hat, "\\hat{\\imath}", X_COLOR),
             (j_hat, "\\hat{\\jmath}", Y_COLOR),
         ]
     ])
Ejemplo n.º 28
0
 def get_vertical_lines_to_graph(
     self, graph,
     x_min=None,
     x_max=None,
     num_lines=20,
     **kwargs
 ):
     x_min = x_min or self.x_min
     x_max = x_max or self.x_max
     return VGroup(*[
         self.get_vertical_line_to_graph(x, graph, **kwargs)
         for x in np.linspace(x_min, x_max, num_lines)
     ])
Ejemplo n.º 29
0
    def get_division_along_dimension(self, p_list, dim, colors, vect):
        p_list = self.complete_p_list(p_list)
        colors = color_gradient(colors, len(p_list))

        last_point = self.get_edge_center(-vect)
        parts = VGroup()
        for factor, color in zip(p_list, colors):
            part = SampleSpace()
            part.set_fill(color, 1)
            part.replace(self, stretch=True)
            part.stretch(factor, dim)
            part.move_to(last_point, -vect)
            last_point = part.get_edge_center(vect)
            parts.add(part)
        return parts
Ejemplo n.º 30
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