측지·좌표계

면적 계산 알고리즘 — Delaunay 삼각분할 + 벡터 외적

한 줄 요약

3D 공간에서 다각형의 면적을 구하기 위해, 2D 경위도 기반 Delaunay 삼각분할로 다각형을 삼각형으로 나누고, 각 삼각형의 면적은 원본 3D 좌표(ECEF Cartesian3)의 벡터 외적으로 계산하는 하이브리드 방식. 경사면도 반영되며, 건설 현장 스케일에서 충분히 정확하다.

왜 면적 계산이 단순하지 않은가

2D 평면에서 사각형의 면적은 가로 × 세로다. 그러나 3D GIS 환경에서의 면적 계산은 두 가지 이유로 복잡해진다:

첫째, 다각형이 3D 공간에 존재한다. 사용자가 3D 모델 위에 찍은 점들은 (x, y, z) 좌표를 가진다. 이 점들이 만드는 다각형은 반드시 하나의 평면 위에 놓여있지 않다 — 경사면, 건물 벽면, 지형의 기복 위에 있을 수 있다.

둘째, 다각형은 삼각형이 아니다. 사용자는 3개, 4개, 5개 이상의 점을 찍어 다각형을 만든다. 삼각형(3개의 점)은 항상 하나의 평면 위에 있지만, 4개 이상의 점은 서로 다른 높이에 있을 수 있어 "비평면 다각형"이 된다. 비평면 다각형의 면적은 단순한 공식 하나로 구할 수 없다.

구현 방식: 하이브리드 접근

이 문제를 해결하기 위해, "어떻게 나눌지"는 2D에서 결정하고, "면적은 얼마인지"는 3D에서 계산하는 하이브리드 방식을 적용했다.

1. 꼭짓점들의 Cartesian3(ECEF) 좌표를 경위도(lat, lng)로 변환
2. 경위도 2D 좌표로 Delaunay 삼각분할 → 어떤 점 3개를 묶을지 결정
3. 분할된 각 삼각형에 대해, 원본 Cartesian3(3D 좌표)로 벡터 외적 계산
4. 외적의 크기 / 2 = 삼각형의 3D 면적
5. 모든 삼각형 면적을 합산

1단계: Delaunay 삼각분할 — 다각형을 삼각형으로 나누기

Delaunay 삼각분할은 주어진 점들을 가능한 한 균일한 삼각형으로 분할하는 알고리즘이다. "가능한 한 균일하다"는 것은, 너무 길쭉하거나 납작한 삼각형을 피하고 가능한 정삼각형에 가까운 삼각형을 만든다는 뜻이다. 수학적으로는 최소 내각을 최대화하는 삼각분할이다.

이 단계에서 입력으로 사용하는 좌표는 경위도(2D)다. 3D Cartesian3가 아닌 2D 경위도를 사용하는 이유는, Delaunay 삼각분할 알고리즘이 2D 점 집합을 입력으로 받기 때문이다.

이 단계의 출력은 삼각형 인덱스 배열이다. "0번, 1번, 3번 점이 첫 번째 삼각형", "1번, 2번, 3번 점이 두 번째 삼각형"처럼, 어떤 점 3개를 묶어 삼각형을 만들지가 결정된다.

2단계: 벡터 외적 — 각 삼각형의 3D 면적 계산

삼각분할이 끝나면, 각 삼각형에 대해 원본 3D 좌표(Cartesian3)를 사용하여 면적을 계산한다. 여기서 핵심은 2D 경위도가 아니라 3D ECEF 좌표로 돌아간다는 것이다.

벡터 외적(Cross Product)은 두 벡터가 만드는 평행사변형의 면적을 구하는 연산이다. 삼각형 ABC의 면적은:

벡터 AB = B - A
벡터 AC = C - A
면적 = |AB × AC| / 2

외적 AB × AC의 크기(magnitude)가 평행사변형의 면적이므로, 2로 나누면 삼각형의 면적이 된다. 이 계산은 3D 공간에서 이루어지므로, 경사면의 실제 표면적이 반영된다. 수평 투영 면적이 아니다.

왜 이 방식이 정확한가

