삼각함수로 하트 그리기
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));
}
각을 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 |