1. 외적의 정의

외적은 두 벡터 간의 관계를 통해 새로운 벡터를 생성하는 연산입니다.
이는 주로 3차원 공간에서 사용되며, 결과는 두 벡터 모두에 수직인 벡터입니다.

  • 수학적 정의:
    [A×B=ABsinθk^\vec{A} \times \vec{B} = |\vec{A}| |\vec{B}| \sin\theta \hat{k}]
    • ( A,B|\vec{A}|, |\vec{B}| ): 벡터 크기(길이).
    • ( sinθ\sin\theta ): 벡터 간 각도의 사인 값.
    • ( k^\hat{k} ): 결과 벡터의 방향을 나타내는 단위벡터.
    • 결과는 두 벡터와 수직이며 오른손 법칙에 따라 방향이 결정됩니다.

2D 외적

  • 2D에서는 외적이 스칼라 값으로 계산됩니다.
  • 이는 (zz)-축을 0으로 가정하고, 단순히 각도를 측정하는 데 사용됩니다:
    [A×B=x1y2x2y1\vec{A} \times \vec{B} = x_1y_2 - x_2y_1]

2. 외적의 기하학적 의미

(a) 평행사변형 면적

외적의 크기는 두 벡터가 만드는 평행사변형의 넓이와 같습니다:
[A×B=ABsinθ|\vec{A} \times \vec{B}| = |\vec{A}| |\vec{B}| \sin\theta]

(b) 수직 벡터 생성

  • 외적 결과는 항상 두 벡터에 수직인 벡터입니다.
  • 오른손 법칙에 따라 방향이 결정됩니다:
    1. 오른손을 ( A\vec{A} )에서 ( B\vec{B} )로 감쌀 때, 엄지손가락이 결과 벡터의 방향을 가리킴.
    2. ( B×A\vec{B} \times \vec{A} )를 수행하면 방향이 반대로 바뀌어 음수 벡터가 나옵니다.

(c) 시계/반시계 방향 판별

  • 2D에서 외적의 부호를 통해 벡터의 방향성을 판단합니다:
    • ( A×B>0\vec{A} \times \vec{B} > 0 ): 반시계 방향.
    • ( A×B<0\vec{A} \times \vec{B} < 0 ): 시계 방향.
    • ( A×B=0\vec{A} \times \vec{B} = 0 ): 두 벡터는 평행.

3. 외적의 응용

(a) 시계/반시계 방향 체크

외적은 두 벡터의 상대적인 방향성을 판단할 수 있습니다:

  • 외적 값의 부호를 사용해 시계 방향 또는 반시계 방향을 확인합니다.

(b) 범위 판별

외적은 점 (P)가 특정 영역(삼각형 또는 다각형) 내에 있는지 확인하는 데 사용됩니다:
1. 삼각형의 세 점 (P1), (P2), (P3)에 대해 외적을 계산.
2. 점 (P)가 삼각형 내부에 있으면 세 외적의 부호가 동일합니다.

(c) 법선 벡터 계산

3D 공간에서 평면의 법선 벡터를 계산해 조명 계산, 충돌 처리 등에 사용합니다:
[N=A×B\vec{N} = \vec{A} \times \vec{B}]

  • ( N\vec{N} ): ( A\vec{A} )와 ( B\vec{B} )에 수직인 법선 벡터.

4. 강의 분석

강의에서는 외적의 수학적 정의부터 게임에서의 응용까지 설명하고 있습니다.

Page 4-5: 외적 정의

  • 공식:
    [A×B=(x1y2x2y1)k^\vec{A} \times \vec{B} = (x_1y_2 - x_2y_1) \hat{k}]
    • 그래프에서는 외적의 크기가 평행사변형 면적과 같음을 설명.
    • 오른손 법칙을 통해 결과 벡터 방향을 확인.

Page 6-7: 게임에서의 외적 활용

  • 외적을 사용해 특정 점이 삼각형 내부에 있는지 확인:
    1. 삼각형의 세 벡터 간 외적 계산.
    2. 모두 같은 부호를 가지면 점이 삼각형 내부에 있음.

5. 코드 분석

(a) 외적 구현: Vector 클래스

struct Vector {
    float x, y;

    // 외적 계산 함수
    float Cross(Vector other) {
        return x * other.y - y * other.x;
    }
};
  • Cross 함수는 2D 외적을 계산:
    [Cross(V1,V2)=x1y2x2y1\text{Cross}(V_1, V_2) = x_1y_2 - x_2y_1]

(b) 외적을 활용한 삼각형 내부 점 판별

삼각형 내부 점 판별을 위해 외적을 사용:

void Monster::Update() {
    // 마우스 위치
    Vector mousePos = GET_SINGLE(InputManager)->GetMousePos();

    // 삼각형 세 점 간 벡터
    Vector v12 = _pt2 - _pt1;
    Vector v1m = mousePos - _pt1;
    Vector v13 = _pt3 - _pt1;

    // 외적 계산
    float c1 = v12.Cross(v1m);
    float c2 = v1m.Cross(v13);

    // 삼각형 내부 판별
    if (c1 >= 0 && c2 >= 0) {
        _pos = mousePos; // 삼각형 내부
    } else {
        _pos = { -1000, -1000 }; // 삼각형 외부
    }
}
  • 외적 계산:
    • ( c1 ): 점이 ( P1 )와 ( P2 )를 잇는 벡터와의 관계.
    • ( c2 ): 점이 ( P1 )와 ( P3 )를 잇는 벡터와의 관계.
  • 결과 판별:
    • ( c1, c2 )의 부호가 같으면 점은 삼각형 내부에 있습니다.
(c) 렌더링 코드: 삼각형과 마우스 위치 시각화
void Monster::Render(HDC hdc) {
    // 삼각형 그리기
    Utils::DrawLine(hdc, _pt1, _pt2);
    Utils::DrawLine(hdc, _pt2, _pt3);
    Utils::DrawLine(hdc, _pt3, _pt1);

    // 마우스 위치 표시
    Vector mousePos = GET_SINGLE(InputManager)->GetMousePos();
    Utils::DrawLine(hdc, _pt1, mousePos);

    // 외적 값 출력
    float c1 = ...; // 외적 계산 값
    float c2 = ...; // 외적 계산 값
    std::wstring str = std::format(L"c1({0}) c2({1})", c1, c2);
    Utils::DrawTextW(hdc, { 20, 50 }, str);
}

6. 외적과 내적 비교

  • 내적:

    • 결과는 스칼라 값.
    • 크기와 방향 간 관계를 계산 (코사인 기반).
    • 예: 두 벡터가 직교하는지 판단.
  • 외적:

    • 결과는 벡터 값.
    • 두 벡터에 수직인 새로운 벡터 생성 (사인 기반).
    • 예: 평면의 법선 벡터 계산.

profile
李家네_공부방

0개의 댓글