今天做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 擁...