《模板》《計算幾何》凸包 旋轉卡殼最小面積外接矩形

2021-06-11 23:04:20 字數 1334 閱讀 8142

今天做uva 10173時遇到的問題,網上各位大牛的**和思想實在無法理解,請教學長後理解了乙個演算法。

學長**:

下面貼一下學長的模板,圖和注釋是我加上的。

注:淺褐色為凸包,紅色為待求矩形。

#include #include #include #include #define min(x,y) ((x)

using namespace std;

struct point

point(double _x,double _y)

void get()

};int db (double x)

double cross(point a,point b,point p)

//向量點乘

//ab*ac

double dot(point a,point b,point c) //求ac在ab邊的攝影

//pt儲存凸包,n為凸包頂點數

double calminrect(point pt,int n)

a=cross(pt[i],pt[i+1],pt[p]); //求出綠色平行四邊形面積,大小等於雪青色矩形的面積

b=dot(pt[i],pt[i+1],pt[q])-dot(pt[i],pt[i+1],pt[r]); //兩攝影相減,求出紅色(待求)矩形底邊長

c=dot(pt[i],pt[i+1],pt[i+1]); //(i,i+1)邊在自身上的投影,即計算(i,i+1)邊的長度

ans=min(ans,a*b/c); //雪青色矩形與紅色矩形高相同,面積比為底邊長之比

}return ans;

}

我的模板

//旋轉卡殼最小面積外接矩形

#define min(x,y) ((x)

struct point

ch[1005];

int db (double d)

double cross (point p,point ch,point x)

double dot(point a,point b,point c) //求ac在ab邊的攝影

double calminrect (point ch,int n)

{ if(n<3) return 0;

int i,p=1,q=1,r;

double ans=1e10,a,b,c;

for(i=0;i

模板 凸包 旋轉卡殼

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

凸包問題 旋轉卡殼

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

旋轉卡殼凸包間最小距離

輸入兩個分別有 m 和 n 個順時針給定頂點的凸多邊形 p 和 q 計算 p 上 y 座標值最小的頂點 稱為yminp 和 q 上 y 座標值最大的頂點 稱為ymaxq 為多邊形在 yminp 和 ymaxq 處構造兩條切線 lp 和 lq 使得他們對應的多邊形位於他們的右側。此時 lp和 lq 擁...