본문 바로가기

Programming/Manim Project

(9)
사인 파의 진폭을 변형시키면서 사인파 이동시키기 만들려는 것은, 이동하는 사인파를 애니메이션 하는 것인데, 동시에 사인파의 진폭(높낮이)을 바꿔가면서 이동하는 것을 애니메이션 해보고자 한다. 진폭 변동없이 그냥 이동시키는 애니메이션에 대한 코딩은 여기 참조. 핵심 구상 사인파를 화면에 그리고 이동하는 듯한 애니메이션을 구현하는 것은 여기 설명한 것과 동일. 사인파의 진폭을 변화시키는 것이 다른 것인데, 시간의 흐름에 따라 변화되게 하자 0~1초 : 진폭 1로 진행 1~2초: 진폭 1에서 2로 서서히 커지게 2~3초: 진폭 2에서 1로 서서히 작아지게 3~ : 진폭 1로 진행 진폭은, 사인 곡선을 만들어내는 원의 반지름에 비례한다. 원의 반지름이 1이면 진폭이 1이고, 원이 반지름이 커지면 진폭이 증가하고, 반지름이 작아지면 진폭도 감소한다. 따라서, ..
계속해서 흘러가는 사인 파형 만들기 만들려는 것은, 원둘레까지의 막대를 이용해서, 사인파가 계속해서 그려지면서 왼쪽 편으로 흐르듯이 진행되는 애니메이션이다. 그냥 0 ~ 2 $\pi$까지 등 일정 범위에 대해 사인 파형을 그리는 것은 여기 코드를 참조. 원 막대 없이 그냥 사인파가 흐르는 애니메이션은 여기 참조. 기본 구상 먼저 일정 구간에 대한 사인파를 그리고, 그 사인파의 끝 지점을 원 막대에서 연장된 라인이 가리키게 한 후, 막대가 회전함에 따라 사인파를 계속 업데이트해서 마치 흐르는 것처럼 만든다. 코딩 1. 축 라인과 원을 그린다. 가로축과 세로축, 그리고 원이 놓이게 되는 좌표를 구상하자. 위 그림을 코드로 짠다. 클래스 이름은 LongSineCurve로 하자. class LongSineCurve(Scene): def const..
흐르는 물결같은, 흐르는 사인 곡선 만들기 움직이는 사인 곡선을 만들어보자. 마치 파형이 이동하는 듯한. 기본 구상 $\sin ( \theta + \alpha )$는 $\sin \theta$인 곡선이 $\alpha$만큼 왼쪽으로 쉬프트 된 곡선이다. 위 그림은 $\sin \theta$를 $\frac {\pi} {4}$ 만큼씩 왼쪽으로 이동한 것으로, 시간 단위별로 이렇게 이동시키면, 마치 사인파가 왼쪽으로 흐르는 듯한 효과를 낼 수 있을 것이다. 코딩 축 그리기 x축과 y축을 그린다. def draw_axis(self): x_axis = Line(np.array([-4,0,0]), np.array([4,0,0])) y_axis = Line(np.array([-4,2,0]), np.array([-4,-2,0])) self.add(x_axis, y_..
원 위의 점이 돌면서 사인/코사인 곡선 그리기 사인(Sine)과 코사인(Cosine) 그래프가 왜 그렇게 그려지는지 설명할 때 많이 쓰이는 방법은 다음과 같다. 반지름이 1인 원을 그리고, 원의 중심에서 그 원둘레의 임의의 점까지의 직선을 그린 후, x축과 그 직선 간의 사잇각을 $ \theta $라 하자 이 $ \theta $에 대해 $\sin \theta = 세로 $가 되고, $ \cos \theta = 가로$가 된다. 따라서, 그 어떤 점을 원둘레로 이동시키면, $ \theta $가 커지고, 이에 따라 $\sin \theta $의 값이 변하게 되는데, 이를 원 오른편에 가로축을 그리고, 그 위를 $\theta$의 변화값으로 두고, 세로축에 '세로 길이'를 표시하면, 이게 $ \sin \theta $ 값이 된다. 즉, 사인(Sine) 그래프가 된..
원 위의 점이 이동하면서 사인 곡선 그리기 하려는 것 사인(sine)이나 코사인(cosine) 함수의 그래프가 아래와 같이 된다는 것을, 기하학적인 삼각함수의 기본 원리를 가지고 보여주는 애니메이션을 만들고자 한다. 사인 그래프를 예를 들면, 반지름의 길이가 1인 원을 그리고, 그 원둘레의 한 점 P를 잡아서, 원점에서 그 점까지의 직선을 그리고, x축과 그 직선의 사잇각을 $ \theta $라 하자. 그렇다면 $ \sin \theta $는 점 P에서 x축으로 수직으로 내린 길이가 된다. 왜냐면, $ \sin \theta = 높이/빗변$ 이기 때문. 그리고, 점 P의 높이라는 것은, 점 P의 y축 좌표값이다. 즉, $ \sin \theta = {P_y}$ $ \theta $ 값이 0(zero)이 될 때의 P는 원의 오른편 둘레가 x축과 만나는 점..
python의 for 루프 설명하기 파이썬의 for 루프를 설명하기 위한 애니메이션입니다. 설명하기 위한 for 루프를 사용한 파이썬 코드는 1에서 100까지 합을 구한는 코드 sum = 0 for i in range(1,101,1): sum = sum + i 애니메이션의 핵심은, 변수 i와 sum의 값이 for 루프를 돌면서 어떻게 변하는 지를 잘 보여주는 것. 이를 위해서 i값과 sum값이 차례로 위 쪽으로 이동하면서 변하는 객체를 만들어서 처리해야겠습니다. 사다리 모양이어서 객체 이름은 VarLadder로. `변수를 처리하는 사다리` 정도의 의미 .^^ 작성된 VarLadder 클래스에 대한 코드는 아래와 같습니다. class VarLadder(VGroup): CONFIG = { "rect_cnt": 3, "decimal_scale"..
[컴포넌트]VerticalBarChart 만들기 (3. 사용법) 기본 사용법 아무 파라미터 없이 VerticalBarChart를 만들면, VerticalBarChart의 CONFIG에 지정되어 있는 샘플 데이터 및 파라미터 값으로 디폴트 바 차트가 만들어집니다. 단, 이때 is_add_bars=True로 해줘야 막대가 같이 나타납니다. is_add_bars=False가 디폴트로, chart를 add하면 막대를 제외한 나머지가 화면에 표출되고, 막대는 chart.get_bar_animation()에 의해 얻어지는 애니메이션에 의해 표출됩니다. from manimlib.imports import * from src.comp.plot import VerticalBarChart class SimpleTest(Scene): def construct(self): chart = ..
[컴포넌트]VerticalBarChart 만들기 (2. 핵심코드 설명) 글로벌 객체 생성을 모듈화 함 클래스의 생성자에서 바 차트를 구성하는 요소들을 생성하고, 이 루틴들을 각 메서드로 구분해서 모듈화 했습니다. def __init__(self, data=[], **kwargs): digest_config(self, kwargs, locals()) super().__init__(**kwargs) self.read_data(data) self.setup_axes() #x, y axis self.add_lines() # background line and value text self.add_titles() self.add_bars() # draw rectangle self.add_bar_names() # name of bars below x_axis self.add_axes_t..
[컴포넌트]VerticalBarChart 만들기 (1. 설계/소스) 만들려는 것은 막대그래프를 애니메이션 하는 컴포넌트입니다. 데이터를 그래프로 나타낼 때, 가장 간단하면서도 가장 많이 쓰이는 것이 막대그래프일 겁니다. 간단하면서도 데이터의 전달 효과가 좋기 때문입니다. 근데 그렇게 간단하다는 막대그래프도, 막상 잘 그리려면 쉽지 않고 고려해야 할 것이 많습니다. (그게 뭔지는 여기 참조) 또한 애니메이션을 효과도 넣고 예쁘게 하려면, 엑셀이나 파워포인트로는 한계가 있습니다. 여기서는 방송사의 뉴스 같은데서 나오는, 전문 디자이너가 공들여서 만드는 멋진 막대그래프 애니메이션을, 데이터만 입력하면 다른 필요한 사항 없이 애니메이션이 작성되는 컴포넌트를 만들고, 그 과정도 소개하겠습니다. 설계 클래스 타입 VGroup을 상속해서 작성: 라인, 바 등 여러 객체가 사용될 것이..