我的acm幾何模板

2021-10-05 10:12:24 字數 3154 閱讀 8777

部分****於kuangbin的幾何模板

const double eps = 1e-8;

const double inf = 1e20;

const double pi = acos(-1.0);

const int maxp = 1010;

//`compares a double to zero`

int sgn(double x)

struct point

point(double _x,double _y)

//叉積

double operator ^(point b)

double cross(point b,point c)

//點積

double operator *(point b)

double dot(point b,point c)

//兩點間的距離

double distance(point b)

//優先x然後y的座標比較與排序

bool operator < (point b)const

double linedis(point b,point c)

};struct line

line(point _s,point _e)

//直線和直線

//0重合

//1平行

//2相交

int linecorssline(line v)

//求兩直線的交點

point crosspoint(line v)

//線段之間的關係

//2 規範相交

//1 不規範相交(交於某一線段的端點)

//0 不相交

int segecross(line v)

//點到線段的距離(最小距離)

double point_to_seg(point a,point b,point c)

//線段到線段的最小距離

double seg_to_seg(line v)

};//圓

struct circle

circle(point a,point b,point c)

//求兩圓的公切線

//需要用到point裡面的mytrunc,distance

//測試 uva10674

bool flag=false;//判斷兩圓是否進行過交換

line ans[6];//所得的切線

int gettange(circle v)

double ta,tb;//相離、外切、相交都有的兩條切線

if(sgn(r1-r2)>0) ta=acos(d/lens),tb=pi-ta;

else tb=acos(d/lens),ta=pi-tb;

cnt++;ans[cnt].s=a.mytrunc(b.rotate(a,ta),r1),ans[cnt].e=b.mytrunc(a.rotate(b,-tb),r2);

cnt++;ans[cnt].s=a.mytrunc(b.rotate(a,-ta),r1),ans[cnt].e=b.mytrunc(a.rotate(b,tb),r2);

if(!sgn(lens-r1-r2))else if(sgn(lens-r1-r2)>0)

return cnt; //返回切線的個數

} //最小圓覆蓋 pt是點集 n是點數

circle(point pt,int n)} }

}} (*this)=o;

} };

凸包struct polygon

bool operator()(const point &aa,const point &bb)

return d > 0;

} };

//`進行極角排序`

//`首先需要找到最左下角的點`

//`需要過載號好point的 < 操作符(min函式要用) `

void norm()

//凸包演算法 返回凸包的點個數

//此演算法得到的凸包頂點會按照逆時針排序

int graham(point q)

int tp=top;

for(int i = n-2; i >= 0; i--)

return top;

} 旋轉卡殼

//凸包直徑

double diameter()

if(sgn(ans-p1.distance(p[r]))<0) ans=p1.distance(p[r]);

if(sgn(ans-p2.distance(p[r]))<0) ans=p2.distance(p[r]);

} return ans;

} //凸包寬度

double width()

ans=min(ans,p[r].linedis(p1,p2));

} return ans;

} //兩多邊形之間的最近最遠距離

//需要用到線段到線段最短距離 seg_to_seg(求最近的時候)

double getmindis(polygon b)

return ans;

} //`判斷點和任意多邊形的關係`(凹凸順逆皆可)

//` 3 點上`

//` 2 邊上`

//` 1 內部`

//` 0 外部`

int relationpoint(point s)

else

//printf("ans=%d\n",ans);

} return ans!=0;

} };

平面最近點對

#include#include#include#includeusing namespace std;

const int n = 1e5+100;

int n;

struct point

point(double _x,double _y)

double dis(point b)

void input()

}p[n],q[n];

bool cmp(point a,point b)

int main()

return 0;

} //

ACM計算幾何 三維幾何模板

三維幾何函式庫 include define eps 1e 8 define zero x x 0?x x eps vlen xmult subt p,s.b subt p,s.c eps vlen xmult subt p,s.c subt p,s.a eps int dot inplane ex...

ACM幾何問題

今天覆習了一下幾何的基礎內容,順便整理了一下。其實幾何也挺簡單的,只要熟練掌握點積和叉積,這些都是易學易懂的。1.點 直線 線段 圓 三角形 多邊形 矩形 判相交,判位置,求交點,求最近點,求特殊點 三角形六心等 2.凸包 水平序,極角序 規範,非規範 3.半平面交 求核 4.旋轉卡殼 多邊形直徑 ...

ACM 計算幾何

1.找凸包的最小寬度 include using namespace std double eps 1e 10 考慮誤差的加法運算 double add double a,double b struct p p double x,double y x x y y p operator p p p o...