目錄
二維計算幾何:
二維基本操作
最小圓覆蓋:
最小球覆蓋:
半平面交
(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...