Skip to content
الگوریتم‌های دیگر

پوش محدب (Convex Hull)

Graham Scan — O(n log n)

0 نقطه
کلیک کن تا نقاط اضافه شوند

درباره Convex Hull

Convex Hull کوچک‌ترین چندضلعی محدب است که تمام نقاط را در بر می‌گیرد. Graham Scan ابتدا نقاط را بر اساس زاویه مرتب می‌کند، سپس با stack بررسی می‌کند که آیا هر نقطه چرخش پادساعتگرد ایجاد می‌کند. اگر نه، Pop می‌شود.

مرتب‌سازی

O(n log n)

Scan

O(n)

کل

O(n log n)

کاربردها

تشخیص برخورد (Collision Detection)، پردازش تصویر، GIS، machine learning (SVM boundary).

convex_hull.py
from functools import cmp_to_key
import math

def graham_scan(points):
    # پیدا کردن pivot (پایین‌ترین نقطه)
    pivot = min(points, key=lambda p: (p.y, p.x))

    # مرتب‌سازی زاویه‌ای
    def angle_sort(a, b):
        angle_a = math.atan2(a.y-pivot.y, a.x-pivot.x)
        angle_b = math.atan2(b.y-pivot.y, b.x-pivot.x)
        return -1 if angle_a < angle_b else 1

    pts = [p for p in points if p != pivot]
    pts.sort(key=cmp_to_key(angle_sort))
    pts = [pivot] + pts

    # Graham Scan — stack
    stack = pts[:2]
    for p in pts[2:]:
        while len(stack) > 1 and cross(stack[-2],stack[-1],p) <= 0:
            stack.pop()     # چرخش ساعتگرد → Pop
        stack.append(p)     # چرخش پادساعتگرد → Push

    return stack  # O(n log n)