반시계 판별

IT 위키
AlanTuring (토론 | 기여)님의 2025년 4월 5일 (토) 01:32 판
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

반시계 판별(counter-clockwise test)은 2차원 평면에서 세 점 A, B, C가 주어졌을 때, 이 점들이 만드는 꺾임 방향이 반시계 방향인지를 수학적으로 판단하는 연산이다. 좌회전 판정이라고도 불리며, 계산기하학에서 가장 핵심적인 기초 도구 중 하나이다. 볼록 껍질 (알고리즘), 선분 교차 판정, 다각형 내부 판정 등 다양한 기하 알고리즘에서 사용된다.

1 개념[편집 | 원본 편집]

점 A(x₁, y₁), B(x₂, y₂), C(x₃, y₃)가 주어졌을 때, 이 세 점을 순서대로 연결한 삼각형이 반시계 방향으로 꺾이는지, 시계 방향인지, 혹은 일직선 위에 놓여 있는지를 판별한다.

아래는 p2가 p3으로 이동한다고 가정할 때 어떤 것이 시계 방향이고 어떤 것이 반 시계 방향인지 보여준다.

좌표계 방향성 예시.png

2 다양한 이름[편집 | 원본 편집]

  • 반시계 판별 (counter-clockwise test)
  • 좌회전 판정 (left-turn test)
  • 방향성 판별 (orientation test)
  • ccw 알고리즘 (ccw: counter-clockwise)
  • 삼점 방향성 테스트 (orientation of three points)

이들은 모두 같은 수학적/기하학적 문제를 가리키며, 사용하는 문맥이나 언어에 따라 명칭만 다르다.

3 수식[편집 | 원본 편집]

세 점 A, B, C에 대해 다음 값을 계산한다:

ccw(A, B, C) = (x₂ - x₁)(y₃ - y₁) - (y₂ - y₁)(x₃ - x₁)

또는 벡터 외적을 통한 표현:

  • AB = (x₂ - x₁, y₂ - y₁)
  • AC = (x₃ - x₁, y₃ - y₁)
  • AB × AC = (x₂ - x₁)(y₃ - y₁) - (y₂ - y₁)(x₃ - x₁)

4 판별 기준[편집 | 원본 편집]

  • ccw(A, B, C) > 0 → 반시계 방향 (좌회전)
  • ccw(A, B, C) < 0 → 시계 방향 (우회전)
  • ccw(A, B, C) = 0 → 일직선

5 그래픽적 의미[편집 | 원본 편집]

  • 점 A에서 B로 진행한 뒤, 점 C로 꺾이는 방향을 판단
  • 반시계 방향이면 '왼쪽으로 도는 느낌', 시계 방향이면 '오른쪽으로 도는 느낌'

6 파이썬 예시[편집 | 원본 편집]

함수

def ccw(a, b, c):
    x1, y1 = a
    x2, y2 = b
    x3, y3 = c
    return (x2 - x1)*(y3 - y1) - (y2 - y1)*(x3 - x1)

실행 예제

# CCW 함수 정의
def ccw(a, b, c):
    x1, y1 = a
    x2, y2 = b
    x3, y3 = c
    return (x2 - x1)*(y3 - y1) - (y2 - y1)*(x3 - x1)

# 테스트용 점들
a = (1, 1)
b = (4, 2)
c = (2, 4)

# CCW 결과 확인
result = ccw(a, b, c)

# 판정 메시지 출력용
if result > 0:
    interpretation = "반시계 방향 (Left turn)"
elif result < 0:
    interpretation = "시계 방향 (Right turn)"
else:
    interpretation = "일직선 (Collinear)"

result, interpretation

7 활용[편집 | 원본 편집]

8 같이 보기[편집 | 원본 편집]

9 참고 문헌[편집 | 원본 편집]