이번에는
2022.09.16 - [파이썬/MANIM] - Manim. 정사각형 그리기
에 이어 삼각형을 그려보도록 하겠습니다.
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인 경우이므로 Square의 side_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 를 생략하면, 삼각형은 어떤 기준으로 회전을 하는 걸까요? 다음 글에서 알아보겠습니다.
'파이썬 > 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 |
댓글