計算幾何模板

2021-09-11 15:19:48 字數 4084 閱讀 3091

目錄

二維計算幾何:

二維基本操作

最小圓覆蓋:

最小球覆蓋:

半平面交

(1.計算凸多邊形的相交面積,2.可以看到給定圖形的各個角落(多邊形的核),3.可以放進多邊形的圓的最大半徑)

/*

*點基本運算

*兩點間的距離

*向量基本運算

*向量a和b的內積

*向量a和b的外積

*線段*直線

*點到直線的距離

*點到線段的距離

*判斷p2與向量p1-p0的位置關係

*判斷線段p1p2與線段p3p4是否相交

*線段與線段的距離

*兩個線段的交點(對於直線跟線段也適用,但注意base是在直線上)

*兩個直線的交點

*直線正交

*直線平行

*圓*兩個圓的位置關係

*圓與直線的交點

*圓與圓的交點

*園外一點與圓構成的兩個切點。

*多邊形

*點的****內包*****(判斷點與多邊形的關係)

********凸包*****(包含點集合p中所有點的最小凸多邊形)

*旋轉卡殼*-------》計算凸包直徑

*平面上最近點對。

*圓的公切線,返回的是共切線的條數。

*計算凸多邊形重心

*/#includeusing namespace std;

#define eps (1e-10)

#define equals(a,b) (fabs((a)-(b))eps) return 1;

else if(x<-eps) return -1;

return 0;

}/* 點 */

struct point

point operator + (point p)

point operator - (point p)

point operator * (double k)

point operator / (double k)

//向量的大小

inline double abs()

inline double norm()

bool operator < (const point & p) const

bool operator == (const point & p) const

//圓與圓的交點

bool intersect(circle c1,circle c2)

double arg(vector p)

vector polar(double r,double a)

pairgetcrosspoints(circle c1,circle c2)

// 園外一點與圓構成的兩個切點。

point rotate(point base,point a,double r)

pairgettangent(circle c,point p)

/* 多邊形 */

typedef vectorpolygon;

//點的****內包*****(判斷點與多邊形的關係)

//多邊形內返回2

//多邊形上返回1

//多邊形外返回0

int contains(polygon g,point p)

return (x?2:0);

}/* *******凸包*****(包含點集合p中所有點的最小凸多邊形)

* 輸出凸多邊形最下端最左側的頂點為起點,按逆時針方向依次輸出座標。

* 安德魯演算法 o(n*logn)

*/double area(point p0,point p1,point p2)

polygon andrewscanf(polygon s)

u.push_back(s[i]);

}//構建凸包下部

int tmp=u.size()+1;

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

u.push_back(s[i]);

}//按順序生成凸包點的序列

if(n>1) u.pop_back(); //開始點多加入了一次

return u;

}//旋轉卡殼*-------》計算凸包直徑

double rc(polygon v)

sort(b,b+len,cmpy);

for(int i=0;i0)

return cnt;

}//計算凸多邊形重心

point get_zhongxin(polygon g)a[105];

point o;

double ri;

double dis(point a,point b)

void three_point_circle(point p1,point p2,point p3)

int main()}}

}}

}printf("%.2f %.2f %.2f\n",o.x,o.y,ri);

}return 0;

}

#include#include#includeusing namespace std;

const int maxn=100;

const double eps=1e-6;

struct node

}p[maxn];

double dis(node a,node b)

int n;

double hillclimb(node start)

}double r=dis(start,p[d]);

ans=min(ans,r);

start.x+=(p[d].x-start.x)/r*delta;

start.y+=(p[d].y-start.y)/r*delta;

start.z+=(p[d].z-start.z)/r*delta;

delta*=0.98;

}return ans;}

int main()

printf("%.5f\n",hillclimb(node(0,0,0)));

}return 0;

}

#include#include#includeusing namespace std;

const int maxn=1e3+10;

const double eps=1e-10;

int sign(double x)

struct point

point operator - (point &p)

};typedef point vector;

double cross(vector a,vector b)

struct line

line(point s,point e):s(s),e(e){}

};point p[maxn];

line l[maxn],que[maxn];

//得到極角角度。

double getangle(vector a)

double getangle(line a)

//排序:極角小的排前面,相同時最左邊排在最後面,以便去重。

bool cmp(line a,line b)

//最後判斷最先加入的直線和最後的直線的影響。

while(tail-head>1&&onright(que[head],que[tail-1],que[tail-2])) tail--;

while(tail-head>1&&onright(que[tail-1],que[head],que[head+1])) head++;

if(tail-head<3) return false;

return true;

//此時佇列裡面是一些逆時針有序的線段。

}int main()

for(int i=0;iif(halfplanentersection(n)) printf("yes\n");

else printf("no\n");

}return 0;

}

計算幾何模板

sgn返回x經過eps處理的符號,負數返回 1,正數返回1,x的絕對值如果足夠小,就返回0。const double eps 1e 8 int sgn double x double mysqrt double x pt是point的縮寫 int版 struct pt pt int x,int y ...

計算幾何模板

include define vct point using namespace std const double pi atan2 0,1 const double eps 1e 8 int sgn double d struct point bool operator point b const...

計算幾何模板

多圓面積交 typedef long long ll typedef unsigned long long ull typedef vector vi const int inf 0x3f3f3f3f const double eps 1e 10 const int mod 100000007 co...