计算几何入门的几个模板
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;
}
#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;
}
相关文章推荐
- POJ 计算几何入门题目推荐
- 计算几何模板补充(三维空间体积、平面、直线、向量相关计算。附上hdu4741,求异面直线的最短距离与交点)
- 计算几何模板(仿照刘汝佳大白书风格)
- 计算几何 模板 (判断点是否在线段上)
- 计算几何入门1--poj1269Intersecting Lines
- 计算几何模板 - 大白书
- 计算几何 - UVA - 12304(附2D计算几何模板)
- 计算几何 模板
- 计算几何模板
- 计算几何-判断两线段是否相交(模板)
- 计算几何入门 6:凸包的构造——Graham Scan算法
- 计算几何之凸包模板
- uva 10652 凸包 + 更新版计算几何模板
- [您有新的未分配科技点]计算几何入门(1):点,向量以及向量的简单应用
- 【计算集合模板+几个典型的题目】2016 湖南acm省赛
- 计算几何模板
- POJ 2318 TOYS(计算几何入门)
- 计算几何模板(入门级)
- 计算几何入门题#1(点,线基本关系,点积叉积的理解)
- 计算几何模板