計算幾何各種小模板總結貼 不定期更新

2021-07-11 03:23:03 字數 3452 閱讀 2837

相當全的計算幾何模板

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 v
point xmult(point u,point v)
計算 dot product product product product u . v
double dmult(point u,point v)
向量差 u - v
point 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...