함수, 선형성, 선형 보간(Lerp)

김민수·2025년 2월 11일
0

게임수학

목록 보기
4/8

1. 함수(Function)의 개념

1.1 함수의 정의

  • 함수는 입력값(Input)에 일정 규칙(Rule)을 적용해 출력값(Output)을 결정하는 대응 관계이다.
  • 보통 f(x)f(x)로 표현하며, xx를 입력하면 f(x)f(x)를 출력한다는 뜻이다.

예시
만약 f(x)=2xf(x) = 2x라고 할 때, x=3x = 3이면 f(3)=6f(3) = 6이 된다.


1.2 정의역, 공역, 치역

  • 정의역(Domain): 함수에 들어갈 수 있는 입력값들의 집합.
  • 공역(Codomain): 함수가 출력할 수 있는 값들의 전체 집합(가능한 범위).
  • 치역(Range): 함수가 실제로 만들어내는 출력값들의 집합.
    • 치역은 공역의 부분집합이 될 수 있다.

1.3 단사, 전사, 전단사 함수

  • 단사(Injective): 다른 입력이면 항상 다른 출력.
    • 즉, f(x1)=f(x2)f(x_1) = f(x_2)이면 x1=x2x_1 = x_2.
    • 예: f(x)=x2f(x) = x^2f(2)=f(2)=4f(2) = f(-2) = 4이므로 단사가 아님.
  • 전사(Surjective): 공역의 모든 원소가 적어도 하나의 정의역 원소와 연결됨.
    • 공역 = 치역인 경우를 말한다.
    • 예: f(x)=x2f(x) = x^2에서 공역을 R\mathbb{R}로 잡으면 음수는 나오지 않으므로 전사가 아님.
  • 전단사(Bijective): 단사이면서 전사인 함수.
    • 전단사 함수에는 항상 역함수가 존재한다.
    • 예: f(x)=xf(x) = x는 입력이 다르면 출력도 다르고, 공역=치역이므로 전단사 함수다.

1.4 역함수

  • 역함수(f1(x)f^{-1}(x)): 원래 함수의 출력을 입력으로 받아, 원래의 입력을 반환하는 새로운 함수.
    • f1(f(x))=xf^{-1}(f(x)) = x.
  • 전단사 함수가 아니면 역함수가 정의될 수 없다(단사 + 전사 조건 필요).

예시) f(x)=2x+3f(x) = 2x + 3의 역함수를 구해보자.
1. y=2x+3y = 2x + 3
2. x=y32x = \frac{y - 3}{2}
3. f1(x)=x32f^{-1}(x) = \frac{x - 3}{2}


2. 게임 개발에서의 함수 예시

게임에서 함수는 캐릭터의 체력 관리, 아이템 사용, NPC 상태 업데이트 등 입력과 출력을 명확히 설정하고, 그에 따라 동작이 결정되는 메서드 형태로 자주 구현된다.

#include <iostream>
#include <algorithm> // std::max 사용

float ClampHealth(float health) {
    // 체력이 0 미만으로 내려가지 않도록 제한
    return std::max(0.0f, health);
}

int main() {
    float playerHealth = -10.0f;
    playerHealth = ClampHealth(playerHealth);

    std::cout << "Player Health: " << playerHealth << "\n"; 
    // 결과: 0, 체력이 음수로 내려가지 않도록 보정
    return 0;
}
  • 이 예시에서, 정의역은 ‘플레이어 체력으로 가질 수 있는 모든 실수’일 수 있지만, 실제 치역은 0 이상의 값으로 제한된다.
  • 논리적 예측 범위(체력은 절대 음수가 되지 않아야 함)를 함수로 강제함으로써 의도된 게임 동작을 보장하도록 한다.

3. 선형성(Linearity)의 개념

3.1 수학적 선형성의 정의

함수 f(x)f(x)가산성(Additivity)1차 동차성(Homogeneity)을 모두 만족할 때 선형(Linear)이라고 한다.

  1. 가산성: 두 입력 xx, yy를 더해서 입력한 것에 대한 출력이 xx, yy 각각에 대한 출력을 합한 것과 동일한 경우
    f(x+y)=f(x)+f(y)f(x + y) = f(x) + f(y)

  2. 1차 동차성: 어떤 함수의 입력을 aa배 했을 때의 출력이 원래 입력의 출력을 aa배한 것과 동일한 경우
    f(ax)=af(x)f(a \cdot x) = a \cdot f(x)


