from manim import *

import numpy as np


class StellarAberration(Scene):

    def construct(self):

        # 1. 좌표축 및 설정

        title = Text("성수님의 합성식 기반 광행차 분석", font_size=36).to_edge(UP)

        self.add(title)


        c = 3.0  # 빛의 속도 (시각화용)

        v = 1.0  # 지구의 공전 속도

        

        origin = ORIGIN

        star_pos = UP * 3

        earth_vel = RIGHT * v


        # 2. 지구와 별 표시

        earth = Dot(color=BLUE).shift(LEFT * 2)

        earth_label = Text("지구 (관찰자)", font_size=20).next_to(earth, DOWN)

        star = Star(color=YELLOW).shift(UP * 3)

        star_label = Text("먼 별", font_size=20).next_to(star, UP)

        

        self.play(FadeIn(earth, earth_label, star, star_label))


        # 3. 벡터 합성 묘사 (성수님의 논리)

        # 실제 별빛 벡터

        c_vector = Arrow(star.get_center(), earth.get_center(), buff=0, color=YELLOW)

        c_text = MathTex(r"\vec{c}", color=YELLOW).next_to(c_vector, LEFT)


        # 지구 운동 벡터

        v_vector = Arrow(earth.get_center(), earth.get_center() + RIGHT * v, buff=0, color=RED)

        v_text = MathTex(r"\vec{v}", color=RED).next_to(v_vector, BOTTOM)


        self.play(GrowArrow(c_vector), Write(c_text))

        self.play(GrowArrow(v_vector), Write(v_text))

        self.wait(1)


        # 4. 성수님의 합성 벡터 (상대 속도 c')

        # 수식: c' = sqrt(c^2 + v^2 - 2cv cos(theta)) 논리 시각화

        c_prime_vector = Arrow(star.get_center(), earth.get_center() + RIGHT * v, buff=0, color=GREEN)

        c_prime_label = MathTex(r"\vec{c}'_{Sungsoo}", color=GREEN).next_to(c_prime_vector, RIGHT)


        self.play(

            ReplacementTransform(c_vector.copy(), c_prime_vector),

            Write(c_prime_label)

        )

        

        # 5. 각도(광행차) 표시

        arc = ArcBetweenPoints(

            star.get_center() + DOWN * 1,

            c_prime_vector.get_start() + (earth.get_center() + RIGHT * v - star.get_center()) * 0.3,

            radius=1

        )

        angle_text = MathTex(r"\alpha", font_size=30).next_to(arc, DOWN)

        

        self.play(Create(arc), Write(angle_text))

        

        # 6. 결론 텍스트

        result = Text("성수님의 식에 따른 각도 변화 확인", font_size=24, color=GREEN).to_edge(DOWN)

        self.play(Write(result))

        self.wait(2)