部分****於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...