计算几何--凸包

转载:https://www.cnblogs.com/cjyyb/p/7260523.html

首先找到最靠近左下的那个点,这个点一定在凸包上(不难理解吧。。。画个图就知道了)

以这个点为极点,其他点按照极角排序

然后按照顺序依次访问所有点,判断可行性

1,2,3是当前在凸包的栈中的点,4号节点是需要判断的点
那么,我们需要从栈中拿最上方的两个点(2和3节点)
把他们连接起来,再把2和4连接起来(怎么连接?我是不会说直接用向量的坐标表示就可以了)
计算一下两个向量的叉积。。
哈,叉积。。。
解释一下吧。。
假设2到3的向量是a(x1,y1)
2到4的向量是b(x2,y2)
那么,计算一下它们的叉积,也就是x1y2-x2y1
换种方法来表示就是。
|a|·|b|·sin<a,b>
(所以说叉积也可以用来求出三角形的面积~这个以后还会用到的)
如果,这两个向量的叉积≥0 证明这两个向量平行或者夹角是个锐角
也就证明了3号节点此时一定不再凸包上(因为连接2和4之后3在凸包内侧了)
把3号节点弹出栈,继续重复上面的步骤即可。

struct Node
{
       int x,y;
}p[MAX],S[MAX];//p储存节点的位置,S是凸包的栈 
inline bool cmp(Node a,Node b)//比较函数,对点的极角进行排序 
{
       double A=atan2((a.y-p[1].y),(a.x-p[1].x));
       double B=atan2((b.y-p[1].y),(b.x-p[1].x));
       if(A!=B)return Ap[i].y||(p[0].y==p[i].y&&p[i].x=0)
                        top--;//如果当前栈顶不是凸包上的节点则弹出 
              else  S[++top]=p[i++];//加入凸包的栈中 
       }
       //底下这个玩意用来输出凸包上点的坐标 
       //for(int i=0;i<=top;++i)
       //    printf("(%d,%d)\n",S[i].x,S[i].y);
}

推荐练习:HDU 1392

你可能感兴趣的:(计算几何)