POJ 3608 旋轉卡殼求解凸包間的最短距離

2021-07-15 15:28:11 字數 1454 閱讀 9423

題意給你兩個凸包,求解兩個凸包間的最短距離。

#include #include #include #include #include using namespace std;

#define max_n 10000+10

#define inf 0x3f3f3f3f

#define eps 1e-10

struct point

point(double x, double y) : x(x), y(y) {}

point operator + (const point& p)

point operator - (const point& p)

point operator * (const double& d)

bool operator < (const point& a) const

double dot(const point& p)

double det(const point& p)

};point p[max_n], q[max_n];

// 字典序比較

bool cmp_x(point a, point b)

// 向量ab 與 ac 的叉積 如果叉積大於0,那麼c在向量ab的逆時針方向,叉積小於0則在ab的順時針方向。如果叉積等於0,則abc共線。

inline double cross(point a, point b, point c)

// 向量ab 與 ac 的點積 如果點積的結果為0,那麼這兩個向量互相垂直

inline double multi(point a, point b, point c)

// 兩點距離

inline double dist(point a, point b)

// 逆時針排序

inline void anticlockwise_sort(point* p, int n) }}

//計算c點到線段ab的最短距離

inline double point_to_line(point a, point b, point c)

//求一條線段的兩端點到另外一條線段的距離,反過來一樣,共4種情況

inline double line_to_line(point a, point b, point c, point d)

//求解兩凸包之間的最短距離

inline double min_dis_2(point* p, point* q, int n, int m)

return ans;

}int main()

for (int i = 0; i < m; ++i)

anticlockwise_sort(p, n);

anticlockwise_sort(q, m);

printf("%.5f\n", min_dis_2(p, q, n, m));

}}

POJ 3608 旋轉卡殼

題意 求兩個凸包的最近距離。題解 原來旋轉卡殼這麼暴力。我以前一直以為是o n 的。畫畫圖,用叉積判斷下旋轉角度就行了 view code 1 include 2 include 3 include 4 include 5 include 6 include 7 8 define n 22222 9...

凸包問題 旋轉卡殼

1978年,m.i.shamos在 computational ceometry 中介紹了一種尋找凸多邊形直徑的線性演算法。1.支撐線 如果一條直線l,通過凸多邊形p的乙個頂點,且多邊形在這條直線的一側,稱l是p的支撐線。2.對踵 zhong,三聲 點 如果過凸包上的兩個點可以畫一對平行直線,使凸包...

模板 凸包 旋轉卡殼

模板 凸包 旋轉卡殼 lrj 訓練指南 p272 對於個點按照 x 從小到大排序,再按照 y 點從小到大排序,刪除重複的點後,得到序列 p0,p1,p2.把 p0 和 p1 放入凸包。從p2開始,當新點在凸包 前進 方向的左邊時繼續,否則依次刪除最近加入凸包的點,直到新點在左邊 ps 判斷用叉積即可...