본문 바로가기
파이썬/MANIM

Manim. 도형 회전 rotate의 비밀

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

 

 

지난 글

2022.09.21 - [파이썬/MANIM] - Manim. 삼각형 그리기

 

Manim. 삼각형 그리기

이번에는 2022.09.16 - [파이썬/MANIM] - Manim. 정사각형 그리기 Manim. 정사각형 그리기 지난 글에서는 Manim을 이용하여 원을 그려보고, 움직이게도 해봤습니다. 2022.09.14 - [파이썬/MANIM] - Manim. 원 그리..

sine-qua-none.tistory.com

에서 삼각형 도형을 어떻게 그리는지 살펴보았고 회전 명령어에 대해서도 알아보았습니다. 그런데 삼각형의 회전이 생각대로 안 되는 현상을 볼 수 있었습니다. 

 

이번 글에서는 여러 도형의 회전에 대해서 알아보겠습니다. 회전시키기 이전에 좌표를 찍어놓고 회전을 보기로 합니다.

 

 

좌표 그리기

Manim에서 제공하는 scene의 default 화면은 8 × 14 격자입니다. 원점을 가운데 놓고, $x$축으로는 -7에서 7까지, $y$축으로는 -4에서 4까지입니다. 이를 염두에 두고 다음과 같이 좌표를 그려보죠.

 

Python Code
class SetCoordinate(Scene):
    def construct(self):
        for x in range(-7, 8):
            for y in range(-4, 5):
                self.add(Dot(np.array([x, y, 0]), color=DARK_GREY))
                if x == 0 and y == 0:
                    self.add(Dot(np.array([x, y, 0]), color=RED))

        text = Tex("O", font_size=30).move_to([0.4, 0, 0])
        self.add(text)

 

설명
                self.add(Dot(np.array([x, y, 0]), color=DARK_GREY))
				# Dot 는 점을 의미하고, (x,y)에 점을 찍음

Dot : 점을 의미합니다. [x,y,0] 에 점을 위치시킵니다. 색은 color= 로 지정합니다.

 

 


                if x == 0 and y == 0:	# 원점이면
                    self.add(Dot(np.array([x, y, 0]), color=RED)) # RED 색으로 점을 표현

 

 


        text = Tex("O", font_size=30).move_to([0.4, 0, 0])
        # Tex 문장으로 수식 표현
        # font_size 로 폰트 크기 조절
        # move_to 로 위치 이동​

Tex :  텍스트를 Tex로 수식 편집이 가능하도록 쓰는 클래스입니다.

move_to : 지정한 점의 위치로 object를 움직이는 메쏘드입니다.

 

 

결과 화면

점으로 표현된 좌표축

 

이렇게 기준점들이 찍혀 있으면 회전이 어떻게 이루어지나 보기 쉬울 듯합니다.

 

 

 

Rectangle의 회전

직사각형의 회전부터 살펴보겠습니다.  다음의 코드를 보죠.

 

1. Python Code
class Rectangle_Rotate(Scene):
    def construct(self):
        SetCoordinate.construct(self)
        rect = Rectangle(width=4, height=2, color=YELLOW_A)

        rectRot_aboutPoint = rect.copy().rotate(60 * DEGREES, about_point=ORIGIN)
        rectRot_default = rect.copy().rotate(60 * DEGREES)
        rectRot_aboutPoint.set_color(RED_A)
        rectRot_default.set_color(BLUE_A)
        rectRot_default.set_stroke(width=10, color=WHITE)

        t0 = Text('original rectangle', color=YELLOW, font_size=30).move_to([-3, 0, 0])
        t1 = Text('rotate(about origin)', color=RED_A, font_size=30).move_to([-2, 2, 0])
        t2 = Text('rotate(Manim Default)', color=WHITE, font_size=30).move_to([2, -2.5, 0])

        self.add(rect, rectRot_default, rectRot_aboutPoint, t0, t1, t2)

 

