计算几何——gitf-wrapping算法

几何中的"gift-wrapping"算法,又称为"Jarvis算法",是一种用于计算凸包(convex hull)的方法。下面我将为你解释一下该算法的步骤:

1. 找到具有最小x坐标的点P,我们将其作为凸包的起点。
2. 将P标记为当前点,并将其添加到凸包的顶点集合中。
3. 从当前点开始,选择一个未被访问过的点Q作为下一个顶点,并将其标记为当前点。
4. 遍历所有未被访问的点,计算当前点到每个未访问点的极角(相对于水平轴的夹角)。
5. 找到具有最小极角的点R,将其标记为下一个顶点,并将其添加到凸包的顶点集合中。
6. 将R作为新的当前点。
7. 重复步骤4-6,直到下一个顶点是起点P。

在执行完所有步骤后,你将获得一个具有按逆时针顺序排列的点序列的凸包。

请注意,该算法的时间复杂度是O(nh),其中n是点的数量,h是凸包的顶点数。此外,如果有多个点具有相同的最小极角,可以选择距离最远的点作为下一个顶点,以避免出现重复的顶点。

def gift_wrapping(points):
    n = len(points)
    if n < 3:
        return []

    hull = []
    leftmost = min(points, key=lambda p: p[0])
    hull.append(leftmost)

    while True:
        endpoint = points[0]
        for i in range(1, n):
            if points[i] == hull[-1] or endpoint == hull[-1]:
                endpoint = points[i]
                continue
            cross = orientation(hull[-1], endpoint, points[i])
            if cross < 0 or (cross == 0 and distance(hull[-1], points[i]) > distance(hull[-1], endpoint)):
                endpoint = points[i]

        if endpoint == leftmost:
            break

        hull.append(endpoint)

    return hull


def orientation(p, q, r):
    return (q[1]-p[1]) * (r[0]-q[0]) - (q[0]-p[0]) * (r[1]-q[1])


def distance(p, q):
    return (q[0]-p[0])**2 + (q[1]-p[1])**2

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值