3.2 선형함수 vs 일차함수

  • 수학적 선형함수: 절편이 0인 형태, 예) f(x)=axf(x) = a \cdot x.
    • 예: f(x)=2xf(x) = 2xf(0)=0f(0) = 0 만족
  • 일차함수(Affine Function): f(x)=ax+bf(x) = a \cdot x + b에서 b0b \neq 0일 수 있어,
    • 가산성과 1차 동차성을 동시에 만족하지 못해 “완전히” 선형이라 부르기 어렵다.

예시

  • 선형함수 f(x)=2xf(x) = 2xf(x+y)=2(x+y)f(x + y) = 2(x+y)이며, 가산성과 1차 동차성을 충족한다.
  • 일차함수 f(x)=2x+5f(x) = 2x + 5f(x+y)=2(x+y)+5f(x + y) = 2(x+y) + 5f(x)+f(y)=2x+5+2y+5=2(x+y)+10f(x) + f(y) = 2x + 5 + 2y + 5 = 2(x+y) + 10과 달라 선형성이 없다.

4. 선형 보간(Linear Interpolation, Lerp)

4.1 Lerp란?

  • 선형 보간은 두 점 사이의 값을 일정 비율 tt에 맞춰 계산해 부드럽게 이동 혹은 색상 변화 등을 표현하는 기법이다.
  • 2차원 점 (x0,y0)(x_0, y_0)(x1,y1)(x_1, y_1) 사이를 보간하는 식:
    x(t)=(1t)x0+tx1,y(t)=(1t)y0+ty1,0t1.x(t) = (1 - t)x_0 + t x_1,\quad y(t) = (1 - t)y_0 + t y_1,\quad 0 \le t \le 1.

4.2 C++ 예시

#include <iostream>

struct Vector2 {
    float x, y;

    // 2D 선형 보간 함수
    Vector2 LerpTo(const Vector2& target, float t) const {
        return {
            (1 - t) * x + t * target.x,
            (1 - t) * y + t * target.y
        };
    }

    void Print() const {
        std::cout << "Position: (" << x << ", " << y << ")\n";
    }
};

int main() {
    Vector2 start = {0.0f, 0.0f};
    Vector2 end   = {10.0f, 5.0f};

    for (float t = 0.0f; t <= 1.0f; t += 0.2f) {
        Vector2 interpolated = start.LerpTo(end, t);
        interpolated.Print();
    }
    return 0;
}

실행 결과:

Position: (0.0, 0.0)
Position: (2.0, 1.0)
Position: (4.0, 2.0)
Position: (6.0, 3.0)
Position: (8.0, 4.0)
Position: (10.0, 5.0)
  • tt가 0에서 1로 증가함에 따라, 시작점에서 끝점으로 차츰 이동한다.

4.3 선형 보간의 선형성

선형 보간 함수를 L(t,v0,v1)=(1t)v0+tv1L(t, v_0, v_1) = (1 - t)v_0 + t v_1라 하면,

  • 가산성:
    L(t,v0+v0,v1+v1)=(1t)(v0+v0)+t(v1+v1)=(1t)v0+tv1+(1t)v0+tv1.L(t,\, v_0 + v_0',\, v_1 + v_1') = (1-t)(v_0 + v_0') + t(v_1 + v_1') = (1-t)v_0 + t v_1 + (1-t)v_0' + t v_1'.
    이는 L(t,v0,v1)+L(t,v0,v1)L(t, v_0, v_1) + L(t, v_0', v_1')의 형태로 정리 가능하다.
  • 1차 동차성:
    L(t,αv0,αv1)=(1t)(αv0)+t(αv1)=α((1t)v0+tv1)=αL(t,v0,v1).L(t,\, \alpha v_0,\, \alpha v_1) = (1 - t)(\alpha v_0) + t(\alpha v_1) = \alpha \big((1 - t)v_0 + t v_1\big) = \alpha \, L(t, v_0, v_1).
  • 따라서 벡터 보간에서의 Lerp 연산도 선형성의 성질을 가진다.
profile
안녕하세요

0개의 댓글