
점만 찍었는데 영역이 나뉜다고요?
재밌는 인터랙티브 지도 하나를 소개할게요. 전 세계 수도들의 위치를 점으로 찍어놓고, "지구상의 어느 지점에서든 가장 가까운 수도는 어디일까?"를 색깔로 칠해서 보여주는 지도예요. 마우스로 빙글빙글 돌려볼 수 있고, 점 하나를 옮기면 영역 경계가 실시간으로 출렁이며 바뀌어요. 단순해 보이는데 묘하게 계속 만지게 되는 그런 작품이죠.
이 지도의 핵심에 보로노이 다이어그램(Voronoi diagram)이라는 개념이 들어 있어요. 이름은 어렵게 생겼지만 아이디어는 진짜 직관적이라, 한 번 알아두면 "어, 이거 여기저기 다 쓰이네?" 하게 되는 도구거든요. 오늘 이 글 하나로 제대로 감을 잡아볼게요.
보로노이가 뭐냐면요
동네에 편의점이 여러 개 있다고 생각해봐요. 여러분이 어디에 서 있든 "가장 가까운 편의점"이 하나 정해지겠죠? 이때 "이 구역 안에서는 A 편의점이 제일 가깝고, 저 구역에서는 B가 제일 가깝다"라고 땅을 구역별로 쫙 나눠놓은 그림이 바로 보로노이 다이어그램이에요.
각 점(편의점, 수도 등)을 사이트(site)라고 부르고, 그 점이 "내 구역"으로 차지하는 영역을 셀(cell)이라고 해요. 두 점 사이의 경계선은 정확히 두 점에서 같은 거리에 있는 지점들, 즉 수직 이등분선이 돼요. 중학교 때 배운 "두 점에서 같은 거리에 있는 점들의 집합" 기억나죠? 그게 바로 이 경계예요. 점이 수백 개여도 원리는 똑같아요. 모든 점 쌍에 대해 경계를 그어주면 벌집처럼 생긴 영역 분할이 완성되는 거죠.
이번 지도에서 특별한 점은, 평평한 종이가 아니라 구(球), 즉 둥근 지구 위에서 이 계산을 한다는 거예요. 지구는 둥그니까 두 도시 사이의 '직선거리'도 평면에서처럼 단순하지 않고, 구면 위의 곡선(대권 거리)으로 따져야 하거든요. 그걸 매끄럽게 계산해서 보여주는 게 기술적으로 꽤 깔끔한 구현이에요.
이게 왜 중요하냐면
보로노이는 그냥 예쁜 그림이 아니라 실무에서 엄청 많이 쓰이는 알고리즘이에요. 몇 가지만 볼게요.
- 가장 가까운 시설 찾기: "내 위치에서 가장 가까운 병원/주유소/배달 가능 매장"을 구할 때, 미리 보로노이로 영역을 나눠두면 빠르게 답할 수 있어요. 배달 앱이나 지도 서비스의 단골 기법이죠.
- 통신/네트워크: 휴대폰이 "가장 가까운 기지국"에 붙는 영역을 나눌 때 쓰여요.
- 게임·그래픽: 자연스러운 지형이나 균열, 세포 무늬 같은 텍스처를 절차적으로 만들 때 보로노이 노이즈를 활용해요.
- 데이터 분석: 최근접 이웃(nearest neighbor) 기반 분류나 공간 보간에도 바탕이 되고요.
한국 개발자에게
참고로 이 지도를 만든 제이슨 데이비스(Jason Davies)는 데이터 시각화 라이브러리 D3.js 생태계에서 유명한 분이에요. 웹에서 인터랙티브 차트나 지도를 만든다면 D3는 한 번쯤 만나게 되는데, 이런 보로노이/지도 투영 관련 기능 상당수가 그분 손을 거쳤어요.
실무에서도 바로 쓸모가 있어요. 예를 들어 "전국 매장 중 사용자에게 가장 가까운 곳 보여주기", "권역별 담당 영업소 자동 배정", "배달 가능 구역 시각화" 같은 요구사항이 들어오면 보로노이가 정답일 때가 많아요. JavaScript라면 d3-delaunay, 파이썬이라면 scipy.spatial.Voronoi 한 줄이면 바로 계산되니, 직접 구현 안 해도 돼요. 개념만 알고 있으면 "아 이건 보로노이로 풀면 되겠다"는 판단을 내릴 수 있는 게 핵심이죠.
마무리
점 몇 개 찍었을 뿐인데 세상이 구역별로 쫙 나뉘는 보로노이 다이어그램. 단순한 수학 개념 하나가 지도, 게임, 통신, 데이터 분석까지 광범위하게 쓰인다는 게 참 매력적이에요. 직접 지도를 만져보면서 점을 옮겨보면 감이 확 와요.
여러분 프로젝트에서 "가장 가까운 무언가"를 찾아야 했던 적 있나요? 그때 어떻게 풀었는지, 보로노이를 썼다면 경험을 공유해주세요!
🔗 출처: Hacker News
"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"
실제 수강생 후기- 비전공자도 6개월이면 첫 수익
- 20년 경력 개발자 직강
- 자동화 프로그램 + 소스코드 제공