2. Code 설명
        SetCoordinate.construct(self)	# 좌표계를 그림
        rect = Rectangle(width=4, height=2, color=YELLOW_A)	# w*h =4*2인 노란계열 직사각형 생성

 

 

        rectRot_aboutPoint = rect.copy().rotate(60 * DEGREES, about_point=ORIGIN)
        # rect를 복사하여 60도 회전, 회전기준점은 원점
        rectRot_default = rect.copy().rotate(60 * DEGREES)
        # rect를 복사하여 60도 회전, 회전은 Manim에서 정한 default방법
        rectRot_aboutPoint.set_color(RED_A)
        # ORIGIN을 기준으로 회전한 직사각형을 빨간색으로 세팅
        rectRot_default.set_color(BLUE_A)
        # default 방법의 회전한 직사각형은 Blue로
        rectRot_default.set_stroke(width=10, color=WHITE)
        # dafault 회전 직사각형의 선두께와, 선 색 지정

about_point를 지정한 회전과 Manim 제공 default 회전을 비교해 볼 생각입니다.

set_color : 도형의 색을 지정합니다.

 set_stroke : 도형의 가장자리 외관선의 두께, 선 색 등을 지정합니다. storke는 이라는 뜻이군요.

 

 

 

        t0 = Text('original rectangle', color=YELLOW, font_size=30).move_to([-3, 0, 0])
        t1 = Text('rotate(about origin)', color=RED_A, font_size=30).move_to([-2, 2, 0])
        t2 = Text('rotate(Manim Default)', color=WHITE, font_size=30).move_to([2, -2.5, 0])
		
        # 각각의 도형에 대한 설명을 위해, 도형과 같은 색으로 Texting

Text() : 텍스트 클래스입니다.

 

 

 

3. 결과

원점을 기준으로 회전한 직사각형(빨간색)과 Manim에서 default로 회전시켜준 직사각형이 똑같이 나옵니다.

직사각형의 중심점을 조금 움직여봐도 그럴까요?

 

 

        rect = Rectangle(width=4, height=2, color=YELLOW_A).shift(UR)
		# 오리지널 직사각형을 UR방향으로 shifting

UR : Up + Right 방향으로 이동합니다. 좌표로는 [1,1,0]입니다, 

 

결과를 보면,

 

about_point = ORIGIN 인 조건에서는 이 점이 기준점이 되어 회전하는 모습이 보입니다(빨간색 vs 노란색.) 반면, default 회전은 스마트하게도 노란색 직사각형의 중점, 즉 UR을 기준으로 회전한 결과물(하얀 직사각형)을 볼 수 있습니다.

 

 

 

 

원의 회전

원은 회전해도 그 모양이 같으므로 위치 관계로 판단을 해봐야 합니다. 우선 코드를 보시죠.

 

python code
class Circle_Rotate(Scene):
    def construct(self):
        SetCoordinate.construct(self)

        circ = Circle(radius= 2, color= YELLOW_A, stroke_width=10).shift(UR)
        circ_aboutPoint = circ.copy().rotate(60 * DEGREES, about_point=ORIGIN)
        circ_default = circ.copy().rotate(60 * DEGREES)

        circ_aboutPoint.set_color(RED_A)
        circ_default.set_color(BLUE_A)
        circ_default.set_stroke(width=3, color=WHITE)

        t0 = Text('original Circle', color=YELLOW, font_size=30).move_to([2, 0, 0])
        t1 = Text('rotate(about origin)', color=RED_A, font_size=30).move_to([-2, 2, 0])
        t2 = Text('rotate(Manim Default)', color=WHITE, font_size=30).move_to([2, -2.5, 0])

        self.add(circ, circ_aboutPoint, circ_default, t0, t1, t2)

 

직사각형일 때와 코드는 거의 같습니다.

 

 

결과

 

 

그림을 보면, 오리지널 원과 그것을 Manim default로 회전한 원은 정확히 일치합니다. 만일 about_point = ORIGIN 조건을 붙이면 빨간색 원처럼 나옵니다.

 

 

ORIGIN을 중심으로 회전하는 것은 이제 알겠습니다. 그럼 Manim에서 제공하는 Default 회전은 과연 무엇일까요?

다음 글에서 삼각형을 회전 이동하여 그 비밀을 파헤쳐 보겠습니다.

 

 

 

 

728x90
반응형

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

Manim. 그래프 그리기  (0) 2022.09.27
Manim. 삼각형의 scale, rotate  (0) 2022.09.26
Manim. 삼각형 그리기  (0) 2022.09.21
Manim. 정사각형 그리기  (0) 2022.09.16
Manim. 원 그리기  (0) 2022.09.14

댓글