故搜索应该在边界上进行。 事实上, 由于直径是由多边形的平行切线的最远距离决定的, 所以我们只需要查询对踵点。 Shamos (1978) 提供了一个 O(n) 时间复杂度计算n点凸包对踵点对的算法。直径通过遍历顶点列表, 得到最大距离即可。 如下是1985年发表于 Preparata 和 Shamos 文章中的 Shamos 算法的伪代码。 输...
//计算凸包直径,输入凸包 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,...
//旋转卡壳求凸包最长直径 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点到边的...
旋转卡壳求凸包直径。 参考: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...
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++) /** 从前往后找,求"下凸包" */ ...
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=...
#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...
旋转卡壳求凸包直径 思路 直径即最长的两点的距离 枚举凸包上的所有边,对每一条边找出凸包上离该边最远的顶点(用叉积),计算这个顶点到该边两个端点的距离,并记录最大的值。但是注意到当我们逆时针枚举边的时候,最远点的变化也是逆时针的,这样就可以不用从头计算最远点,而可以紧接着上一次的最远点继续计算。
旋转卡壳-求凸包最大直径 时间复杂度:O(n) 参考:https://www.cnblogs.com/xdruid/archive/2012/07/01/2572303.html 暴力:n^2枚举凸包上的点,如果数据水的话可过。 高级做法: 用一对平行线“卡”住凸包进行旋转。 被一对卡壳正好卡住的对应点对称为对踵点。