您的位置:首页 > 其它

计算几何入门的几个模板

2017-08-17 16:39 323 查看
//向量常用定义

#include <iostream>

#include <cstdio>

#include <cmath>

using namespace std;

//定义部分

struct point

{

    double x,y;

    point(double x=0,double y=0):x(x),y(y) {} //构造函数方便编写

};

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 p)

{

    return Vector(a.x*p,a.y*p);//重载与数乘法

}

Vector operator/(Vector a,double p)

{

    return Vector(a.x/p,a.y/p);//重载与数除法

}

bool operator < (const point&a,const point&b)

{

    return a.x<b.x||(a.x==b.x&&a.y<b.y);//重载小于号表示在点的左边

}

const double eps=1e-10;

int dcmp(double x)

{

    if(fabs(x)<eps) return 0;

    else return x<0?-1:1;

}

bool operator == (const point &a,const point &b)

{

    return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;//重载等于

}

//计算部分

double dot(Vector a,Vector b){return a.x*b.x+a.y*b.y;}//定义点乘

double lenth(Vector a){return sqrt(dot(a,a));}//定义向量膜长

double angle(Vector a,Vector b) {return acos(dot(a,b)/lenth(a)/lenth(b));}//定义计算两向量夹角

double cross(Vector a,Vector b) {return a.x*b.y-a.y*b.x;}//定义叉积

double area2(point a,point b,point c){return cross(b-a,c-a);}//通过叉积已知三个点计算面积(此处为两倍)

Vector Rotate(Vector a,double rad)

{

    return Vector(a.x*cos(rad)-a.y*sin(rad),a.x*sin(rad)+a.y*cos(rad));//向量旋转

}

Vector normal(Vector a)

{

    double l=lenth(a);

    return Vector(-a.y/l,a.x/l);//计算单位法向量(左转90度)

}

int main()

{

    //Vector a(1,0),b(0,1),c(0,0),d;

    //double c= angle(a,b);

    //d=Rotate(a,3.1415926);

    //cout <<d.x<<"   "<<d.y<< endl;

    return 0;

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