首先我們要知道一種遍歷所有對踵點的演算法 : 就是用旋轉卡殼加上叉積判斷是否旋轉的一種演算法。
剩下的就是求對踵點了
因為我們不難發現,對於兩個凸包來說,他們之間的最小距離肯定在對踵點上。然後我們就可以去便利所有的對踵點這樣同時保留最小距離這樣就可以了。注意求乙個線段到另一條線段的最小距離應該用點積去算就好了
還有我們需要深入理解關於旋轉卡殼的幾個有關的概念
1. 支撐線
2. 對踵點
3. 什麼時候卡殼旋轉
4. 旋轉卡殼
只有這些理解到位以後才可以做這道題 注意對於多個凸包而言,我們需要每乙個都去做一遍旋轉卡殼。\
#include
#include
#include
#include
#include
using namespace std;
const int maxn = 1e4 + 10;
const double eps = 1e-8;
const double inf = 1e88;
struct node p[maxn],q[maxn];
node init;
int sgn (double x)
double cross (double x1,double y1,double x2,double y2)
double muit (double x1,double y1,double x2,double y2)
double dist (node a,node b)
bool cmp (const node a,const node b)
double dist (node a,node b,node c)
double ansdist (node a,node b,node c,node d)
void mysort (node a,int n)
}init = a[1];
//printf ("%.3f %.3f\n",init.x,init.y);
sort (a + 1,a + 1 + n,cmp);
}double rotating (node p,node q,int n,int
m) }
double ans = dist (p[miny],q[maxy]);
for (int i = 1;i <= n; ++ i)
ans = min (ans,ansdist (p[miny],p[miny + 1],q[maxy],q[maxy + 1]));
miny = miny % n + 1;
}return ans;
}int main ()
for (int i = 1;i <= m; ++ i)
mysort(p, n);
mysort(q, m);
//for (int i = 1;i <= m; ++ i)
printf ("%.5f\n",min (rotating(p, q, n, m),rotating(q, p, m, n)));
}return
0;}
POJ 3608 旋轉卡殼求解凸包間的最短距離
題意給你兩個凸包,求解兩個凸包間的最短距離。include include include include include using namespace std define max n 10000 10 define inf 0x3f3f3f3f define eps 1e 10 struct ...
POJ 2187(求凸包內兩點之間最長距離)
推薦部落格 借鑑 分別列舉每個凸包的每條邊,再列舉另乙個凸包的點,求得一對對踵點,與當前記錄的值相取捨。遍歷到下一條邊,從上次便利到的點開始尋找下一對踵點,再取捨.直至取捨出最長 最短距離。include include include using namespace std const int m...
求兩個Date之間的天數
利用jdk1.8的新特性,chronounit類獲取兩個日期之間的天數只差 chronounit是乙個列舉類,有一組標準的時間週期為單元的列舉值,它的列舉值是不變的,執行緒安全的。使用between 方法獲取兩個日期之間的天數差,當然不僅僅可以獲取天數差,可以獲取這個列舉類中任意乙個給出的時間單元的...