计算几何

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const double eps=1e-6;
int dcmp(double a)
{
    if(fabs(a)<=eps)return 0;
    else return a>0?1:-1;
}
struct Vector
{
    double x,y;
    Vector operator +(const Vector &a)const{return (Vector){x+a.x,y+a.y};}
    Vector operator -(const Vector &a)const{return (Vector){x-a.x,y-a.y};}
    Vector operator *(const double &a)const{return (Vector){x*a,y*a};}
    Vector operator /(const double &a)const{return (Vector){x/a,y/a};}
};
double dot(Vector a,Vector b){return a.x*b.x+a.y*b.y;}
double Length(Vector a){return sqrt(dot(a,a));}
double Angle(Vector a,Vector b){return acos(dot(a,b)/Length(a)/Length(b));}
double Xmult(Vector a,Vector b){return a.x*b.y-b.x*a.y;}
double Area(Vector a,Vector b,Vector c){return Xmult(b-a,c-a);}
int Intersec(Vector a,Vector b,Vector c,Vector d)
{
    if(max(a.x,b.x)<min(c.x,d.x))return false;
    if(max(a.y,b.y)<min(c.y,d.y))return false;    
    if(max(c.x,d.x)<min(a.x,b.x))return false;
    if(max(c.y,d.y)<min(a.y,b.y))return false;
    if(Area(c,b,a)*Area(b,d,a)<0)return false;
    if(Area(a,d,c)*Area(d,b,c)<0)return false;
    return true;
}
Vector Interpoint(Vector a,Vector b,Vector c,Vector d)
{
    Vector u=a-c;
    double t=Xmult(d,u)/Xmult(b,d);
    return a+v*t;
}
double Distoline(Vector p,Vector a,Vector b)
{
    Vector v1=b-a,v2=p-a;
    return fabs(Xmult(v1,v2)/Length(v1));
}
int Onseg(Vector p,Vector a,Vector b){return dcmp(Xmult(a-p,b-p))==0 && dcmp(dot(a-p,b-p))<0;}
int main()
{
    
}
View Code

计算几何常用模板 码着

posted @ 2017-11-29 15:47  探险家Mr.H  阅读(148)  评论(0编辑  收藏  举报