什么是凸包?
来打一个比方,假设我现在拿了一块木板,然后在上面无规则的随意钉上了几个钉子,并给他们命名为P0-P12,如下图所示:
现在我拿了一根绳子,打了一个结,让绳子变成一个圆套,放在木板上并且让所有钉子都处在圆套内,如下图所示:
现在我要收缩圆套,让所有钉子都在圆套内且绳子的长度最短,大家觉得该如何去做才能实现上述所说呢?是的,就是把钉子中最外围的点连接成一条线,就能让所有的钉子在圆套内,并且绳子所需要的长度最短。如下图所示:
这类求解最外围的点集问题,我们称之为凸包问题,光光是用肉眼去观察的话,这种问题我们很快就能得出答案,并且能马上说出哪几个点是解,但是如果让你敲代码,去解决这类的问题,可能很多人会不知道如何去下手。
在讲解凸包这类问题的解法前,我们首先要先讲下向量积这个数学小知识。
了解了上面这个数学小知识后,我们现在可以正式开始着手去解决凸包问题了,首先我们先思考下,如果我们要去解决凸包问题,我们就必须要一个个去寻找最外围的点,万事开头难,第一个点该从哪里找起呢?
所有的点都在一个二维的平面上,细想一下,其中y轴(纵坐标)最小的点是不是我们要找的最外围的点之一呢?答案是肯定的,如果纵坐标最小的点有多个,那么我们就选取x轴(横坐标)最小的一个,如果这样的点也有多个也就是重合,也不影响解题。以此类推,其实也可以找纵坐标最大的点,还有横坐标最小的点&