사전 보간
알고리즘

보간

gabury1고친 사람 github-actions[bot]

보간은 값을 띄엄띄엄만 알고 있을 때 그 사이 지점의 값을 만들어 냅니다. 구하려는 지점이 양옆 점에서 얼마나 떨어졌는지를 보고 그 비율로 두 값을 섞습니다. 이 이름은 여러 분야가 함께 씁니다. 이 항목은 숫자 사이를 메우는 쪽을 다룹니다.

쉽고 빠른 이해

값을 띄엄띄엄만 알고 있을 때, 그 사이 지점의 값을 앞뒤 값에서 지어냅니다. 한 시간마다 잰 기온만 있다고 합시다. 두 시 반 기온을 물으면 두 시 값과 세 시 값의 가운데를 답합니다.

값을 모든 지점마다 재 두거나 저장해 둘 수는 없습니다. 삼각형 하나를 화면에 그리면 색을 정해야 할 화면의 작은 칸이 수만 개가 됩니다. 값은 꼭짓점 셋에만 있습니다. 보간이 없으면 값이 없는 칸은 채울 방법이 없습니다.

돌아가는 방식은 이렇습니다.

  1. 구하려는 지점이 양옆 점 중 어디에 얼마나 가까운지를 비율로 잽니다
  2. 가까운 쪽 값이 그 비율만큼 큰 몫을 갖습니다
  3. 두 몫을 더해 값 하나를 냅니다

대가가 있습니다. 나온 값은 재 본 값이 아니라 지어낸 값입니다. 두 점 사이에서 값이 크게 출렁였다면 보간은 그 출렁임을 놓치고 밋밋하게 이어 버립니다.

상세

보간은 값이 정해진 점 몇 개를 받아 그 사이 지점의 값 하나를 내주는 계산입니다. 넣는 것은 값을 아는 점들과 구하려는 위치입니다. 나오는 것은 그 위치의 값입니다.

한 시간 간격으로 적어 둔 기온 기록이 그런 입력입니다. 두 시와 세 시 기온만 적혀 있습니다. 두 시 반 기온이 필요하면 두 값 사이에서 값 하나를 지어내야 합니다. 그 일이 보간입니다.

값을 촘촘하게 다 갖고 있으면 보간이 필요 없습니다. 그런데 값은 대개 성깁니다. 재는 데 돈과 시간이 들거나, 다 저장하면 너무 커지거나, 아예 잴 수 없는 지점이기 때문입니다.

그래서 성긴 값만 들고 있다가 필요한 지점의 값을 그때그때 만들어 씁니다. 나온 값은 추측이지 측정이 아닙니다. 보간을 고르는 일은 「어떻게 추측할 것인가」의 규칙을 고르는 일입니다.

두 점 사이를 잇는 가장 단순한 규칙

가장 단순한 규칙은 두 점을 곧은 선으로 잇는 것입니다. 이 규칙이 선형 보간입니다.

구하려는 지점이 시작점에서 끝점 쪽으로 얼마나 왔는지를 0 과 1 사이의 수로 적습니다. 시작점이면 0, 끝점이면 1, 한가운데면 0.5 입니다. 이 수를 비율이라고 부르겠습니다.

block-beta
columns 5
  a["시작점 · 0"] b["0.25"] c["한가운데 · 0.5"] d["0.75"] e["끝점 · 1"]

비율은 값이 아니라 구간 위의 어느 지점인지를 가리킵니다. 그 지점에 값을 대면 아래처럼 됩니다. 시작값 10, 끝값 20 일 때입니다.

값 = 시작 + (끝 - 시작) × 비율

10 + (20 - 10) × 0      // 10
10 + (20 - 10) × 0.25   // 12.5
10 + (20 - 10) × 0.5    // 15
10 + (20 - 10) × 1      // 20

비율이 0.25 면 시작점에서 끝점 쪽으로 네 걸음 중 한 걸음만 간 값 12.5 가 나옵니다. 계산은 곱셈 한 번과 덧셈 한 번입니다. 값 하나를 뽑는 데 드는 일이 입력 개수와 무관하게 일정합니다.

