//開始 自己 做 ,不是 wa 就是 tle
// 後 來 還是看別人**的
//注意 此 下面 **c++ ac ,g++ tle;
#include#include#include
#include
using
namespace
std;
#define n 1005
#define pr 1e-8
struct
tpoint
; tpoint(
double _x,double
_y):x(_x),y(_y){}
tpoint
operator-(const tpoint p)
}s;struct
tpolygon
ply1,ply2;
int dblcmp(double a)
double min(double a,double b)
double dist(tpoint a,tpoint b)//
兩點距double cross(tpoint a,tpoint b,tpoint c)//
叉積double dot(tpoint a,tpoint b,tpoint c)//
點積bool cmop(tpoint a,tpoint b)//
x、y排序
bool cmp(tpoint a,tpoint b)//
叉積內排序
tpolygon graham(tpolygon ply)
//凸包
ply.n=k;
return
ply;
}double disps(tpoint a,tpoint b,tpoint c)//
點到線段的最近距離
double disss(tpoint a,tpoint b,tpoint c,tpoint d)//
兩條線段最近距離
double solve(tpolygon pl,tpolygon pr,int p,int q)//
旋轉卡殼,求凸邊形最近距離
return
min;
}void gettop(tpolygon pl,tpolygon pr,int &l,int &r)//
得到最下和最上點
for(i=0;i)
}bool segcross(tpoint a,tpoint b,tpoint c,tpoint d)//
ab交線段cd
bool pintoply(tpoint a,tpolygon res)//
點在多邊形內、環顧法
bool plyintoply(tpolygon res1,tpolygon res2)//
包含bool plycrossply(tpolygon res1,tpolygon res2)//
相交int
main()
//多邊形1擁有最少點
if(ply1.n==1
)
}else
if(ply1.n==2)//
二對多
else
if(tmp) mindis=0
;
else
for(i=0;i)
mindis=min(mindis,disss(ply1.p[0],ply1.p[1],ply2.p[i],ply2.p[i+1
]));}}
}else}}
printf(
"%.4lf\n
",mindis);
}return0;
}
hdu5251 凸包 旋轉卡殼
傳送門 hdu5251 矩形面積 接觸了旋轉卡殼不久,感覺很神奇 這個題是要尋找乙個矩形來覆蓋住桌面上的小矩形,小矩形即四個點啦,所以就是 找乙個矩形覆蓋住這些點,也就要求乙個凸包,再用矩形把凸包蓋住,那就很明顯的 是旋轉卡殼了,類似旋轉卡殼求凸包的寬度,只是這是求矩形面積的最小值 完整 inclu...
旋轉卡殼 Rotating Calipers
上週做了一些凸包等計算幾何的問題,感覺挺有意思的,想好好研究一下,發現乙個推薦的英文 雖然沒有多少,但是還是想試著通過自己做題的領悟加上6級水平的英語來翻譯一下,請批評指正。原文 在1978年,m.i.shamos s 博士 計算幾何 標誌著這一領域在電腦科學中的誕生。這在他發表的成果中是乙個尋找凸...
旋轉卡殼演算法
直接按照這個描述可以實現旋轉卡殼演算法,但是 肯定相當冗長。逆向思考,如果qa,qb是凸包上最遠兩點,必然可以分別過qa,qb畫出一對平行線。通過旋轉這對平行線,我們可以讓它和凸包上的一條邊重合,如圖中藍色直線,可以注意到,qa是凸包上離p和qb所在直線最遠的點。於是我們的思路就是列舉凸包上的所有邊...