您的位置:首页 > 其它

【模板整合】【及时更新】【天坑】计算几何模板

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()
{

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: