计算几何模板要写的内容真多…
我写烦了…先写这些放上来吧…
#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[n],ch[1]);
return ret;
}
int main()
{
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/creationaugust/article/details/47973919