其中cross()是计算叉积,因为凸包上距离一条边最远的点和这条边的两个端点构成的三角形面积是最大的。之所以既要更新(ch[p],ch[q])又要更新(ch[p+1],ch[q+1])是为了处理凸包上两条边平行的特殊情况。 下面是道很基础的旋转卡壳求凸包直径的题了: poj 2187 :http://poj.org/problem?id=2187 用上面...
1.如果qa,qb是凸包上最远两点,必然可以分别过qa,qb画出一对平行线。通过旋转这对平行线,我们可以让它和凸包上的一条边重合,,如图中蓝色直线。可以注意到,qa是凸包上离p和qb所在直线最远的点 2.于是我们的思路就是枚举凸包上的所有边,对每一条边找出凸包上离该边最远的顶点,计算这个顶点到该边两个端点的...
//旋转卡壳求凸包最长直径 double Rotating_Calipers(Point* res, int cnt) { int q = 1; double ans = 0; res[cnt] = res[0]; //枚举每一条边p[i] - p[i + 1],然后移动顶点q判断是否距离在增长,如果是就继续移动,否则就更新最大值并换下一条边,q可能会转好几圈所以求余cnt,判断q点到边的...
1.(1)M的直径为d',而M的直径为d.设A,B是M中距离等于d的两-|||-个点.-|||-因为M盖住M,由于McM',故A,B∈M,于是d≥d;-|||-又若dd,即凸包上有两点A',B,使ABd,于是必存在点C∈-|||-A'B,使AC上没有M的点.于是可以用更小的凸集盖住M,与凸包定义矛-|||-盾.-|||-(2)n=3时,3...
//计算凸包直径,输入凸包 ch,顶点个数为 n,按逆时针排列,输出直径的平方 int rotating_calipers(Point *ch,int n) { int q=1,ans=0; ch[n]=ch[0]; for(int p=0;p<n;p++){ while(cross(ch[p+1],ch[q+1],ch[p])>cross(ch[p+1],ch[q],ch[p])) q=(q+1)%n; ans=max(ans,...
//计算凸包直径,输入凸包 ch,顶点个数为n,按逆时针排列,输出直径的平方 int rotating_calipers(Point *ch, int n) ( int q=1,ans=0; ch[n]=ch[0]; for (int p=0;pn;p++){ while (cross(ch[p+1],ch[q+1],ch[p])cross(ch[p+1],ch[q],ch[p])) q=(q+1)%n; ans=max(ans,max...
显然, 确定一个凸多边形 P 直径的点对不可能在多边形 P 内部。 故搜索应该在边界上进行。 事实上, 由于直径是由多边形的平行切线的最远距离决定的, 所以我们只需要查询对踵点。 Shamos (1978) 提供了一个 O(n) 时间复杂度计算n点凸包对踵点对的算法。直径通过遍历顶点列表, 得到最大距离即可。 如下是1985...
旋转卡壳求凸包直径。 参考:http://www.cppblog.com/staryjy/archive/2010/09/25/101412.html 1#include <cstdio>2#include <cmath>3#include <algorithm>45usingnamespacestd;67constintMAXN =100022<<2;89structPoint10{11intx, y;12Point(intx =0,inty =0):x(x), y(y) { }13};1415typedef ...
intdiameter2(vector<Point>& points)//求凸包的最大直径(旋转卡壳算法){ vector<Point> p = ConvexHull(points); intn = p.size(); if(n == 1)return0; if(n == 2)returnDist2(p[0], p[1]); p.push_back(p[0]); intans = 0; inti=...