相當全的計算幾何模板
ps:盡量不要用除法,三角函式,強制型別轉換等操作,否則精度損失比較大
const double pi = acos(-1.0);
const double eps = 1e-8;
任何double的比較運算都要用eps
二維空間
向量旋轉矩陣
我們想將向量 x,
y−→−
以x為軸點逆時針旋轉,且旋轉角為 α,
[x′y
′]=[
cos(α)
sin(α)
−sin(α
)cos(α
)]×[
xy]
叉積
double mul(point p1,point p2,point p0)
兩點求距離double dis(point p1,point p2)
三維空間
點,線,面
struct point;
struct line;
struct plane;
計算 cross product product product product u x vpoint xmult(point u,point v)
計算 dot product product product product u . vdouble dmult(point u,point v)
向量差 u - vpoint subt(point u,point v)
取平面法向量point pvec(plane s)
point pvec(point s1,point s2,point s3)
兩點距離,單引數取向量大小double dis(point p1,point p2)
向量大小double vlen(point p)
判斷四點是不是共面bool judge(point a,point b,point c,point d)
點到平面距離double ptoplane(point p,point s1,point s2,point s3)
三角形面積double area_********(point a,point b,point c)
double area_********(point b,point p1,point p2)
//極角排序bool dy(double x,double y) // x > y
bool xy(double x,double y) // x < y
bool dyd(double x,double y) // x >= y
bool xyd(double x,double y) // x <= y
bool dd(double x,double y) // x == y
bool cmp(point a,point b) // 第一次排序
grabam 掃瞄法o(
nlog
2n) 複雜度尋求凸包
凸包運算(周長+面積+最小園覆蓋)const int maxn=50000;
point p[maxn];
point ch[maxn];
int n;
int len;
int main()
if(n==0) break;
//這是一些值得特判的情況
//if(n==0) if(n==1) if(n==2)
if(n<=1)
if (n == 2)
graham_scan(p,ch,n,len);
for(int i=0; ix
<<" "
double perimeters=0.0;
for(int i=1;i1]);
}perimeters+=dis(ch[0],ch[len-1]);
printf("%.0lf\n",perimeters);
//求凸包的面積
double area=0.0;
for(int i=2; i1],ch[i],ch[0]);
}printf("%d\n",(int )area/100);
//求圖包最小圓覆蓋
double maxr = -1;
double a, b, c, r, s;
for (int i=0; ifor (int j=i+1; jfor (int k=j+1; kif (a*a+b*b
*c || a*a+c*c
*b || b*b+c*c
*a) r = max(max(a, b), c) / 2.0;//鈍角時 半徑為最長邊的一半
else
if (maxr < r) maxr = r;}}
}printf ("%.2lf\n", maxr+0.50);
//if(t) printf("\n"); //這是控制兩組輸出資料之間有乙個空格的
}return
0;}
線段相交bool isintersected(point s1,point e1,point s2,point e2)//兩個線段相交
求兩線段交點point intersection(point &a,point &b,point &c,point &d)
兩圓相交面積struct round ;
double solve(round a, round b)
double ang1 = acos((a.r * a.r + d * d - b.r * b.r) / 2. / a.r / d);
double ang2 = acos((b.r * b.r + d * d - a.r * a.r) / 2. / b.r / d);
double ret = ang1 * a.r * a.r + ang2 * b.r * b.r - d * a.r * sin(ang1);
return ret
;}
可以由4個點構成3個向量,3個向量共面的充要條件是向量為a,b,c,存在實數x,y,z不全為零,使得xa+yb+zc=0。轉化為線性代數的3個向量線性相關的行列式為0。
double is_coplanar(point a, point b, point c, point d)
計算幾何 模板總結
計算幾何終極模板 總結 pragma comment linker,stack 102400000,102400000 include bits stdc h define pb push back define ls l,m,now 1 define rs m 1,r,now 1 1 define...
計算幾何模板總結(一)
這一部分主要總結一下在 挑戰程式設計競賽 二 中的一些 常用預處理 define eps 1e 10 設定精度 define pi acos 1 精確圓周率 define inf 1e20 設定無限大 define equals a,b fabs a b 利用c 和stl,對一些基本圖形進行了封裝 ...
計算幾何模板總結(二)
直線的正交 平行判定 兩個向量a,b正交,等價於,向量a,b的點積為0 bool isorthogonal vector a,vector b return equals dot a,b 0.0 bool isorthogonal point a1,point a2,point b1,point b...