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
반응형
'수학 > 이득우의 게임 수학 - 실습 예제' 카테고리의 다른 글
| 삼각함수를 사용한 하트의 회전 (0) | 2025.08.27 |
|---|---|
| sin 함수를 사용한 하트의 박동 표현 (0) | 2025.08.27 |
| 하트에 무지개 색상 입히기 (0) | 2025.08.27 |
| 삼각함수로 하트 그리기 (0) | 2025.08.24 |
| 2차원 벡터의 표현과 입력을 통한 벡터의 위치 변경 (0) | 2025.08.21 |