凸包算法(Graham扫描法)
转载自 SZUhg https://www.cnblogs.com/wpbing/p/9456240.html
叉乘与线段相交
判断一个点是否在一条线段的左边还是右边,可以用叉乘来判断,或者判断两条线段是否相交
凸包、Graham扫描法
1.在平面上一些散乱的点,首先找到这些点中处于最左下方的点。
2.对这些点进行排序。把按照极角(polar angle)从小到大排序(以 p1为极点),极角相同的点按照到的距离从小到大排序。
3.再开一个结构体数组s 来储存凸包最外围的点,也就是结果,这个有点容易让人搞迷。
遍历剩下的点,while循环把发现不是凸包顶点的点移除出去,因为当逆时针遍历凸包时,我们应该在每个顶点向左转。因此当while循环发现在一个顶点处没有向左转时,就把该顶点移除出去。
至于如何判断向左向右则是根据叉积来判断,前面我们已经解决过这个问题了。
求面积均匀的多边形重心
需要把多边形以p[0]为分界点 分成n-2个三角形,求出这些三角形的重心(i,j),乘以该三角形的面积,如上图公式。