수학/게임 수학

이득우의 게임 수학 3장 벡터(2차원 공간)

게임 개발 2024. 10. 18. 18:19

 

벡터로 원그리기

반지름이 5인 원을 생성하기 위해,

먼저 원을 둘러싼 사각형 영역을 생성하고,

이로부터 원을 구성하는 벡터만 골라내는 방법을 시각화 할 것이다.

 

반지름의 크기가 5보다 작거나 같은 벡터를 묶으면 원의 형태가 만들어진다.

 

#pragma once

namespace CK
{

struct Vector2

...

FORCEINLINE float Vector2::Size() const
{
	return sqrtf(SizeSquared());
}
    // x^2 + y^2의 값을 계산한 후 그 값을 반환한다.
FORCEINLINE constexpr float Vector2::SizeSquared() const
{
	return X * X + Y * Y;
}

...

 

 

이 영역을 구하는 벡터의 크기는 벡터의 크기 수식을 사용해 계산할 수 있으며

Vector2 선언에 있는 Size 함수에 구현되어 있다.

 


	// GetNormalize()함수를 사용해 입력 벡터의 크기를 항상 1로 정규화한다.
	Vector2 inputVector = Vector2(input.GetAxis(InputAxis::XAxis), input.GetAxis(InputAxis::YAxis));
	Vector2 deltaPosition = inputVector * moveSpeed * InDeltaSeconds;

 

 

Vector2 동적 배열을 만든 뒤,

x,y 좌표가 모두 반지름 영역 안이라면 추가해주도록 한다.

// 그려낼 반지름의 크기
static float radius = 50.f;
// 원을 구성하기 위한 점을 보관하기 위한 자료구조로 vector를 선택
// 한번 생성한 변수는 계속 유지될 수 있도록 static으로 선언하였다.
static std::vector<Vector2> circles;

if (circles.empty()) {
	for (float x = -radius; x <= radius; x++) {
		for (float y = -radius; y <= radius; y++) {
			Vector2 pointToTest = Vector2(x, y);
			float squaredLength = pointToTest.SizeSquared();
			if (squaredLength <= radius * radius) {
				circles.push_back(Vector2(x, y));
			}
		}
	}
}

 

 

이후 그려질 영역의 색깔과,

그려지는 원의 중점 좌표를 가지고 있는 string을 출력해준다.

 

	// 원을 구성하는 벡터를 모두 파란색으로 표시한다.
	for (auto const& v : circles) {
		r.DrawPoint(v + currentPosition, LinearColor::Blue);
	}

	// 원의 중심 좌표를 우상단에 출력
	r.PushStatisticText("Coordinate : " + currentPosition.ToString());

 

 

해당 코드를 완성하면 다음과 같은 화면을 볼 수 있다.

 

 

 

벡터의 결합과 생성

 

벡터 공간의 벡터의 합과 스칼라 곱셈 연산은 선형성이 있어 선형 연산이라고도 한다.

선형 연산을 사용해 n개의 스칼라와 n개의 벡터를 결합해

새로운 벡터를 생성하는 수식을 선형 결합이라 한다.

 

여기서 벡터의 모든 원소가 0으로 구성된 영벡터를 생각했을 때

선형 결합의 결과가 영벡터가 나오는 수식은 아래와 같다.

 

벡터에 곱하는 스칼라가 값이 0이면, 선형 결합의 결과는 항상 영벡터가 된다.

 

그런데 스칼라가 0이 아니더라도 영벡터는 나올 수 있다.

이러한 경우는

선형 결합에 사용된 벡터들은 서로 선형 종속의 관계를 가진다라고 표현한다.

 

반면 영벡터가 나오기 위해서 스칼라가 0이 되야한다면,

선형 결합에 사용된 벡터들은 서로 선형 독립의 관계를 가진다.

 

이러한 선형적 관계는 벡터 공간을 다룰 때 중요하게 사용된다.

 

선형 독립의 관계를 가지는 벡터를 선형 결합하면

벡터 공간에 속한 모든 벡터를 생성할 수 있기 때문이다.

 

각 벡터에 어떠한 임의의 스칼라 값을 곱해주느냐에 따라,

임의의 벡터 w를 생성하는 수식을 만족하기 때문이다.

 

a와 b에 대한 연립방정식으로 보고 풀어본다면

그 값은 벡터 w의 좌표값인 wx, wy값에 따라 결정되며,

언제나 해가 존재함을 알 수 있다.

 

두 벡터를 결합했을 때 5,5가 나온다고 가정하고 식을 작성하면 아래와 같다.

 

만일 선형 종속의 관계를 가지는 벡터를 결합하면,

평행한 벡터만 생성될 뿐이고, 평행하지 않은 벡터를 생성하는 것은 불가능하다.

 

그렇다면 벡터 3개를 결합해 선형 독립 관계를 가질 수 있을까?

0이 아닌 스칼라 c를 사용해 영벡터를 만들 수 있으므로

선형 독립 관계를 만족하지 못한다.

 

선형 독립 관계를 가지기 위해서는

2개의 벡터만 사용되어야 함을 알 수 있다.

 

 

벡터 공간에 관련된 몇 가지 용어

 

선형 독립 관계를 가지는 벡터의 집합을 기저라고 한다.

집합의 개념인 기저에 속한 원소를 기저벡터라 한다,

 

기저벡터를 다른 값으로 변경하면

기저벡터로부터 세워진 벡터 공간의 모든 원소가 바뀐다고 볼 수 있다.

 

이러한 기저의 개념은 차원이라는 용어를 정의하는데 사용된다.

 

기저 집합의 원소 수는 언제나 2개뿐이다.

명확한 정의에 의해 평면에 대응하는 벡터 공간을

비로소 2차원에 정의할 수 있다.

 

2차원 표준기저벡터 순서

 

3차원 표준기저벡터 순서

 

 

'수학 > 게임 수학' 카테고리의 다른 글

이득우의 게임 수학 열기  (0) 2024.10.18
유클리드 공간  (0) 2024.01.19
행렬과 삼각함수  (0) 2023.02.19
삼각함수 - 일반각과 삼각비  (0) 2023.01.17