Esempio n. 1
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)
Esempio n. 2
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
Esempio n. 3
0
 def move_tip_to(self, point):
     mover = VGroup(self)
     if self.content is not None:
         mover.add(self.content)
     mover.shift(point - self.get_tip())
     return self