[PS] CCW (Counter Clock Wise) 알고리즘

2023. 5. 21. 12:41·Problem solving


CCW 알고리즘은 2차원 평면 상의 3개의 점의 위치 관계를 알고자 할 때 유용한 기하 알고리즘이다.
2차원 평면상에 세 점으로 만들 수 있는 두 개의 벡터의 방향성(시계 or 반시계)을, 두 벡터의 외적을 통해서 파악할 수 있다.
두 벡터의 외적 결과가 음수이면 시계 방향, 0이면 직선, 양수이면 반시계 방향이 된다.

외적 (벡터 곱) : u x v = |u||v|sin(seta)

두 벡터의 외적 결과는 두 벡터와 수직인 법선 벡터가 된다. (스칼라 x)
외적은 내적(스칼라 곱)과 다르게 교환 법칙이 성립하지 않는다. (a x b != b x a)
두 벡터의 외적 결과의 크기는 두 벡터가 만들어 내는 평행사변형의 넓이와 같다.
두 벡터의 외적 결과의 방향을 알아내기 위해서는 오른손 법칙을 사용하면 된다.
오른손으로 두 벡터를 순서대로 감싸는 방향으로 쥐었을 때, 엄지 손가락이 가리키는 방향이 외적 결과벡터의 방향이 된다.
행렬식을 통해 외적을 계산할 수 있다.

https://ko.m.wikipedia.org/wiki/벡터곱

 

 

위의 연산식을 이용하여 2차원 평면 상의 세 좌표를 알면, 세 점이 이루는 두 벡터의 방향성을 파악할 수 있다.

def ccw(x1, y1, x2, y2, x3, y3):
    cp = (x1*y2+x2*y3+x3*y1)-(x2*y1+x3*y2+x1*y3)
    if cp == 0: return 0  # 0이면 직선
    elif cp > 0: return 1  # 양수이면 반시계 방향
    else:: return -1  # 음수이면 시계 방향



'Problem solving' 카테고리의 다른 글
  • [PS] boj_17387 : 선분 교차 2
  • [PS] boj_14003 : 가장 긴 증가하는 부분 수열 5
  • [PS] 최장 증가 부분 수열 (LIS)
  • [PS] boj_10942 : 팰린드롬?
vysryoo
vysryoo
  • vysryoo
    vysryoo
    vysryoo
  • 전체
    오늘
    어제
    • 분류 전체보기 (129)
      • Python (20)
      • Data structure (12)
      • Algorithm (14)
      • Operating system (18)
      • Programming language theory (12)
      • Computer architecture (6)
      • Softeware engineering (8)
      • Multicore (2)
      • Data Base (3)
      • Problem solving (24)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
vysryoo
[PS] CCW (Counter Clock Wise) 알고리즘
상단으로

티스토리툴바