1. 역삼각함수 이론


기본 개념:

  • 함수 ( y=f(x)y = f(x) )에 대해, 이를 반대로 정의한 함수 ( x=f1(y)x = f^{-1}(y) )를 역함수라 합니다.
  • 삼각함수에서의 예:
    • ( y=sin(x)y = \sin(x) )라면, 역함수는 ( x=arcsin(y)x = \arcsin(y) ).
존재 조건:
  • 함수가 1:1 대응 관계를 가질 때만 역함수가 존재합니다.
  • 삼각함수는 일반적으로 주기성을 가지므로 1:1 대응이 아닙니다. 따라서 정의역과 치역을 제한하여 역함수를 정의합니다.

삼각함수와 역삼각함수의 관계:
  • 기본 삼각함수:
    • (cosθ=ac,sinθ=bc,tanθ=ba\cos\theta = \frac{a}{c}, \sin\theta = \frac{b}{c}, \tan\theta = \frac{b}{a})
  • 역삼각함수:
    • (arccos(val)=θ\arccos(val) = \theta): (cosθ=val\cos\theta = val)
    • (arcsin(val)=θ\arcsin(val) = \theta): (sinθ=val\sin\theta = val)
    • (arctan(val)=θ\arctan(val) = \theta): (tanθ=val\tan\theta = val)

정의역과 치역:
  • (arcsin\arcsin): 정의역 ([1,1][-1, 1]), 치역 ([π2,π2][-\frac{\pi}{2}, \frac{\pi}{2}])
  • (arccos\arccos): 정의역 ([1,1][-1, 1]), 치역 ([0,π][0, \pi])
  • (arctan\arctan): 정의역 전체 실수, 치역 ((π2,π2(-\frac{\pi}{2}, \frac{\pi}{2}))
응용:
  • 벡터와 내적:
    [cosθ=v1v2v1v2\cos\theta = \frac{\vec{v_1} \cdot \vec{v_2}}{|\vec{v_1}||\vec{v_2}|}]
    • 두 벡터의 내적과 역삼각함수를 활용해 각도를 계산합니다.

2. Monster 클래스


클래스 구성:

  • Init(): 몬스터 초기화 (체력, 위치, 방향 설정)
  • Render(): 몬스터를 화면에 출력하고, 방향 및 각도 계산
  • 역삼각함수를 활용하여 몬스터와 마우스 사이의 각도를 계산

1) 생성자 및 소멸자

Monster::Monster() : Object(ObjectType::Monster) {}
Monster::~Monster() {}
  • 생성자: 몬스터 객체를 생성하고 기본 속성을 초기화합니다.
  • 소멸자: 특별한 동작 없이 객체를 삭제합니다.

2) Init() 함수

void Monster::Init()
{
    _stat.hp = 100;
    _stat.maxHp = 100;
    _stat.speed = 10;

    _pos = Pos{ 400, 300 };  // 초기 위치 설정
    _lookPos = Pos{ 530, 70 };  // 몬스터가 바라보는 목표 위치
    _lookDir = _lookPos - _pos;  // 방향 벡터 계산
    _lookDir.Normalize();  // 단위 벡터로 변환
}
  • 몬스터의 체력, 속도, 위치, 방향을 초기화합니다.
  • _lookDir은 방향 벡터로, 몬스터가 목표를 바라보는 방향을 나타냅니다.

3) Render() 함수

void Monster::Render(HDC hdc)
{
    Utils::DrawCircle(hdc, _pos, 100);  // 몬스터를 원형으로 시각화

    HPEN pen = ::CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
    HPEN oldPen = (HPEN)::SelectObject(hdc, (HGDIOBJ)pen);
    {
        Utils::DrawLine(hdc, _pos, _lookPos);  // 몬스터의 방향 표시
    }
    ::SelectObject(hdc, oldPen);
    ::DeleteObject(pen);

    Vector mousePos = GET_SINGLE(InputManager)->GetMousePos();  // 마우스 위치
    Vector monsterToMouseDir = mousePos - _pos;  // 마우스 방향 계산
    monsterToMouseDir.Normalize();

    float dot = monsterToMouseDir.Dot(_lookDir);  // 두 벡터 내적
    float rad = ::acos(dot);  // 아크코사인으로 각도 계산
    float angle = rad * 180 / 3.14;  // 라디안을 도(degree)로 변환
}
  • 내적과 역삼각함수를 활용하여 몬스터와 마우스 사이의 각도를 계산:
    • dot 값은 두 벡터의 방향 유사도를 나타냅니다.
    • acos로 각도를 구하며, 라디안 값을 도 단위로 변환합니다.

profile
李家네_공부방

0개의 댓글