Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

3냥 집사이면서 게임 개발자입니다.

벡터로 원 그리기 (실습) 본문

카테고리 없음

벡터로 원 그리기 (실습)

훙이야 2024. 11. 27. 16:49

프로젝트 환경은 이전과 같습니다.

 

벡터로 원그리기 

반지름이 5인 원을 생성하기 위해, 먼저 원을 둘러싼 사각형 영역을 생성하고, 이로부터 원을 구성하는 벡터만 골라내는 방법을 사용한다.

사각형 영역을 구성하는 벡터에서 반지름의 크기가 5보다 작거나 같은 벡터를 묶으면 원의 형태가 만들어진다.

사각형 영역에 속한 각 벡터의 크기는 벡터의 크기 수식을 사용해 계산할 수 있으며,  CK소프트 렌더러 Vector2 에 구현되어 있다.

struct Vector2
{
	...
    FORCEINLINE float Size() const;
    FORCEINLINE constexpr float SizeSquared() const;
    
    ...
};

FORCEINLINE float Vector2::Size() const
{
	return sqrtf(SizeSquared());
}

FORECEINLINE constexpr float Vector2::SizeSquared() const
{
	return X * X + Y * Y;
}

 

Size 함수 : SizeSquared 함수를 호출해 얻어진 값에 제곱근을 취해 벡터의 크기를 반환하는 함수다. 

 

// 게임 로직과 렌더링 로직이 공유하는 변수
Vector2 currentPosition(100.f, 100.f);

// 게임 로직을 담당하는 함수
void SoftRenderer::Update2D(float InDeltaSeconds)
{
	...
	// 게임 로직의 로컬 변수
	static float moveSpeed = 100.f;

	// 기존의 방식은 X축 입력과 Y축 입력이 동시에 들어오면 크기가 루트2, 약 1.41이라는 크기를 갖는다.
	// 이를 1로 고정하기 위해 Normalize 한다.
	Vector2 inputVector = Vector2(input.GetAxis(InputAxis::XAxis), input.GetAxis(InputAxis::YAxis)).GetNormalize();
	Vector2 deltaPosition = inputVector * moveSpeed * InDeltaSeconds;

	// 물체의 최종 상태 설정
	currentPosition += deltaPosition;
}

// 렌더링 로직을 담당하는 함수
void SoftRenderer::Render2D()
{
	...
	// 렌더링 로직의 로컬 변수
	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)
			{
				Vector2 PointToTest = Vector2(x, y);
                // Size 함수가 아닌 SizeSquared 함수를 이용해 x^2 + y^2 값을 계산한다.
				float squaredLength = PointToTest.SizeSquared();
                // 벡터의 크기와 원의 반지름 값을 두번 곱한 뒤 비교한다. 안에 속해있다고 판단되면 vector에 보관
				if(squaredLength <= radius * radius)
				{
					circles.push_back(Vector2(x, y));
				}
			}
		}
	}

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

	r.PushStatisticText("Coordinate : " + currentPosition.ToString());
}