보간
고친 사람 github-actions[bot]
보간은 값을 띄엄띄엄만 알고 있을 때 그 사이 지점의 값을 만들어 냅니다. 구하려는 지점이 양옆 점에서 얼마나 떨어졌는지를 보고 그 비율로 두 값을 섞습니다. 이 이름은 여러 분야가 함께 씁니다. 이 항목은 숫자 사이를 메우는 쪽을 다룹니다.
쉽고 빠른 이해
값을 띄엄띄엄만 알고 있을 때, 그 사이 지점의 값을 앞뒤 값에서 지어냅니다. 한 시간마다 잰 기온만 있다고 합시다. 두 시 반 기온을 물으면 두 시 값과 세 시 값의 가운데를 답합니다.
값을 모든 지점마다 재 두거나 저장해 둘 수는 없습니다. 삼각형 하나를 화면에 그리면 색을 정해야 할 화면의 작은 칸이 수만 개가 됩니다. 값은 꼭짓점 셋에만 있습니다. 보간이 없으면 값이 없는 칸은 채울 방법이 없습니다.
돌아가는 방식은 이렇습니다.
- 구하려는 지점이 양옆 점 중 어디에 얼마나 가까운지를 비율로 잽니다
- 가까운 쪽 값이 그 비율만큼 큰 몫을 갖습니다
- 두 몫을 더해 값 하나를 냅니다
대가가 있습니다. 나온 값은 재 본 값이 아니라 지어낸 값입니다. 두 점 사이에서 값이 크게 출렁였다면 보간은 그 출렁임을 놓치고 밋밋하게 이어 버립니다.
상세
보간은 값이 정해진 점 몇 개를 받아 그 사이 지점의 값 하나를 내주는 계산입니다. 넣는 것은 값을 아는 점들과 구하려는 위치입니다. 나오는 것은 그 위치의 값입니다.
한 시간 간격으로 적어 둔 기온 기록이 그런 입력입니다. 두 시와 세 시 기온만 적혀 있습니다. 두 시 반 기온이 필요하면 두 값 사이에서 값 하나를 지어내야 합니다. 그 일이 보간입니다.
값을 촘촘하게 다 갖고 있으면 보간이 필요 없습니다. 그런데 값은 대개 성깁니다. 재는 데 돈과 시간이 들거나, 다 저장하면 너무 커지거나, 아예 잴 수 없는 지점이기 때문입니다.
그래서 성긴 값만 들고 있다가 필요한 지점의 값을 그때그때 만들어 씁니다. 나온 값은 추측이지 측정이 아닙니다. 보간을 고르는 일은 「어떻게 추측할 것인가」의 규칙을 고르는 일입니다.
두 점 사이를 잇는 가장 단순한 규칙
가장 단순한 규칙은 두 점을 곧은 선으로 잇는 것입니다. 이 규칙이 선형 보간입니다.
구하려는 지점이 시작점에서 끝점 쪽으로 얼마나 왔는지를 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 · 인터폴레이션 · 사이값 계산