[연재] 직선으로 그으면 산 위를 걷게 됩니다 — 지형 높이로 길을 계산한 일
숫자가 된 「무인지경 700여 리」
등애가 음평에서 성도로 넘어간 길을 아틀라스로 재 봤습니다. 『삼국지』 등애전에는 이렇게 있습니다.
「겨울 10월, 등애가 음평도로 사람이 없는 땅 700여 리를 갔다. 산을 뚫어 길을 내고 다리와 잔도를 놓았다.」 (冬十月,艾自陰平道行無人之地七百餘里…)
계산이 내놓은 숫자는 길이 약 311km, 최고 고도 약 2,640m(마천령 부근), 오르막을 다 합치면 약 5,700m였습니다. 「험하다」는 한 마디가 처음으로 재 볼 수 있는 값이 된 순간이에요.
이 숫자가 믿을 만하려면 길이 믿을 만해야 합니다. 그래서 이번 글은 길을 어떻게 그렸는지 이야기하려고 해요.
직선은 산을 곧장 넘습니다
지도에 행군로를 그리는 가장 쉬운 방법은 길목 좌표를 직선으로 잇는 겁니다. 문제는 고도 단면, 그러니까 길을 따라 걸었을 때의 오르내림 그래프를 그리는 순간 드러납니다.
직선은 산줄기를 가로질러요. 사람은 골짜기를 따라 걷고, 강을 따라 오르고, 정 안 되면 돌아가는데 직선은 그런 걸 모릅니다. 그러면 단면도는 실제로 걷지 않았을 능선의 높이를 보여 주고, 총 오르막 숫자도 의미가 없어집니다. 길이 틀리면 거기서 나온 숫자가 전부 틀립니다.
그래서 엔진의 규칙은 「길목 사이를 직선으로 잇지 않는다」입니다. 코드에도 이유가 이 문장 그대로 적혀 있어요.

등애의 음평도 기습(263년) 화면. 음평에서 마천령, 강유, 면죽을 거쳐 성도로 내려가는 행군로입니다.
땅의 높이를 숫자로 깝니다
직선 대신 쓰는 재료는 지형 고도 자료(DEM)입니다. 땅을 격자로 나누고 칸마다 해발 높이를 적어 둔 숫자표라고 생각하시면 돼요. 저는 AWS에 공개된 Terrarium 형식의 고도 타일을 받아 썼고, 길 계산에는 줌 11 단계(칸 하나가 약 65m)를 씁니다. 지도 배경에 깔린 음영 지형 이미지도 같은 자료로 만들었어요. 중국 전역은 줌 7, 중원과 형주를 크게 보는 인셋은 줌 9입니다.
65m 칸을 그대로 쓰면 계산이 너무 무거워서, 네 칸씩 평균을 내 약 260m 칸으로 줄여서 길을 찾습니다. 그 대신 길을 다 찾은 뒤 단면도를 그릴 때는 원래 격자에서 100m 간격으로 높이를 읽습니다. 계산은 거칠게, 확인은 촘촘하게 하는 방식이에요.
오르내림이 덜한 길 찾기
길 찾기는 내비게이션과 비슷합니다. 한 칸에서 이웃 여덟 칸으로 갈 때마다 값을 매기고, 값의 합이 가장 작은 길을 고르는 거예요. 값은 세 가지로 정했습니다.
- 거리: 멀수록 비쌉니다.
- 경사: 가파를수록 값이 제곱으로 불어납니다.
- 오르막: 올라간 높이만큼 값을 따로 더합니다. 내려가는 건 따로 벌을 주지 않아서, 같은 두 칸이라도 오를 때와 내릴 때 값이 다릅니다.
「모델 추정 없음」이라는 원칙도 정해 뒀습니다. 이 길을 사람이 어림잡거나 AI가 감으로 그리지 않고, 위의 규칙만으로 계산한다는 뜻이에요. 규칙이 눈에 보여야 길이 틀렸을 때 어느 규칙이 문제인지 따져 볼 수 있으니까요.
길목은 반드시 지나게 했습니다. 사서에 나오는 중간 지명(음평, 마천령, 강유 같은)이 있으면 그 사이를 구간별로 따로 풀어서 이어 붙여요.
강을 따라가는 군대도 있었습니다. 장강 연안의 아홉 지점 쌍은 물길로 간 것으로 보고, 강과 호수 칸만 쓰게 했어요. 다만 이건 「장강 연안이니 물길일 것」이라는 지리 판단뿐이라서, 기록에 수군이 움직였다고 적힌 구간은 따로 표시한다는 단서를 파일에 달아 뒀습니다.
전투마다 단면도
길이 정해지면 길을 따라 걸어가며 높이를 읽어 단면도를 그립니다. 전투마다 진군로의 최고 고도와 오르막 합계가 나오고, 전투마다 진군로와 고도 단면이 함께 붙습니다.
숫자를 보는 재미가 생각보다 컸어요. 같은 북벌이라도 길에 따라 넘는 산의 높이가 완전히 달랐고, 「이 길은 왜 위험했나」를 사서 문장이 아니라 그래프로 볼 수 있게 됐습니다.
이 계산을 믿어도 되나
여기서 조심해야 할 점이 하나 있습니다. 같은 자료로 같은 길을 다시 재도 숫자가 조금씩 달라집니다. 계산하는 상자 범위가 다르면 격자 위치가 조금 어긋나서, 제가 다시 재 본 길은 기존 단면과 29m 이내로 달랐습니다. 이 정도는 오차라고 봅니다.
진짜 문제는 다른 데 있었어요. 계산이 일관되고 빠르다는 것과 그 길이 당시 사람이 걷던 길이라는 것은 다른 얘기입니다. 계산이 아는 건 높이뿐이고, 어디가 길이었는지는 모르니까요. 실제로 이 계산이 군대를 3,000m가 넘는 산 위로 보낸 길이 여럿 나왔습니다. 그 얘기는 다음 글에서 하겠습니다.

같은 전투의 고도 단면. 길이 311.03km, 최고 2,642m, 총 오르막 5,729m가 나옵니다. 마천령은 고개 위치 추정이라는 경고가 붙어 있습니다.
삼국지 아틀라스는 여기서 볼 수 있습니다: https://victor-house.com/sanguo/