본문 바로가기
파이썬/MANIM

Manim. 정사각형 그리기

by hustler78 2022. 9. 16.
728x90
반응형

지난 글에서는 Manim을 이용하여 원을 그려보고, 움직이게도 해봤습니다.

 

2022.09.14 - [파이썬/MANIM] - Manim. 원 그리기

 

Manim. 원 그리기

이번 글에서는 Manim 라이브러리로 원을 그리는 방법을 알아보겠습니다. Circle 클래스 Circle 클래스의 파라미터로 많이 쓰이는 것들은 아래와 같습니다. radius : 반지름 color : 원의 색깔 fill_opacity :

sine-qua-none.tistory.com

 

이번 글에서는 정사각형(Square)에 대해서 알아보겠습니다.

 

Square 클래스

Square 클래스에서 많이 쓰이는 파라미터는 한 변의 길이(side_length)입니다.

 

  • side_length : 정사각형의 한 변의 길이

 

 

Square Example

예제를 들어볼까요?

 

1. 정사각형 탑 쌓기
from manim import *

class SquareExample(Scene):
    def construct(self):
        square_1 = Square(side_length=2.0).shift(DOWN)
        square_2 = Square(side_length=1.0).next_to(square_1, direction=UP)
        square_3 = Square(side_length=0.5).next_to(square_2, direction=UP)
        self.add(square_1, square_2, square_3)

간략히 살펴볼까요?

 

        square_1 = Square(side_length=2.0).shift(DOWN)
		# 한변의 길이가 2인 정사각형 원점에서 아래 방향으로 unit 단위만큼 위치

shift()는 지난 글을 참고하면 됩니다.

 

next_to() 직관적으로 생각했을 때, 옆에 위치시키는 것을 말하는데, 정확한 정의는 아래와 같습니다.       

 

next_to(mobject_or_point, direction=array([1., 0., 0.]), buff=0.25, aligned_edge=array([0., 0., 0.]), submobject_to_align=None, index_of_submobject_to_align=None, coor_mask=array([1, 1, 1]))

mobject_or_point : 기준이 되는 도형(object)를 의미
▷ direction : 옆에 위치시킬 방향을 의미 (UP, DOWN, LEFT, RIGHT 등)
▷ buff : 위치시킬 때 떨어진 간격을 의미

 


        square_2 = Square(side_length=1.0).next_to(square_1, direction=UP)
        	# 한변의 길이가 1인 정사각형을 square1의 up방향으로 위치시키고 이를 square_2라 정의
        square_3 = Square(side_length=0.5).next_to(square_2, direction=UP)
        	# 한변의 길이가 0.5인 정사각형을 square2의 up방향으로 위치시키고 이를 square_3라 정의

 

결과를 보겠습니다.

 

 

해당 예제는 Manim의 square 관련 문서에서 차용했습니다.

 

 

 

 

2. 가만히 있는 정사각형과 움직이는 4개의 원

1번 예제에서 next_to를 소개했으니 이를 응용한 애니메이션 하나 만들어 보겠습니다.

해당 예제는 이 사이트의 예제를 참고, 응용했습니다.

 

class NextTo(Scene):
    def construct(self):
        c1, c2, c3, c4 = [Circle(radius=0.3 * (i + 1), color=WHITE)
                          for i in range(4)]

        square = Square(side_length=5)

        # use Python's * syntax to write the objects
        # does the following: f(*[1, 2, 3]) == f(1, 2, 3)
        self.play(*[Write(o) for o in [c1, c2, c3, c4, square]])

        # move the circles such that they surround the rectangle
        self.play(
            c1.animate.next_to(square, LEFT),
            c2.animate.next_to(square, UP),
            c3.animate.next_to(square, RIGHT),
            c4.animate.next_to(square, DOWN),
        )

manim import는 이제 생략하겠습니다. 간략히 살펴보죠.

 

 

        c1, c2, c3, c4 = [Circle(radius=0.3 * (i + 1), color=WHITE)
                          for i in range(4)]
		# 원 4개를 for문으로 생성. 반지름이 0.3, 0.6, 0.9, 1.2인 하얀색 원임.

 

 


        # use Python's * syntax to write the objects
        # does the following: f(*[1, 2, 3]) == f(1, 2, 3)
        self.play(*[Write(o) for o in [c1, c2, c3, c4, square]])
        	# 원 4개와 square를 for문을 이용하여 등장시킴(write)

○ python의 * 문법이 등장합니다. Asterisk Syntax인데요. 위의 영어 주석처럼 리스트나 튜플 속 원소들을 함수의 인자로 변환하여(unpacking) 함수에 넣을 때 쓰입니다.

 

        # move the circles such that they surround the rectangle
        self.play(
            c1.animate.next_to(square, LEFT),	# c1은 정사각형의 왼쪽에 등장
            c2.animate.next_to(square, UP),		# c2은 정사각형의 위에 등장
            c3.animate.next_to(square, RIGHT),	# c3은 정사각형의 오른쪽에 등장
            c4.animate.next_to(square, DOWN),	# c4은 정사각형의 아래에 등장
        )

 

한번 결과를 보겠습니다.

 

 

원과 정사각형이 등장했다가, 정사각형의 좌, 우, 위, 아래로 이동하는 모습이 보입니다. Psy의 노래가 생각나네요.

 

 

 

 

 

728x90
반응형

'파이썬 > MANIM' 카테고리의 다른 글

Manim. 도형 회전 rotate의 비밀  (0) 2022.09.22
Manim. 삼각형 그리기  (0) 2022.09.21
Manim. 원 그리기  (0) 2022.09.14
Manim. 가장 쉬운 예제를 알아보자.  (0) 2022.09.13
MANIM이란? 어떻게 설치하지?  (1) 2022.09.13

댓글