计算几何基础 《算法竞赛入门经典》

#include<bits/stdc++.h>
using namespace std;
const int N=1e3;

struct Point{            //定义点
    double x,y;
    Point(double x=0,double y=0):x(x),y(y){}  //构造函数,方便代码编写
};

struct polygon{         //定义多边形
    int n;     //顶点个数
    Point P[N];  //顶点集合 按顺时针或逆时针排列 N为顶点个数上限
};

struct Circle{         //定义圆
    double r;   //半径
    Point o;    //圆心
};

typedef Point Vector; 
//程序上实现向量与点的结构体相同,一组(x,y)可以代表一点点或者一个向量,目前不做严格的区分

//重载实现基本运算
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 B){return Vector(A.x*B,A.y*B);}     //向量乘以一个数
Vector operator / (Vector A,double B){return Vector(A.x/B,A.y/B);}     //向量除以一个数

const double eps=1e-10;
int dcmp(double x){       //判断数的精度
    if(fabs(x)<eps)return 0;
    return (x>0)?1:-1;
}

bool operator == (const Point&a,const Point &b){  //在精度允许的情况下,两点(向量)相等返回true,反之false
    return dcmp(a.x-b.x)==0 && dcmp(a.y-b.y)==0;  
}

/*向量的点积(又叫 标积 / 内积 / 数量积 /),a·b=|a||b|·cosθ  
几何意义:向量a在向量b方向上的投影与向量b的模的乘
坐标公式:A.x*B.x+A.y*B.y;   */
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 cos(Dot(A,B)/Length(A)/Length(B));} //求向量夹角(单位为弧度)

/*向量的叉积(又叫 矢积 / 外积 / 向量积 /),a×b=|a||b|·sinθ
几何意义:垂直a、b所在,向量a,b构成的平行四边形的面积
坐标公式: A.x*B.y-B.x*A.y   */
double Cross(Vector A,Vector B){return A.x*B.y-B.x*A.y;} //向量叉积

/*向量旋转  公式 x=x'*cos(rad)-y'*sin(rad)  y=x'*sin(rad)+y'*cos(rad) rad为要旋转的角度(单位为弧度)*/
Vector Rotate(Vector A,double rad){
    return Vector(A.x*cos(rad)-A.y*sin(rad) , A.x*sin(rad)+A.y*cos(rad));
}

/*计算向量的单位法线 ,左转90度,长度归一*/
Vector Normal(Vector A){
    double L=Length(A);
    return Vector(-A.y/L,A.x/L);
}
int main(){
	return 0;
}

猜你喜欢

转载自blog.csdn.net/love_phoebe/article/details/81120165
今日推荐