在平面上有若干个点,编写程序求其凸包上的点以及由凸包所构成的多边形的面积。
输入要求:输入的第一行是一个整数n,表示点的个数。其后的n行,每行有两个整数,中间空格隔开,分别表示点的X,Y坐标。
输出要求:输出的第1行为一个整数m,表示凸包上点的个数,其后的m行每行有两个整数,分别表示凸包上点的坐标,最后一行为一个浮点数,精确到小数点后2位。
此题有很多经典算法,这里用分治的方法求解。
思想:先按横坐标将点集排序,则p0pn必定是凸包点集上的点并且将凸包分为上凸包和下凸包,对于上凸包,求px使其到直线p0pn的距离最长,则其必定是凸包上的点。然后连接p0px,pnpx,其下方的点必定不是凸包的点,因此对其构成的上凸包点集分别按照上述方法求解直到没有上凸包为止。下凸包类似求解。对于面积,将多边形固定一个点分解为多个三角形,随后利用向量的叉积求解三角形面积并求和即可。也可以利用以下行列式
=x1y2+x3y1+x2y3-x3y2-x2y1-x1y3,其1/2即为三角形的面积,此外,这个行列式还可以用来判断点与直线的位置关系,行列式值>0,则点(x3,y3)在p1p2的右侧,<0在左侧。而算法的复杂度的关键步骤是将点集排序为O(nlogn)。
源代码:
#include
#include
#include
#include
#include
#include
#include
#include