반시계 판별
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으로 이동한다고 가정할 때 어떤 것이 시계 방향이고 어떤 것이 반 시계 방향인지 보여준다.
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 활용[편집 | 원본 편집]
- 그레이엄 스캔: 볼록 껍질 생성 시 스택의 방향 판단
- Jarvis March: 외접 점을 반시계 방향으로 선택
- 선분 교차 판정: 두 선분의 교차 여부를 ccw로 판별
- 다각형 내부 판별: 점이 다각형 내부에 있는지 확인
8 같이 보기[편집 | 원본 편집]
9 참고 문헌[편집 | 원본 편집]
- Cormen, T. H. et al. (2009). Introduction to Algorithms. MIT Press
- Computational Geometry: Algorithms and Applications by de Berg et al.
- https://cp-algorithms.com/geometry/oriented-triangle-area.html