【模板整合】【及时更新】【天坑】计算几何模板
2015-08-25 10:55
447 查看
计算几何模板要写的内容真多…
我写烦了…先写这些放上来吧…
我写烦了…先写这些放上来吧…
[code]#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #define MAXDBL 1e20 #define eps 1e-9 #define pi acos(-1) using namespace std; struct point { double x,y; point(double _x=0,double _y=0): x(_x),y(_y){} bool operator <(const point& a)const { return x==a.x?y<a.y:x<a.x; } }; typedef point Vector; Vector operator +(Vector A,Vector B)//向量加减乘除 { return Vector(A.x+B.x,A.y+B.y); } Vector operator -(Vector A,Vector B) { return Vector(A.x-B.x,A.y-B.y); } Vector operator *(Vector A,double k) { return Vector(A.x*k,A.y*k); } Vector operator /(Vector A,double k) { return Vector(A.x/k,A.y/k); } bool operator ==(Vector A,Vector B) { return fabs(A.x-B.x)<eps&&fabs(A.y-B.y)<eps; } double sqr(double x) { return x*x; } double dis(point a,point b)//点距离 { return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y)); } point point_sym(point A,point B)//A关于B的对称点 { return point(2*B.x-A.x,2*B.y-A.y); } double dot(Vector a,Vector b)//向量点积 { return a.x*b.x+a.y*b.y; } double cross(Vector a,Vector b)//叉积 { return a.x*b.y-a.y*b.x; } double Area(point a,point b,point c)//面积 { Vector A=b-a,B=b-c; return fabs(cross(A,B))/2; } double len(Vector A)//向量长度 { return sqrt(sqr(A.x)+sqr(A.y)); } double angle(Vector A,Vector B)//求夹角 { return acos(dot(A,B)/len(A)/len(B)); } Vector rot(Vector A,double rad)//向量逆时针旋转rad弧度 { return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad)); } Vector normal(Vector A)//逆时针旋转90度的单位向量 { double l=len(A); return Vector(-A.y/l,A.x/l); } Vector unit(Vector A)//基于原向量的单位向量 { double l=len(A); return A/l; } struct line { point p;Vector v;//直线经过的点和直线的方向向量 line(point _p=point(0,0),Vector _v=Vector(0,0)): p(_p),v(_v){} }; bool on_left(line l,point p)//点在直线左边/右边 { return cross(l.v,p-l.p)>0; } point line_cross(line a,line b)//直线交点 { Vector u=A.p-B.p; double t=Cross(B.v,u)/Cross(A.v,B.v); return A.p+A.v*t; }; double dis_point_line(point A,line B)//点到直线距离 { point a=B.p,b=B.p+B.v; Vector u=A-a,v=b-a; return fabs(cross(u,v))/len(v); }; struct circle { point p;double r; circle(point _p,double _r): p(_p),r(_r){} point Point(double rad) { return Point(p.x+r*cos(rad),p.y+r*sin(rad)); } }; vector<point> line_cross_circle(line l,circle c)//直线和圆的交点 { line dia(C.p,normal(l.v)); point inter=line_cross(dia,l); double d=dis_point_line(inter,dia); if (c.r-d<0) return vector<point>(); double Len=sqrt(sqr(c.r)-sqr(d)); vector<point> V; V.push_back(inter-unit(l.v)*Len); V.push_back(inter+unit(l.v)*len); } int convexhull(point *p,int n,point *ch)//求凸包 { sort(p+1,p+n+1); int top=0,tmp; for (int i=1;i<=n;i++) { while (top>1&&cross(ch[top-1]-ch[top-2],p[i]-ch[top-2])<=0) top--; ch[++top]=p[i]; } tmp=top; for (int i=n-1;i>=1;i--) { while (top>tmp&&cross(ch[top-1]-ch[top-2],p[i]-ch[top-2])<=0) top--; ch[++top]=p[i]; } return top; } double ch_area(point *ch,int n)//凸包面积 { double ret=0; for (int i=1;i<n;i++) ret+=Area(ch[1],ch[i],ch[i+1]); return ret; } double ch_cir(point *ch,int n)//凸包周长 { double ret=0; for (int i=1;i<n;i++) ret+=dis(ch[i],ch[i+1]); ret+=dis(ch ,ch[1]); return ret; } int main() { }
相关文章推荐
- 【php】global的使用与php的全局变量
- ASP入门(二十三)- 数据库插入、更新和删除操作
- 【转】使用virtualenv在ubuntu上搭建python 3开发环境
- vector中的元素删除
- android 学习笔记 数据库的创建, 查询 和删除表内的信息
- Spring3.X学习笔记
- HAX is not working and emulator runs in emulation mode
- 机器学习算法与Python实践之(五)k均值聚类(k-means)
- Java IO(一)
- Android View 生命周期函数
- 010_leetcode Container With Most Water
- Appium for windows环境搭建
- ios自定义gridview
- TCP/UDP 协议 简单记录
- Java知识总结---MVC模式解析之MyBatis(四)
- Contest Hunter - OVOO
- Poj 3517 And Then There Was One Joseph核心问题
- git相关的东西
- 静态库和动态库的区别,lib文件和dll文件的配置方法
- PHP static静态局部变量和静态全局变量的特点总结