수학/이득우의 게임 수학 - 실습 예제

벡터의 크기와 벡터의 거리 값을 이용한 원의 표현

monstro 2025. 8. 24. 23:29
728x90
반응형

1) 벡터의 크기

 

벡터의 크기를 연산하는 식은 위와 같다

이를 코드로 구현하면 다음과 같이 작성이 가능하다

 

struct Vector2
{
public:
    ...

    // 멤버함수 
    FORCEINLINE float Size() const;
    FORCEINLINE constexpr float SizeSquared() const;
	
    ...
};

// 루트를 사용하는 연산
FORCEINLINE float Vector2::Size() const
{
    return sqrtf(SizeSquared());
}

// 루트를 사용하지 않는 연산
FORCEINLINE constexpr float Vector2::SizeSquared() const
{
    return X * X + Y * Y;
}

...

 

벡터의 크기(벡터의 x 좌표의 제곱) + (벡터의 y 좌표의 제곱)의 값의 제곱근을 사용하여 계산할 수 있다

그러나 제곱근을 사용하는 방식은 연산의 규모가 클수록 비효율적이므로 이를 생략할 수 있다

 

2) 벡터의 거리값을 이용한 원의 표현

...

// 물체의 현재 위치 벡터
Vector2 currentPosition(100.f, 100.f);

// 매 프레임마다 호출하는 함수
void SoftRenderer::Update2D(float InDeltaSeconds)
{
	// 사용자로부터 입력을 받기 위한 레퍼런스
	auto& g = Get2DGameEngine();
	const InputManager& input = g.GetInputManager();

	// 물체를 이동시키기 위한 속도
	static float moveSpeed = 100.f;
	
	// 매핑된 키로부터 사용자가 입력한 값을 가져오고, 입력값 * 속도 * 프레임시간의 값으로 2차원 벡터를 생성
	Vector2 inputVector = Vector2(input.GetAxis(InputAxis::XAxis), input.GetAxis(InputAxis::YAxis)).GetNormalize();
	Vector2 deltaPosition = inputVector * moveSpeed * InDeltaSeconds;

	// 물체의 최종 위치 벡터 설정
	currentPosition += deltaPosition;
}

// 화면에 렌더링하는 함수
void SoftRenderer::Render2D()
{
	// 화면에 렌더하기 위해 가져올 레퍼런스
	auto& r = GetRenderer();
	const auto& g = Get2DGameEngine();

	// 배경에 격자 그리기
	DrawGizmo2D();

	// 그릴 원의 반지름, 원을 구성하는 점들을 저장할 컨테이너
	static float radius = 50.f;
	static std::vector<Vector2> circles;

	// 컨테이너에 원을 구성할 점들을 저장하는 로직 
	if (circles.empty())
	{
		for (float x = -radius; x <= radius; ++x)
		{
			for (float y = -radius; y <= radius; ++y)
			{	
				/// x, y를 결합하여 점의 위치 벡터를 생성 
				Vector2 pointToTest = Vector2(x, y);
				// 위치벡터로부터 벡터의 크기(길이)를 연산, 제곱근을 사용하지 않는 방식
				float squaredLength = pointToTest.SizeSquared();
				// 점의 위치벡터의 길이가 원 내부에 있다면
				if (squaredLength <= radius * radius)
				{	
					// 컨테이너에 해당 점의 위치벡터를 저장
					circles.push_back(Vector2(x, y));
				}
			}
		}
	}

	// 원을 구성하는 점의 위치벡터를 모두 붉은 색으로 표시 
	for (auto const& v : circles)
	{
		r.DrawPoint(v + currentPosition, LinearColor::Red);
	}

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

...

 

원을 표현하는 로직은 위와 같이 구성하였다

벡터의 크기를 계산하는 식을 활용하여 벡터의 크기(길이)를 가져오고

가져온 벡터의 길이원의 내부에 있다면 그리도록 로직을 구성하였다

 

- 최종 실행 결과

728x90
반응형