2 minute read

선형보간법 구현

선형보간법(Linear Interpolation)은 주어진 데이터 점들 사이의 값을 추정하는 방법이다. 두 점 사이의 직선을 이용해서 중간값을 계산하는 간단하면서도 유용한 기법이다.

선형보간법이란?

선형보간법은 두 개의 알려진 데이터 점 (x₁, y₁)과 (x₂, y₂) 사이에서 임의의 x값에 대한 y값을 구하는 방법이다.

수학적으로는 다음과 같이 표현할 수 있다:

y = y₁ + (y₂ - y₁) × (x - x₁) / (x₂ - x₁)

이 공식은 두 점을 잇는 직선의 방정식에서 유도된다. 기울기를 구하고, 그 기울기를 이용해서 중간값을 계산하는 것이다.

언제 사용하나?

선형보간법은 다음과 같은 상황에서 유용하다:

  • 그래픽 처리: 이미지 리사이징, 텍스처 매핑
  • 게임 개발: 애니메이션, 카메라 움직임
  • 과학 계산: 실험 데이터 분석, 시뮬레이션
  • 오디오 처리: 샘플링 레이트 변환

구현

이제 C++로 선형보간법을 구현해보자. 템플릿을 사용해서 다양한 데이터 타입에 대응할 수 있도록 만들었다.

template <typename T>
T interpolate(std::vector<T> &xData, std::vector<T> &yData, T x) {
   int size = xData.size();
   int i = 0;
   
   // 경계값 처리
   if (x >= xData[size - 2]) {
      i = size - 2;
   }
   else {
      // 적절한 구간 찾기
      while (x > xData[i+1]) i++;
   }
   
   // 보간에 사용할 두 점
   T xL = xData[i];
   T yL = yData[i];
   T xR = xData[i+1];
   T yR = yData[i+1];
   
   // 기울기 계산
   T dydx = (yR - yL) / (xR - xL);
   
   // 선형보간 수행
   return yL + dydx * (x - xL);
}

사용 예제

int main() {
    // 원본 데이터
    std::vector<double> xData = { 1, 5, 10, 15, 20 };
    std::vector<double> yData = { 0.3, 0.5, 0.8, 0.1, 0.14 };

    // 다양한 x값에 대한 보간 결과
    std::cout << "x=0.0일 때: " << interpolate(xData, yData, 0.0) << std::endl;
    std::cout << "x=2.0일 때: " << interpolate(xData, yData, 2.0) << std::endl;
    std::cout << "x=5.0일 때: " << interpolate(xData, yData, 5.0) << std::endl;
    std::cout << "x=30.0일 때: " << interpolate(xData, yData, 30.0) << std::endl;

    return 0;
}

코드 설명

구간 찾기

if (x >= xData[size - 2]) {
   i = size - 2;
}
else {
   while (x > xData[i+1]) i++;
}

입력된 x값이 어느 구간에 속하는지 찾는다. 만약 x가 마지막 구간보다 크거나 같다면 마지막 구간을 사용한다.

기울기 계산

T dydx = (yR - yL) / (xR - xL);

두 점 사이의 기울기를 계산한다. 이 기울기가 선형보간의 핵심이다.

보간 수행

return yL + dydx * (x - xL);

왼쪽 점에서 시작해서 기울기를 이용해 목표 지점까지의 값을 계산한다.

주의사항

  1. 데이터 정렬: xData는 반드시 오름차순으로 정렬되어 있어야 한다
  2. 경계 처리: x값이 데이터 범위를 벗어날 때의 처리를 고려해야 한다
  3. 타입 안전성: 템플릿을 사용했으므로 적절한 타입을 선택해야 한다

확장 가능성

이 기본 구현을 바탕으로 다음과 같은 확장이 가능하다:

  • 다차원 보간: 2D, 3D 보간
  • 다른 보간법: 스플라인 보간, 베지어 곡선
  • 성능 최적화: 이진 탐색을 이용한 구간 찾기

선형보간법은 간단하지만 매우 유용한 기법이다. 게임이나 그래픽 프로그래밍에서 자주 사용되니 익혀두면 좋을 것이다.