삼각형 안쪽을 채우는 보간

화면은 작은 네모 칸이 촘촘히 깔린 격자입니다. 삼각형 하나를 그리면 그 삼각형이 덮는 칸이 수만 개가 됩니다. 그런데 색이나 좌표 같은 값은 꼭짓점 셋에만 실려 있습니다. 칸마다 값을 하나씩 만들어 주는 계산이 보간입니다.

섞는 몫은 그 칸이 세 꼭짓점에서 각각 얼마나 떨어졌는지로 정합니다. 어느 꼭짓점에 가까울수록 그 값의 몫이 커집니다. 삼각형 안에서 이 세 몫을 재는 좌표가 무게중심 좌표입니다. 세 몫을 더하면 1 이 됩니다.

flowchart TD
    A["꼭짓점 · 빨강"] --- B["꼭짓점 · 초록"]
    B --- C["꼭짓점 · 파랑"]
    C --- A
    A -. "멀다 → 몫 0.2" .- P["칸 하나"]
    B -. "조금 멀다 → 몫 0.3" .- P
    C -. "가깝다 → 몫 0.5" .- P

꼭짓점 셋을 빨강·초록·파랑으로 두면 삼각형 안쪽이 부드럽게 물드는 것이 이 때문입니다. 값은 여전히 세 곳에만 있습니다. 나머지는 칸마다 그때 만들어진 값입니다.

이 계산이 끼어드는 때는 정해져 있습니다. 꼭짓점마다 도는 정점 셰이더가 값을 내보냅니다.

래스터화가 그 삼각형을 화면의 칸으로 쪼갭니다. 쪼개는 동안 칸마다 몫을 재어 값을 섞습니다. 칸마다 도는 프래그먼트 셰이더는 이렇게 섞인 값을 받습니다.

flowchart TD
    V["정점 셰이더 · 값 셋"] --> R["래스터화 · 값 셋을 칸 수만 개로 불린다"]
    R --> F["프래그먼트 셰이더 · 칸 하나가 값 하나를 받는다"]

삼각형이 화면에 비스듬히 누워 있으면 화면 위 거리로만 섞은 값이 틀어집니다. 멀리 있는 쪽이 실제보다 넓게 늘어나 보입니다. 깊이를 함께 나눠 섞어 이 틀어짐을 바로잡는 것을 원근 보정 보간이라고 부릅니다.

잇는 규칙의 갈래

두 점을 곧은 선으로만 잇는 것은 아닙니다. 몇 개의 점을 보고 어떤 선으로 이을지에 따라 이름이 갈립니다.

방식 어떻게 잇나 잘 맞는 곳
최근접 이웃 보간 가장 가까운 점의 값을 가져다 쓴다 도로 번호처럼 이름 대신 쓰는 숫자일 때
선형 보간 양옆 두 점을 곧은 선으로 잇는다 대부분의 경우
쌍선형 보간 격자의 네 점을 가로세로로 두 번 섞는다 이미지를 늘리고 줄일 때
삼차 보간 앞뒤 네 점을 보고 곡선으로 잇는다 부드러움이 중요할 때
스플라인 보간 구간마다 짧은 곡선을 잇되 이음매를 매끄럽게 맞춘다 움직임을 만드는 곡선

표가 말하는 차이는 하나로 줄어듭니다. 보는 점이 많고 선이 매끄러울수록 값이 자연스럽지만 계산이 늘어납니다. 어느 쪽을 고를지는 매끄러움과 계산량을 견줘 정합니다.

안쪽과 바깥쪽을 가르는 선

보간은 값을 아는 점들의 안쪽에서만 씁니다. 그 범위 바깥을 짚어 값을 내는 것은 외삽이라고 따로 부릅니다.

block-beta
columns 3
  a["바깥쪽 · 외삽"] b["아는 점부터 아는 점까지 · 보간"] c["바깥쪽 · 외삽"]

