c++ 凸包 分治算法_凸包算法详解(Graham扫描法)

12c6be4365c80e325d5bb0a76e2d7f5b.png

什么是凸包?

dcc07750d09d4fa3fbc470d722ff90b1.png

来打一个比方,假设我现在拿了一块木板,然后在上面无规则的随意钉上了几个钉子,并给他们命名为P0-P12,如下图所示:

0b9c4c94ce658af803511867bf306b1f.png

现在我拿了一根绳子,打了一个结,让绳子变成一个圆套,放在木板上并且让所有钉子都处在圆套内,如下图所示:

b2e6614493e0f7a3f4880599b0904fa7.png

现在我要收缩圆套,让所有钉子都在圆套内且绳子的长度最短,大家觉得该如何去做才能实现上述所说呢?是的,就是把钉子中最外围的点连接成一条线,就能让所有的钉子在圆套内,并且绳子所需要的长度最短。如下图所示:

749f1b4572c2978e0d3dfecdcca4ccb7.png

这类求解最外围的点集问题,我们称之为凸包问题,光光是用肉眼去观察的话,这种问题我们很快就能得出答案,并且能马上说出哪几个点是解,但是如果让你敲代码,去解决这类的问题,可能很多人会不知道如何去下手。

在讲解凸包这类问题的解法前,我们首先要先讲下向量积这个数学小知识。

07195bba2215bfa8c66ce0360bd9bb94.png

了解了上面这个数学小知识后,我们现在可以正式开始着手去解决凸包问题了,首先我们先思考下,如果我们要去解决凸包问题,我们就必须要一个个去寻找最外围的点,万事开头难,第一个点该从哪里找起呢?

所有的点都在一个二维的平面上,细想一下,其中y轴(纵坐标)最小的点是不是我们要找的最外围的点之一呢?答案是肯定的,如果纵坐标最小的点有多个,那么我们就选取x轴(横坐标)最小的一个,如果这样的点也有多个也就是重合,也不影响解题。以此类推,其实也可以找纵坐标最大的点,还有横坐标最小的点&

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值