//计算凸包直径,输入凸包 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,...
故搜索应该在边界上进行。 事实上, 由于直径是由多边形的平行切线的最远距离决定的, 所以我们只需要查询对踵点。 Shamos (1978) 提供了一个 O(n) 时间复杂度计算n点凸包对踵点对的算法。直径通过遍历顶点列表, 得到最大距离即可。 如下是1985年发表于 Preparata 和 Shamos 文章中的 Shamos 算法的伪代码。 输...
//旋转卡壳求凸包最长直径 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点到边的...
} 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=0,j=1; for(;i<n;i++) { while(Cross(...
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;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...
double ConvexHull(Point* p, int n, Point* ch) /** 基于水平的Andrew算法求凸包 */ { sort(p,p+n,cmp); /**先按照 x 从小到大排序, 再按照 y 从小到大排序*/ int m = 0; for(int i = 0; i < n; i++) /** 从前往后找,求"下凸包" */ ...
旋转卡壳求凸包直径。 参考: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 ...
#include<bits/stdc++.h>//求凸包最大直径 using namespace std; const int MAXN = 50010; const int INF = 0x7fffffff; struct Point { double x, y; Point(double x = 0, double y = 0) : x(x), y(y) {} }; typedef Point Vector; Point in[MAXN], out[MAXN]; Vector operator-(Ve...