본문 바로가기
카테고리 없음

CCW 기하 알고리즘 기초와 선분 교차 판정

by GuideBook 2026. 4. 30.

CCW 기하 알고리즘 기초와 선분 교차 판정

현대 컴퓨터 과학에서 계산 기하학(Computational Geometry)은 자율주행, 컴퓨터 그래픽스(Computer Graphics), 지리 정보 시스템(GIS) 등 수많은 첨단 산업 분야의 핵심 기반 기술로 자리 잡고 있습니다. 특히 다각형의 넓이를 구하거나 두 선분이 교차하는지 판별하는 문제는 가장 기초적이면서도 중요한 과제입니다. 이러한 기하학적 연산을 효율적으로 처리하기 위해 고안된 것이 바로 CCW(Counter Clockwise) 알고리즘입니다. 본 문서에서는 기하 알고리즘의 뼈대가 되는 CCW의 수학적 원리를 철저히 분석하고, 이를 활용하여 복잡한 선분 교차 판정(Line Segment Intersection) 문제를 정확하게 해결하는 과정을 심도 있게 다룹니다.

1. 기하 알고리즘의 기초: CCW (Counter Clockwise) 원리

기하 알고리즘의 가장 핵심적인 도구인 CCW(Counter Clockwise)는 2차원 평면 공간에 놓인 임의의 세 점 사이의 방향성을 판별하는 수학적 기법입니다. 세 점 A, B, C의 좌표가 주어졌을 때, 이 점들을 순서대로 이은 선분이 반시계 방향을 그리는지, 시계 방향을 그리는지, 혹은 일직선 상에 위치하는지를 명확히 판단합니다. 수학적으로는 3차원 공간에서 정의되는 벡터의 외적(Cross Product) 공식의 z축 성분을 차용하여 계산 결과를 도출합니다. 연산 결괏값이 양수이면 반시계 방향, 음수이면 시계 방향, 0이면 세 점이 한 직선 위에 있다는 것을 의미합니다. 마치 자동차 핸들을 왼쪽으로 꺾으면 반시계 방향으로, 오른쪽으로 꺾으면 시계 방향으로 회전하는 것과 같은 매우 직관적인 원리입니다. 이 간단한 벡터 사칙연산은 O(1)의 일정한 시간 복잡도를 가지므로, 수백만 개의 방대한 기하학적 데이터를 처리할 때 매우 강력하고 효율적인 성능을 발휘합니다. 실무에서 기하 알고리즘을 설계할 때, CCW는 볼록 껍질(Convex Hull) 알고리즘이나 임의의 다각형 내부 점 포함 여부 판정 등 다양한 응용 분야를 지탱하는 뼈대가 됩니다. 따라서 2차원 좌표계(2D Coordinate System)에서 발생하는 기하학적 문제들을 완벽히 통제하기 위해서는 CCW 벡터 외적 공식을 정확히 이해하고 오차 없이 구현하는 것이 절대적으로 필수적인 과정입니다.

2. CCW 기하 알고리즘을 활용한 선분 교차 판정 방법

CCW 기하 알고리즘의 가장 대표적이고 실용적인 활용 사례는 바로 2차원 평면상에 존재하는 두 선분의 교차 여부를 판정하는 선분 교차 판정(Intersection Testing) 로직입니다. 선분 AB와 선분 CD가 주어졌을 때, 단순히 중학교 수학 수준의 일차방정식 해를 구하는 방식으로 프로그래밍에 접근하면, 기울기가 무한대인 수직선 처리나 컴퓨터의 고질적인 부동소수점 오차(Floating Point Error) 문제로 인해 시스템이 다운되거나 예외 상황이 무수히 발생하게 됩니다. 현대 소프트웨어 공학에서는 이를 피하기 위해 CCW를 다음과 같은 체계적인 논리 구조로 교차 판정에 적용합니다.

  1. 선분 AB를 기준으로 점 C와 점 D의 CCW 값을 각각 연산하여 곱합니다.
  2. 반대로 선분 CD를 기준으로 점 A와 점 B의 CCW 값을 연산하여 곱합니다.
  3. 두 번의 곱셈 결과가 모두 0보다 작다면(음수라면), 두 선분은 서로 완벽하게 교차한다고 수학적으로 확정합니다.

이는 선분이라는 길다란 울타리를 기준으로 두 점이 서로 반대편 영토에 위치하는지를 단번에 검사하는 논리 스위치와 같습니다. 하지만, 수학적 모델이 항상 현실의 완벽한 십자가 형태의 교차만을 의미하지는 않습니다. 네 개의 점이 모두 일직선 상에 나란히 위치하는 공선점(Collinear Points) 상태에서는 CCW 곱셈의 결과가 무조건 0이 도출됩니다. 이 특수한 경우에는 선분의 포개짐 여부를 추가적인 로직으로 반드시 검증해야 합니다. 각 선분의 x좌표와 y좌표 최솟값 및 최댓값 범위를 상호 비교하여, 한 선분의 끝점이 다른 선분의 좌표 범위 내에 조금이라도 포함되는지 확인하는 1차원적인 바운딩 박스(Bounding Box) 충돌 검사를 수행해야 비로소 완벽한 기하 알고리즘 교차 판정 모듈이 완성됩니다. 이러한 빈틈없는 검증 프로세스는 내비게이션 지도 애플리케이션의 최단 경로 탐색이나 물리 엔진(Physics Engine)의 정밀한 물체 충돌(Collision) 구현 단계에서 필수 불가결하게 요구되는 기술입니다.

