1. 외적

a와 b의 외적의 방향은 오른손 법칙을 이용(a에서 b로 감아줬을 때 엄지손가락이 가리키는 방향)하여 알아낼 수 있다.

 

2. 게임에서 외적의 응용

(1) 시계 방향과 반시계 방향 이동 구하기

두 벡터가 원 또는 타원을 회전할 때 어떤 방향으로 이동하고 있는지 알 수 있다.

 

(2) 벡터가 다른 두 벡터 사이의 범위 내에 있는지 구하기

위의 그림과 같이 OP 선분이 OA, OB 선분 사이에 있으면, OA와 OP의 외적과 OP와 OB의 외적의 부호가 같다.

즉, 외적의 부호가 서로 같으면 => (+, +) 또는 (-, -) 이면 => 해당 영역(부채꼴 BOA) 안에 있다고 판단할 수 있다.

 

 

3. 몬스터가 영역 내에 위치하는지 판별하기

(1) 외적 구현하기

Types.h에서 수정한다.

	float Crss(Vector other)
	{
		return x * other.y - y * other.x;
	}

 

(2) 벡터 그리기

Monster.h에서 수정한다.

private:
	Vector _pt1 = { 400, 150 };
	Vector _pt2 = { 600, 450 };
	Vector _pt3 = { 200, 450 };
};

이어서 Monster.cpp에서 삼각형을 그려준다.

void Monster::Render(HDC hdc)
{
	Utils::DrawCircle(hdc, _pos, 50);

	HPEN pen = ::CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
	HPEN oldpen = (HPEN)::SelectObject(hdc, pen);
	{
		Utils::DrawLine(hdc, _pt1, _pt2);
		Utils::DrawLine(hdc, _pt2, _pt3);
		Utils::DrawLine(hdc, _pt3, _pt1);
	}
	::SelectObject(hdc, oldpen);
	::DeleteObject(pen);

그리고 삼각형의 위쪽 꼭지점에서 마우스까지 이어지는 선분을 그린다.

	// 마우스에서 꼭지점까지의 선분
	Utils::DrawLine(hdc, _pt1, mousePos);

이제 꼭지점에서 마우스로 이어지는 벡터와, 왼쪽 오른쪽 벡터를 만들어 단위벡터로 만들어준다.

	// 왼쪽
	Vector v12 = _pt2 - _pt1;
	// 마우스
	Vector v1m = mousePos - _pt1;
	// 오른쪽
	Vector v13 = _pt3 - _pt1;

	v12.Normalize();
	v1m.Normalize();
	v13.Normalize();

 

 

(3) 외적하고 판별하기

	float c1 = v12.Cross(v1m);
	float c2 = v1m.Cross(v13);

	if (c1 >= 0 && c2 >= 0)
	{

	}
	else
	{

	}

벡터들에 외적을 취하고 그 값을 저장한다.

	wstring str = std::format(L"c1({0}), c2({1})", c1, c2);
	Utils::DrawTextW(hdc, { 20, 50 }, str);

그리고 위의 코드로 출력시켜 값을 확인하면, 위 꼭지점과 마우스와의 벡터가 다른 두 벡터의 사이에 있으면 양수, 양수로 나타나는 것을 확인할 수 있다.

또한 삼각형의 위쪽으로 커서를 올리면 두 값이 음수, 음수로 나타나는 것을 확인할 수 있다.

이런 점을 활용하면 범위 공격이나 쿨타임 표시기를 만들 수 있게 된다.