이 하이브리드 방식이 단순한 Newell's Method(다각형 전체에 벡터 외적을 한 번 적용하는 방식)보다 오히려 더 정확한 이유가 있다.

Newell's Method의 전제: 다각형의 모든 꼭짓점이 하나의 평면 위에 있어야 정확하다. 꼭짓점마다 높이가 다른 비평면 다각형에서는 오차가 발생한다.

삼각분할 방식의 장점: 삼각형의 3개 점은 항상 하나의 평면 위에 있다 — 이것은 기하학적 사실이다. 공간상의 임의의 세 점은 반드시 하나의 평면을 정의한다. 따라서 각 삼각형에 대해 벡터 외적을 적용하면, 비평면 다각형이라도 각 조각은 정확한 면적을 산출한다.

즉, 비평면 다각형 → 삼각형들로 분해 → 각 삼각형은 항상 평면 → 벡터 외적이 정확이라는 논리가 성립한다.

유일한 한계: 2D 삼각분할의 근사

이 방식의 유일한 근사 지점은 1단계의 Delaunay 삼각분할에 높이 정보를 사용하지 않는다는 것이다. 경위도(2D)만으로 삼각분할을 수행하므로, "어떤 점 3개를 묶을지"의 결정에 높이가 반영되지 않는다.

이것이 문제가 되는 극단적 경우가 있다: 절벽 위의 점과 절벽 아래의 점이 2D 경위도에서는 가까이 있지만, 3D에서는 수직으로 멀리 떨어져 있는 경우. 이때 Delaunay가 이 두 점을 같은 삼각형에 묶으면, 삼각형이 수직에 가까운 형태가 되어 최적의 분할이 아닐 수 있다.

그러나 면적 계산 자체는 원본 3D 좌표로 수행하므로, 삼각분할의 비최적성이 면적의 정확도에 직접적인 오차를 만들지는 않는다. 다각형을 다른 방식으로 삼각형 조각으로 나누더라도, 조각들의 면적 합은 동일하기 때문이다. 건설 현장 스케일(수백 m)에서 이런 극단적 지형은 거의 발생하지 않으므로 실용적으로 문제가 되지 않는다.

대안: 구면 초과 (Spherical Excess)

벡터 외적 기반 방법은 지구를 평면으로 취급한다. 건설 현장 스케일(수 km 이내)에서는 이 근사가 충분하지만, 도시 전체나 국가 단위의 영역에서는 지구 곡률을 무시할 수 없다.

구면 위의 삼각형은 평면 삼각형과 근본적으로 다른 성질을 가진다. 평면 삼각형의 내각의 합은 항상 180도이지만, 구면 삼각형의 내각의 합은 항상 180도보다 크다. 이 초과분이 구면 초과(Spherical Excess)이며, 구면 삼각형의 면적에 정비례한다.

구면 삼각형 면적 = R² × E
E = (α + β + γ) - π    (세 내각의 합 - π)

건설 현장 스케일(100m × 100m)에서 벡터 외적과 구면 초과의 차이는 1% 미만이다. 현재 구현에서 구면 초과를 도입할 필요는 없지만, 만약 시/도 단위의 넓은 영역을 다뤄야 하는 상황이 오면 구면 초과 방법으로 전환이 필요할 수 있다.

이 경험에서 추출한 원칙

  1. "어떻게 나눌지"와 "얼마인지"를 분리하면, 각각에 최적의 방법을 적용할 수 있다. 삼각분할은 2D에서 효율적이고, 면적 계산은 3D에서 정확하다. 두 단계를 분리했기 때문에 각 단계에 가장 적합한 방법을 사용할 수 있었다.

  2. 삼각형은 항상 평면이라는 기하학적 사실이 정확도를 보장한다. 비평면 다각형을 직접 다루는 대신 삼각형으로 분해하면, 각 조각이 항상 평면이 되어 벡터 외적의 전제 조건이 자동으로 충족된다. 복잡한 문제를 "항상 성립하는 성질"을 가진 단위로 분해하는 것이 핵심이다.

면적 계산 알고리즘 — Delaunay 삼각분할 + 벡터 외적

측지·좌표계
전체 노드