1. 외적의 정의
외적은 두 벡터 간의 관계를 통해 새로운 벡터를 생성하는 연산입니다.
이는 주로 3차원 공간에서 사용되며, 결과는 두 벡터 모두에 수직인 벡터입니다.
- 수학적 정의:
[A×B=∣A∣∣B∣sinθk^]
- ( ∣A∣,∣B∣ ): 벡터 크기(길이).
- ( sinθ ): 벡터 간 각도의 사인 값.
- ( k^ ): 결과 벡터의 방향을 나타내는 단위벡터.
- 결과는 두 벡터와 수직이며 오른손 법칙에 따라 방향이 결정됩니다.
2D 외적
- 2D에서는 외적이 스칼라 값으로 계산됩니다.
- 이는 (z)-축을 0으로 가정하고, 단순히 각도를 측정하는 데 사용됩니다:
[A×B=x1y2−x2y1]
2. 외적의 기하학적 의미
(a) 평행사변형 면적
외적의 크기는 두 벡터가 만드는 평행사변형의 넓이와 같습니다:
[∣A×B∣=∣A∣∣B∣sinθ]
(b) 수직 벡터 생성
- 외적 결과는 항상 두 벡터에 수직인 벡터입니다.
- 오른손 법칙에 따라 방향이 결정됩니다:
- 오른손을 ( A )에서 ( B )로 감쌀 때, 엄지손가락이 결과 벡터의 방향을 가리킴.
- ( B×A )를 수행하면 방향이 반대로 바뀌어 음수 벡터가 나옵니다.
(c) 시계/반시계 방향 판별
- 2D에서 외적의 부호를 통해 벡터의 방향성을 판단합니다:
- ( A×B>0 ): 반시계 방향.
- ( A×B<0 ): 시계 방향.
- ( A×B=0 ): 두 벡터는 평행.
3. 외적의 응용
(a) 시계/반시계 방향 체크
외적은 두 벡터의 상대적인 방향성을 판단할 수 있습니다:
- 외적 값의 부호를 사용해 시계 방향 또는 반시계 방향을 확인합니다.
(b) 범위 판별
외적은 점 (P)가 특정 영역(삼각형 또는 다각형) 내에 있는지 확인하는 데 사용됩니다:
1. 삼각형의 세 점 (P1), (P2), (P3)에 대해 외적을 계산.
2. 점 (P)가 삼각형 내부에 있으면 세 외적의 부호가 동일합니다.
(c) 법선 벡터 계산
3D 공간에서 평면의 법선 벡터를 계산해 조명 계산, 충돌 처리 등에 사용합니다:
[N=A×B]
- ( N ): ( A )와 ( B )에 수직인 법선 벡터.
4. 강의 분석
강의에서는 외적의 수학적 정의부터 게임에서의 응용까지 설명하고 있습니다.
Page 4-5: 외적 정의
- 공식:
[A×B=(x1y2−x2y1)k^]
- 그래프에서는 외적의 크기가 평행사변형 면적과 같음을 설명.
- 오른손 법칙을 통해 결과 벡터 방향을 확인.
Page 6-7: 게임에서의 외적 활용
- 외적을 사용해 특정 점이 삼각형 내부에 있는지 확인:
- 삼각형의 세 벡터 간 외적 계산.
- 모두 같은 부호를 가지면 점이 삼각형 내부에 있음.
5. 코드 분석
(a) 외적 구현: Vector 클래스
struct Vector {
float x, y;
float Cross(Vector other) {
return x * other.y - y * other.x;
}
};
Cross 함수는 2D 외적을 계산:
[Cross(V1,V2)=x1y2−x2y1]
(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. 외적과 내적 비교
-
내적:
- 결과는 스칼라 값.
- 크기와 방향 간 관계를 계산 (코사인 기반).
- 예: 두 벡터가 직교하는지 판단.
-
외적:
- 결과는 벡터 값.
- 두 벡터에 수직인 새로운 벡터 생성 (사인 기반).
- 예: 평면의 법선 벡터 계산.