삼각함수로 하트 그리기

 

CK 소프트 렌더러는 각도법과 호도법을 사용해 sin함수와 cos함수 값을 얻어올 수 있도록 함수를 제공한다.

float sin, cos;
Math::GetSinCos(sin, cos, 30); // 30 degree
Math::GetSinCos(sin, cos, Math::TwoPI); // 2pi radian

 

일명 하트 방정식이라 불리는 식을 이용해 하트를 그려보는 코드를 짜보자.

 

x = 16 sin^3세타

y = 13 cos세타 - 5cos 2세타 - 2cos3세타 - cos4세타

 

// 게임 로직과 렌더링 로직이 공유하는 변수
Vector2 currentPosition;
float currentScale = 10.f;

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

	Vector2 inputVector = Vector2(input.GetAxis(InputAxis::XAxis), input.GetAxis(InputAxis::YAxis)).GetNormalize();
	Vector2 deltaPosition = inputVector * moveSpeed * InDeltaSeconds;
	float deltaScale = input.GetAxis(InputAxis::ZAxis) * scaleSpeed * InDeltaSeconds;
	// 물체의 최종 상태 결정
	currentPosition += deltaPosition;
	currentScale = Math::Clamp(currentScale + deltaScale, scaleMin, scaleMax);
}

// 렌더링 로직을 담당하는 함수
void SoftRenderer::Render2D()
{
	...
	// 렌더링 로직의 로컬 변수
	float rad = 0.f;
	static float increment = 0.001f;
	static std::vector<Vector2> hearts;

	// 하트를 구성하는 점 생성
	if (hearts.empty())
	{
		for (rad = 0.f; rad < Math::TwoPI; rad += increment)
		{
			// 하트 방정식
			// x와 y를 구하기.
			float sin = sinf(rad);
			float cos = cosf(rad);
			float cos2 = cosf(2 * rad);
			float cos3 = cosf(3 * rad);
			float cos4 = cosf(4 * rad);
			float x = 16.f * sin * sin * sin;
			float y = 13 * cos - 5 * cos2 - 2 * cos3 - cos4;

			hearts.push_back(Vector2(x, y));
		}
	}

	for (auto const& v : hearts)
	{
		r.DrawPoint(v * currentScale + currentPosition, LinearColor::Blue);
	}

	r.PushStatisticText(std::string("Position : ") + currentPosition.ToString());
	r.PushStatisticText(std::string("Scale : ") + std::to_string(currentScale));
}

출력 결과물
PgUp, PgDn 키를 이용해 크기를 변화시킴

각을 0에서 2파이까지 서서히 증가시키는 루프를 통해 각의 x와 y값을 구한 뒤, 벡터로 만들어 hearts에 추가합니다.

hearts에 보관한 모든 점에 현재 위치와 크기 값을 반영한 후 파란 점으로 찍어 구현할 수 있습니다. 

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

삼각함수를 활용한 물체의 회전 (실습)  (0) 2024.11.29
삼각 함수를 활용한 물체의 회전(개념)  (0) 2024.11.29
삼각함수(개념)  (0) 2024.11.28
벡터의 결합과 생성  (0) 2024.11.27
벡터의 크기와 이동  (0) 2024.11.27

+ Recent posts