본문 바로가기
파이썬/MANIM

Manim. 삼각형 그리기

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

 

이번에는 

2022.09.16 - [파이썬/MANIM] - Manim. 정사각형 그리기

 

Manim. 정사각형 그리기

지난 글에서는 Manim을 이용하여 원을 그려보고, 움직이게도 해봤습니다. 2022.09.14 - [파이썬/MANIM] - Manim. 원 그리기 Manim. 원 그리기 이번 글에서는 Manim 라이브러리로 원을 그리는 방법을 알아보겠

sine-qua-none.tistory.com

에 이어 삼각형을 그려보도록 하겠습니다.

 

 

Triangle Class

삼각형은 그냥 Triangle() 로 그릴 수 있습니다. 디폴트로, 반지름이 1인원에 내접하는 정삼각형을 그려줍니다.

 

 

Triangle Example

 

1. 삼각형 그리기와 삼각형의 회전
import numpy as np
class TriangleExample(Scene):
    def construct(self):
        triangle_1 = Triangle()
        triangle_2 = Triangle().scale(2).rotate(30*DEGREES)
        triangle_3 = Triangle().scale(3).rotate(np.pi/3)
        tri_group = Group(triangle_1, triangle_2, triangle_3).arrange(buff=1)
        self.add(tri_group)

 

간략히 살펴본 부분은

        triangle_2 = Triangle().scale(2).rotate(30*DEGREES)
		# 삼각형을 2배로 Scale Up 하고 30도 회전함

DEGREES : Manim에서 쓰이는 상수 중 하나로서 radian 과 degree의 교환비율, 즉, $\pi/180$을 의미합니다.

○ 삼각형의 시계반대방향으로 30도 회전한 그림입니다. 크기가 2배가 됩니다.

 


        triangle_3 = Triangle().scale(3).rotate(np.pi/3)
		# 크기 3배이고 pi/3 = 60도 회전

 

결과를 보면

입니다.

 

 

2. 삼각형, 사각형, 원을 한 번에 그려 비교

Manim의 삼각형, 사각형, 원을 디폴트 옵션으로 한 번에 그려보면 어떤 식으로 그려지는지 명확해집니다. 한번 보죠.

class Triangle_Square_Circle(Scene):
    def construct(self):
        triangle= Triangle()
        square = Square(side_length=2)
        circle = Circle()
        self.add(triangle, square, circle)

Circle 의 default 옵션이 반지름 1인 경우이므로 Squareside_length를 2로 설정합니다.

 

결과는

즉, 삼각형, 사각형, 원은 모두 무게중심을 기준으로 그려지며, 위와 같이 서로 내접/ 외접하는 형태입니다.

 

 

3. 삼각형을 크기를 늘려가며 회전

삼각형의 크기를 기본에서부터 0.2씩 크기를 늘려가며, 회전을 30 º 씩 반시계 방향으로 하는 삼각형 12개를 그려보겠습니다.

class RotationTriangles(Scene):
    def construct(self):
        degs = [30 * deg for deg in range(12)]
        radius = [1 + 0.2 * rad for rad in range(len(degs))]

        tri_group = VGroup()

        # zip(radius, color) makes the iterator [(radius[i], degs[i]) for i in range(radius)]
        tri_group.add(*[Triangle().scale(rad).rotate(deg * DEGREES)
                        for rad, deg in zip(radius, degs)])
        self.add(tri_group)

간단히 살펴보죠.

 

        degs = [30 * deg for deg in range(12)]	#각도를 30도씩 증가시키는 회전각 list
        radius = [1 + 0.2 * rad for rad in range(len(degs))]	#크기배율을 1부터 0.2씩 증가

 


        tri_group = VGroup()	# 벡터 그룹 클래스를 tri_group으로 정의함

VGroup 은 도형등의 object 들을 벡터화하여 관리하기 위해 그룹화하는 클래스입니다.

 

 


        # zip(radius, color) makes the iterator [(radius[i], degs[i]) for i in range(radius)]
        tri_group.add(*[Triangle().scale(rad).rotate(deg * DEGREES)
                        for rad, deg in zip(radius, degs)])
		#radius와 degs의 원소를 pair로 하여 rad 만큼 scale를 변화시키고 deg도 만큼 회전하는 삼각형을 그림

○ 리스트의 원소를 함수의 인자로 넣기 위해 * 문법을 사용했습니다. 2022.09.16 - [파이썬/MANIM] - Manim. 정사각형 그리기에서도 이 문법(Asterisk 문법)을 사용했습니다.

 

 

결과를 볼까요?

 

 

흠, 제 생각으로는 중심점을 기준으로 회전할지 알았는데, 아니군요. 그럼 중심점을 기준으로 회전하는 모양새는 어떻게 그릴까요? 다음과 같이 코드의 한 부분을 살짝 바꿉니다.

 

        tri_group.add(*[Triangle().scale(rad).rotate(deg * DEGREES, about_point= ORIGIN)
                        for rad, deg in zip(radius, degs)])

rotate about_point = ORIGIN이라는 명령어를 추가합니다.

 

 

 

 

중심점이 있는 것처럼 보이나요? 비교를 쉽게 하기 위해 모든 삼각형의 크기를 동일하게 해 보고, 하나는 about_pointf를 적용하고, 하나는 안 해보겠습니다. python code를 조금 수정하죠.

 

        tri_group = VGroup()
        tri_group_shift = VGroup()

        # zip(radius, color) makes the iterator [(radius[i], color[i]) for i in range(radius)]
        tri_group.add(*[Triangle().scale(1).rotate(deg * DEGREES, about_point=ORIGIN)
                        for rad, deg in zip(radius, degs)])

        tri_group_shift.add(*[Triangle().scale(1).rotate(deg * DEGREES)
                              for rad, deg in zip(radius, degs)])

        self.add(tri_group.shift(2 * LEFT), tri_group_shift.shift(2 * RIGHT))

tri_group_shift 라는 VGroup 클래스를 하나 더 만들어 비교합니다.

Triangle().scale(1) 로 스케일 팩터를 1로 고정합니다.

 

결과를 볼까요?

 

왼쪽의 그림이 중심점을 기준으로 회전한 12개의 삼각형입니다. 오른쪽도 대칭처럼 보이나, 중심이 위로 올라가는 등 흐트러진 모습이죠.

 

각도를 50도로 해서 3번만 확인한 모습을 볼까요?

 

        degs = [50 * deg for deg in range(3)]

이렇게 바꿔주고 코드를 실행하면,

 

 

오른쪽은 확연히 대칭이 아닌 모습

 

 

그럼 과연  about_point = ORIGIN   를 생략하면, 삼각형은 어떤 기준으로 회전을 하는 걸까요? 다음 글에서 알아보겠습니다.

 

 

728x90
반응형

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

Manim. 삼각형의 scale, rotate  (0) 2022.09.26
Manim. 도형 회전 rotate의 비밀  (0) 2022.09.22
Manim. 정사각형 그리기  (0) 2022.09.16
Manim. 원 그리기  (0) 2022.09.14
Manim. 가장 쉬운 예제를 알아보자.  (0) 2022.09.13

댓글