前言
今天学习了几何算法——凸包算法,听着名字很奇怪,不知道它是干什么的,但其实也很简单。下面来介绍一下这种凸包算法和其c++代码:
凸包算法
其实很简单,就是用一个的凸多边形围住所有的点。就好像桌面上有许多图钉,用一根紧绷的橡皮筋将它们全部围起来一样。算法详细步骤:
1. 找到所有点中纵坐标y最小的点,也就是这些点中最下面的点,记为p0。
2. 然后计算其余点与该点的连线与x轴之间夹角的余弦值,将这些点按其对于最低点的正弦值从大到小排序,排序好的点记为p1, p2, p3, ......
3. 将最低点p0和排序好的点中的第一个点p1压入栈中,然后从p2开始计算,计算栈顶两个点与该点三点向量是否是逆时针转动,若是,则将该点压入栈中,否则将栈顶元素推出。(此处对栈的概念不清楚可自行搜索)
4. 最后栈里面元素就是所有的凸包外围的点
判断是否为逆时针旋转
area = (b.x-a.x) * (c.y-a.y) - (b.y-a.y) * (c.x-a.x)
area >0,A-B-C逆时针旋转;
area <0,A-B-C顺时针旋转;
area =0,A-B-C在一条直线上。
来看看c++代码:
class mpoint{ //class point(x, y)
public:
double x;
double