3. 기하 알고리즘 선분 교차 판정 구현과 예외 처리

실제 엔터프라이즈급 소프트웨어 개발 환경에서 기하 알고리즘을 코드로 구현할 때는 발생 가능한 모든 엣지 케이스(Edge Case)를 철저히 방어하는 견고한 코드를 작성해야 합니다. 선분 교차 판정 로직을 C++이나 Python(파이썬) 등의 언어로 작성할 때 가장 치명적으로 작용하는 위험 요소는 바로 자료형의 오버플로우(Overflow) 현상입니다. 지도 데이터처럼 좌표의 절댓값이 매우 큰 경우, CCW 연산 내부에서 발생하는 연속된 곱셈 과정으로 인해 32비트 기본 정수형의 최대 표현 범위를 가볍게 초과해 버리는 버그가 발생합니다. 따라서 반드시 64비트 정수형(64-bit Integer, Long Long Type)을 강제 채택하여 메모리 연산 중의 데이터 손실을 원천 차단해야 합니다. 또한, 앞서 두 번째 챕터에서 언급한 '일직선상에서의 선분 겹침 판정'을 안전하게 구현할 때는, 두 점의 좌표 대소 관계를 올바른 순서로 정렬(Sorting)한 뒤 비교 연산을 수행해야 코드가 극도로 간결해지고 논리적 허점을 예방할 수 있습니다. 예를 들어, 점 A가 점 B보다 평면상에서 항상 왼쪽 아래에 오도록(x좌표 우선 기준, 동일하다면 y좌표 기준) 메모리 스와프(Swap) 처리를 선행하는 기법이 주로 쓰입니다.

// CCW 알고리즘 기반 방향성 정규화 함수 구현 예시
function CCW(A, B, C) {
    // 64비트 정수형을 보장하는 환경이라고 가정
    let crossProduct = (A.x * B.y + B.x * C.y + C.x * A.y) 
                     - (A.y * B.x + B.y * C.x + C.y * A.x);
                     
    if (crossProduct > 0) return 1;       // 반시계 방향
    else if (crossProduct === 0) return 0; // 일직선 (공선점)
    else return -1;                       // 시계 방향
}

위의 코드 블록을 살펴보면 CCW 벡터 외적의 결괏값을 단순히 큰 숫자로 반환하지 않고 1, -1, 0으로 깔끔하게 정규화(Normalization)하여 이후 조건문의 가독성과 안전성을 비약적으로 높인 것을 확인할 수 있습니다. 이러한 안정적이고 검증된 기하 알고리즘 모듈을 시스템 내에 하나 구축해 두면, 향후 수십 개의 꼭짓점을 가진 복잡한 다각형 간의 교차 영역 넓이 계산이나, 3D 환경에서의 시야각(FOV) 판별 알고리즘으로 스케일 업(Scale-up) 할 때 매우 든든하고 강력한 기반 라이브러리로 작동하게 됩니다.

4. 기하 알고리즘 실무 경험 및 실수담

3년 전쯤, 인천지역 개발자 모임(Incheon Dev Meetup)에서 만난 동료들과 함께 인디 게임 엔진의 충돌 처리 로직을 수정하는 외주 프로젝트를 맡았을 때가 생각나네요. 당시 저는 CCW로 선분 교차 판정을 자신 있게 구현하면서, 두 선분이 완벽히 일직선 상에서 겹치는 '공선점' 예외 처리를 빼먹는 엄청난 삽질을 했어요. 테스트 중 캐릭터가 벽 모서리에만 가면 자꾸 맵 밖으로 튕겨 나가서 당시에는 왜 안 되는지 몰라 정말 답답했거든요. 며칠을 밤새우며 디버깅을 헤매다가, 모임에서 친해진 시니어 개발자분이 포인터 겹침 힌트를 주어 겨우 해결했답니다. 

[오늘의 핵심 요약]
  • 기하 알고리즘 기초: CCW는 벡터의 외적을 이용하여 세 점의 방향성(반시계, 시계, 일직선)을 판별하는 O(1) 알고리즘입니다.
  • 선분 교차 판정: 각 선분을 기준으로 상대 선분의 두 점에 대한 CCW 곱이 모두 음수일 때 교차로 확정합니다.
  • 실무 적용 시 주의사항: 일직선(공선점) 상황에서의 바운딩 박스 겹침 검사와 곱셈 연산 시 64비트 정수형 오버플로우 방지가 필수입니다.

소개 및 문의 · 개인정보처리방침 · 면책조항

© 2026 GuideBook