볼록 껍질 (알고리즘): 두 판 사이의 차이

IT 위키
(새 문서: 볼록 껍질(Convex Hull)은 2차원 평면상의 여러 점 집합에서, '''모든 점을 포함하는 가장 작은 볼록 다각형'''을 의미한다. 쉽게 말해, 고무줄을 점들에 감쌌을 때 만들어지는 가장 바깥쪽 경계를 뜻하며, 계산기하학에서 매우 기본적이고 중요한 문제다. ==개념== *점들이 모여 있는 형태에서 '''가장 바깥쪽을 둘러싸는 볼록 다각형'''을 찾는 문제 *볼록 다각형이란 두 점...)
 
편집 요약 없음
 
3번째 줄: 3번째 줄:
*점들이 모여 있는 형태에서 '''가장 바깥쪽을 둘러싸는 볼록 다각형'''을 찾는 문제
*점들이 모여 있는 형태에서 '''가장 바깥쪽을 둘러싸는 볼록 다각형'''을 찾는 문제
*볼록 다각형이란 두 점을 잇는 선분이 항상 다각형 내부에 포함되는 다각형을 의미함
*볼록 다각형이란 두 점을 잇는 선분이 항상 다각형 내부에 포함되는 다각형을 의미함
*입력: n개의 점 (x, y)
*'''입력''': n개의 점 (x, y)
*출력: 볼록 껍질을 이루는 점들의 리스트 (반시계 방향 정렬)
*'''출력''': 볼록 껍질을 이루는 점들의 리스트 (반시계 방향 정렬)
*'''목적''': 가장 작은 다각형을 찾는 것이 목적이다. 가장 작다는 것은 일반적으로 테두리의 길이가 가장 작고 연결하는 꼭지점의 수가 작은 것을 의미한다. 아래 그림을 보면 면적은 (b)가 더 작지만 대부분의 알고리즘에서는 (a)를 최적의 답으로 선택한다.
[[파일:볼록 껍질의 예시.png|400x400픽셀]]
 
==응용==
==응용==
*컴퓨터 그래픽스 및 시각화
*컴퓨터 그래픽스 및 시각화
14번째 줄: 17번째 줄:
*입력 점들을 극각 기준으로 정렬 후 스택을 이용해 볼록 껍질 생성
*입력 점들을 극각 기준으로 정렬 후 스택을 이용해 볼록 껍질 생성
*시간 복잡도: O(n log n)
*시간 복잡도: O(n log n)
절차:
'''절차:'''
#가장 y값이 작은 점을 기준점으로 설정
#가장 y값이 작은 점을 기준점으로 설정
#나머지 점들을 기준점에서의 각도(극각) 기준으로 정렬
#나머지 점들을 기준점에서의 각도(극각) 기준으로 정렬

2025년 4월 5일 (토) 00:57 기준 최신판

볼록 껍질(Convex Hull)은 2차원 평면상의 여러 점 집합에서, 모든 점을 포함하는 가장 작은 볼록 다각형을 의미한다. 쉽게 말해, 고무줄을 점들에 감쌌을 때 만들어지는 가장 바깥쪽 경계를 뜻하며, 계산기하학에서 매우 기본적이고 중요한 문제다.

개념[편집 | 원본 편집]

  • 점들이 모여 있는 형태에서 가장 바깥쪽을 둘러싸는 볼록 다각형을 찾는 문제
  • 볼록 다각형이란 두 점을 잇는 선분이 항상 다각형 내부에 포함되는 다각형을 의미함
  • 입력: n개의 점 (x, y)
  • 출력: 볼록 껍질을 이루는 점들의 리스트 (반시계 방향 정렬)
  • 목적: 가장 작은 다각형을 찾는 것이 목적이다. 가장 작다는 것은 일반적으로 테두리의 길이가 가장 작고 연결하는 꼭지점의 수가 작은 것을 의미한다. 아래 그림을 보면 면적은 (b)가 더 작지만 대부분의 알고리즘에서는 (a)를 최적의 답으로 선택한다.

볼록 껍질의 예시.png

응용[편집 | 원본 편집]

  • 컴퓨터 그래픽스 및 시각화
  • 충돌 감지, 경계 영역 계산
  • 지도 서비스에서의 범위 검색
  • 패턴 인식, 머신러닝의 군집 경계 계산

대표 알고리즘[편집 | 원본 편집]

1. Graham Scan[편집 | 원본 편집]

  • 입력 점들을 극각 기준으로 정렬 후 스택을 이용해 볼록 껍질 생성
  • 시간 복잡도: O(n log n)

절차:

  1. 가장 y값이 작은 점을 기준점으로 설정
  2. 나머지 점들을 기준점에서의 각도(극각) 기준으로 정렬
  3. 시계 방향 회전하는 점은 제거하고 반시계 방향 점만 스택에 유지

2. Andrew's Monotone Chain[편집 | 원본 편집]

  • 점들을 x좌표 기준으로 정렬 후, 위쪽 껍질과 아래쪽 껍질을 각각 생성 후 병합
  • 시간 복잡도: O(n log n)

3. Jarvis March (Gift Wrapping)[편집 | 원본 편집]

  • 가장 왼쪽 점에서 시작하여 시계방향으로 외접하는 점을 차례로 선택
  • 시간 복잡도: O(nh) (h는 볼록 껍질에 속한 점의 수)
  • 작은 h에서는 빠름

4. Chan's Algorithm[편집 | 원본 편집]

  • Graham Scan과 Jarvis March를 결합
  • 시간 복잡도: O(n log h) — 이론적으로 가장 효율적

파이썬 예시 (Graham Scan)[편집 | 원본 편집]

def ccw(p1, p2, p3):
    return (p2[0]-p1[0])*(p3[1]-p1[1]) - (p2[1]-p1[1])*(p3[0]-p1[0])

def graham_scan(points):
    points = sorted(points, key=lambda p: (p[1], p[0]))
    pivot = points[0]
    sorted_pts = sorted(points[1:], key=lambda p: (atan2(p[1]-pivot[1], p[0]-pivot[0]), p))

    hull = [pivot]
    for pt in sorted_pts:
        while len(hull) >= 2 and ccw(hull[-2], hull[-1], pt) <= 0:
            hull.pop()
        hull.append(pt)
    return hull

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

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