도구스개발

힐베르트 곡선 좌표 변환기

힐베르트 곡선에서 1차원 거리와 2차원 좌표를 양쪽으로 바꿔 줍니다. 곡선을 그림으로 그려 주고 Z-order(모턴) 곡선과 나란히 놓아, 두 곡선의 도약 거리가 얼마나 다른지를 실제로 세어 보여줍니다.

0부터 63까지. 출발점에서 몇 번째로 지나는 칸인지입니다.

힐베르트 곡선 3차 — 거리 10의 좌표

(3, 3)

한 변이 8칸인 격자에서 왼쪽 아래가 (0, 0)입니다. 이 좌표를 다시 거리로 바꾸면 10으로 제자리에 돌아옵니다.

좌표 (3, 5)의 거리28
한 변8칸 (2^3)
전체 칸64칸 (4^3)
이웃한 d 사이의 최대 이동1칸
한 칸 옆이 아닌 자리없음
평균 이동 거리1.000칸
격자를 빠짐없이 한 번씩지납니다

힐베르트 곡선 3

왼쪽 아래가 (0, 0)이고 위로 갈수록 y가 큽니다. 점이 지금 고른 거리 d의 자리입니다.

힐베르트 곡선은 한 칸씩만 움직입니다. 이웃한 d 사이의 이동 거리가 언제나 정확히 1이라, d가 가까우면 좌표도 반드시 가깝습니다. 그래서 2차원 자료를 1차원으로 줄 세울 때 씁니다 — 가까운 것끼리 디스크에서도 가까이 놓이니까요. 같은 차수의 Z-order는 최대 8칸을 건너뛰고 그런 자리가 31군데 있습니다.
가까운 d는 가까운 좌표지만, 그 반대는 아닙니다. 바로 옆 칸인데 d가 수십 차이 나는 자리가 반드시 생깁니다. 곡선이 어딘가에서는 돌아 나가야 하기 때문이고, 어떤 공간 채움 곡선에도 있는 한계입니다. 그래서 힐베르트 인덱스로 범위 검색을 하면 «놓치지 않으려면 구간을 여러 개 봐야 하는» 문제가 남습니다.
dev/geohash는 위경도를 번갈아 쪼개 문자열로 만든 것이라 사실상 Z-order 계열입니다. 그래서 이웃한 지역인데 앞자리가 완전히 달라지는 경계가 생기는데, 힐베르트 곡선은 그 경계 문제가 훨씬 적어 공간 인덱스에서 선호됩니다. 비트를 다루는 순서가 결과를 가르는 예로 dev/gray-code와 함께 보면 좋습니다.

사용 방법

  1. 1곡선 종류와 차수를 고릅니다. 차수 n이면 한 변이 2ⁿ입니다.
  2. 2거리 d를 넣어 그 자리의 좌표를 확인합니다.
  3. 3반대로 좌표를 넣어 거리 d가 얼마인지 봅니다.
  4. 4그림에서 곡선이 어떤 순서로 격자를 지나는지 확인합니다.
  5. 5Z-order로 바꿔 도약 거리가 어떻게 달라지는지 견줍니다.

자주 묻는 질문

정사각형 격자의 모든 칸을 한 붓 그리기로 지나는 길입니다. 차수 n이면 한 변이 2ⁿ이고 칸이 4ⁿ개이며, 각 칸에는 출발점에서 몇 번째로 지났는지를 나타내는 번호가 붙습니다. 1891년 다비트 힐베르트가 소개했습니다.

거리 d가 가까우면 좌표도 반드시 가깝기 때문입니다. 2차원 자료를 1차원으로 줄 세워야 하는 곳에서, 가까운 것끼리 디스크나 캐시에서도 가까이 놓이게 됩니다. 지도 타일 정렬, 공간 데이터베이스의 인덱스, 이미지 데이터의 메모리 배치가 대표적입니다.

아닙니다. 그 반대 방향은 성립하지 않습니다. 바로 옆 칸인데 d가 수십 차이 나는 자리가 반드시 생깁니다. 곡선이 어딘가에서는 돌아 나가야 하기 때문이고, 이것은 어떤 공간 채움 곡선에도 있는 한계입니다.

Z-order는 x와 y의 비트를 번갈아 끼우기만 하면 되어 훨씬 간단하지만, 다음 칸으로 멀리 건너뛰는 자리가 많습니다. 차수 3이면 63번의 이동 가운데 31번이 이웃이 아닌 곳으로 건너뛰고 가장 큰 도약은 8칸입니다. 힐베르트 곡선에는 그런 자리가 하나도 없습니다.

한 겹씩 내려가며 어느 사분면인지 고르고, 그때마다 좌표계를 뒤집거나 돌립니다. 이 회전이 사분면끼리 길을 이어 붙이는 비결이고, 그래서 코드가 Z-order보다 깁니다. 차수 n이면 반복이 n번이라 계산 자체는 아주 빠릅니다.

다릅니다. 지오해시는 위경도를 번갈아 쪼개 문자열로 만든 것이라 사실상 Z-order 계열이고, 그래서 이웃한 지역인데 지오해시 앞자리가 완전히 달라지는 경계가 생깁니다. 힐베르트 곡선은 그 경계 문제가 훨씬 적어 공간 인덱스에서 선호됩니다.

전송되지 않습니다. 변환과 그림 그리기는 모두 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 왕복이 항등인지 검사합니다. 차수 1~6의 모든 칸(합계 5,460개)에서 d → 좌표 → d가 제자리로 돌아오는 것을 힐베르트·Z-order 양쪽에서 확인했습니다.
  • 격자를 빠짐없이 한 번씩 지나는지도 매 차수마다 확인합니다. 왕복이 항등이면서 칸을 모두 덮으면, 그 자체로 「빠짐없이 한 번씩 지나는 길」이라는 증거가 됩니다.
  • 힐베르트 곡선은 이웃한 d 사이의 이동 거리가 언제나 정확히 1입니다. 차수 1~6에서 도약이 한 건도 없는 것을 검사값으로 고정했습니다.
  • Z-order는 최대 도약이 2ⁿ이고 그런 자리가 (칸 수/2 − 1)개 있습니다. 차수 3이면 8칸 도약이 최대이며 31군데에서 건너뜁니다. 두 곡선의 차이를 어림이 아니라 센 값으로 보여주기 위한 것입니다.
  • 차수 1의 힐베르트 곡선이 U자, Z-order가 Z자를 그리는 것과, 힐베르트 곡선의 출발점·끝점이 아래 두 모서리인 것을 검산값으로 고정했습니다.
  • 차수는 8까지(한 변 256, 칸 65,536개) 계산하고, 그림은 6차(한 변 64)까지 그립니다. 그보다 크면 선이 너무 촘촘해 화면에서 뭉개집니다.
  • 알고리즘은 널리 인용되는 고전 구현을 따랐습니다. 회전 규칙 한 줄만 어긋나도 왕복 검사에서 바로 잡힙니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.