안쪽은 양옆에서 값이 붙잡아 주므로 크게 빗나가기 어렵습니다. 바깥은 붙잡아 주는 값이 한쪽뿐이라 멀어질수록 빠르게 빗나갑니다. 그래서 두 이름을 가려 씁니다.

보간이 빗나가는 때

성긴 점 사이에서 값이 크게 출렁이면 보간은 그 출렁임을 못 봅니다. 두 시와 세 시만 재 둔 기온을 그려 보면 이렇습니다.

xychart-beta
    title "두 시와 세 시만 재 둔 기온"
    x-axis ["2:00", "2:10", "2:20", "2:30", "2:40", "2:50", "3:00"]
    y-axis "기온" 14 --> 26
    line [24, 22, 18, 15, 15, 17, 18]
    line [24, 23, 22, 21, 20, 19, 18]

가운데가 움푹 파인 쪽이 실제 기온이고, 곧게 내려가는 쪽이 보간이 만든 값입니다. 두 선이 벌어진 구간이 소나기가 지나간 때입니다. 한 시간마다 잰 기온으로는 그 사이에 지나간 소나기를 알 수 없습니다. 점 사이에서 값이 얼마나 튈 수 있는지를 모르면 보간 결과도 믿을 수 없습니다.

값이 숫자 모양이어도 섞으면 안 되는 것이 있습니다. 도로 번호나 상태 코드처럼 이름 대신 쓰는 숫자가 그렇습니다. 1번과 2번의 가운데인 1.5번 도로는 없습니다. 그래서 앞의 최근접 이웃 보간이 값을 섞지 않고 가장 가까운 쪽 값을 그대로 가져옵니다.

각도도 그냥 섞으면 엉뚱해집니다. 359도와 1도의 가운데를 숫자로만 계산하면 180도가 나옵니다. 두 방향 사이는 0도 쪽으로 2도 차이입니다. 회전을 섞을 때 구면 선형 보간처럼 따로 만든 방법을 쓰는 이유입니다.

보간으로 만든 값을 측정값과 같은 곳에 섞어 저장하면, 나중에 어느 것이 잰 값이고 어느 것이 지어낸 값인지 가릴 수 없게 됩니다.

같은 이름의 다른 뜻

프로그래밍에서 문자열 보간은 글자 틀 안의 빈칸에 값을 끼워 넣는 기능을 가리킵니다. 사이 값을 계산하는 것이 아니라 정해진 빈칸을 채우는 것이라 하는 일이 다릅니다. 사이를 메운다는 그림만 같습니다.

이 기능으로 SQL(Structured Query Language, 구조화 질의 언어) 질의문을 이어 붙이면 바깥에서 들어온 글자가 질의문의 일부가 되어 SQL 인젝션의 입구가 됩니다.

관련 항목

보간의 하위 종류

선형 보간 · 쌍선형 보간 · 삼차 보간 · 스플라인 보간 · 최근접 이웃 보간 · 다항식 보간 · 구면 선형 보간 · 무게중심 보간

삼각형 안을 채울 때 함께 쓰는 좌표와 보정

무게중심 좌표 · 원근 보정 보간 · 배리잉 · 래스터화 · 프래그먼트 · 정점 속성

보간된 값이 지나가는 그리기 단계

그래픽스 파이프라인 · 정점 셰이더 · 프래그먼트 셰이더 · 정점 · 정점 색 · 텍스처 좌표

보간 방식을 골라야 하는 텍스처 처리

텍스처 필터링 · 밉맵 · 이방성 필터링 · 샘플러 · 텍셀 · 텍스처

보간과 맞세워지는 다른 계산

외삽 · 곡선 맞춤 · 회귀 · 근사 · 샘플링 · 결측값

시간 축에서 사이 값을 만드는 기법

키프레임 · 이징 · 베지에 곡선 · 애니메이션 커브 · 쿼터니언

이름이 겹치는 다른 뜻의 보간

문자열 보간 · 템플릿 리터럴 · 보간 탐색 · SQL 인젝션

다른 이름: interpolation · Interpolation · 인터폴레이션 · 사이값 계산