计算几何-基本定义(编译通过,性能未测试)
来源:互联网 发布:php制作软件 编辑:程序博客网 时间:2024/05/22 04:30
函数列表如下
小于判定 点A(x1,y1) B(x2,y2) 当x1<x2 ||(x1==x2 && y1<y2) 时 return true;
int dcmp(double x)//判断x是正,负,或者0;
double degtorad(double x)//角度转弧度
double radtodeg(double x)//弧度转角度
double arad1(double x)//将一个弧度角转换到 [0,2pi) 内
double arad2(double x)//将一个弧度角转换到 [-pi,pi) 内
double adeg1(double x)//将一个角度制角转换到 [0,360) 内
double adeg2(double x)//将一个角度制角转换到 [-180,180) 内
double polarangle(Vector a)//极角 以弧度制返回
double dot(Vector A,Vector B)//点积(数量积)
double vlen(Vector A)//矢量长度
double angle(Vector A,Vector B)//两矢量夹角
double cross(Vector A,Vector B)//叉积(失量积)
double area3(point A,point B,point C)//三角形面积(三点式)
double arean(point *p,int n)//n边形面积(注意 ***数组 p 编号 从 0 开始***)
Vector rotate(Vector A,double rad)//矢量旋转 rad是弧度
Vector normal(Vector A)//求单位法向量
//直线的参数方程 : A+(B-A)*t t∈R;射线 t∈ (0,+oo); 线段 t∈(0,1);
point line_line_point(point p,Vector v,point q,Vector w)//求两直线交点 (参数方程传入)
double dis_point_line(point p,point a,point b)//点 p 到直线 ab 的距离
double dis_point_segment(point p,point a,point b)//点 到 线段 最近距离
point point_line_projection(point p,point a,point b)//点 在 直线 的 投影
bool is_segment_intersection(point a1,point a2,point b1,point b2)//判断 是否 两直线(不允许在端点处) 相交;如果相交 返回true;
bool is_on_segment(point p,point a1,point a2)//判断一个点是否在直线上
/*计算几何模板---基本定义*//*0.基本定义*/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);}int dcmp(double x){ if(fabs(x)<eps)return 0; 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 const pi=3.14159265358979323846264;/*end-0*//*基本运算*//*1.角度运算*/double degtorad(double x)//角度转弧度{ return x/180.0*pi;}double radtodeg(double x)//弧度转角度{ return x/pi*180;}double arad1(double x)//将一个弧度角转换到 [0,2pi) 内{ return x-floor(x/2.0/pi)*2*pi;}double arad2(double x)//将一个弧度角转换到 [-pi,pi) 内{ double ang=arad1(x); return ang<pi?ang:ang-2*pi;}double adeg1(double x)//将一个角度制角转换到 [0,360) 内{ return x-floor(x/360.0)*360.0;}double adeg2(double x)//将一个角度制角转换到 [-180,180) 内{ double ang=adeg1(x); return ang<180?ang:ang-360;}double polarangle(Vector a)//极角 以弧度制返回{ return atan2(a.y,a.x);}/*end-1*//*2.数量积*/double dot(Vector A,Vector B){return A.x*B.x+A.y*B.y;}double vlen(Vector A){return sqrt(dot(A,A));}double angle(Vector A,Vector B){return acos(dot(A,B)/vlen(A)/vlen(B));}/*end-2*//*3.矢量积&面积*/double cross(Vector A,Vector B){return A.x*B.y-A.y*B.x;}double area3(point A,point B,point C){return cross(B-A,C-A)/2.0;}//三角形有向面积double arean(point *p,int n)//n边形面积(注意 ***数组 p 编号 从 0 开始***){ double s=0; point p0(0,0); fr(i,0,n-1) s+=cross(p0,p[i]); return s/2;}/*end-3*//*4.矢量旋转*/Vector rotate(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)//求单位法向量{ double l=vlen(A); return Vector(-A.y/l,A.x/l);}/*end-4*//*5.点与直线*///直线的参数方程 : A+(B-A)*t t∈R;射线 t∈ (0,+oo); 线段 t∈(0,1);point line_line_point(point p,Vector v,point q,Vector w)//求两直线交点 (参数方程传入){ Vector u=p-q; double t=cross(w,u)/cross(v,w); return p+v*t;}double dis_point_line(point p,point a,point b)//点 p 到直线 ab 的距离{ Vector v1=b-a,v2=p-a; return fabs(cross(v1,v2))/vlen(v1);}double dis_point_segment(point p,point a,point b)//点 到 线段 最近距离{ if(a==b)return vlen(p-a); Vector v1=b-a,v2=p-a,v3=p-b; if(dcmp(dot(v1,v2))<0)return vlen(v2); else if(dcmp(dot(v1,v3))>0)return vlen(v3); else return fabs(cross(v1,v2))/vlen(v1);}point point_line_projection(point p,point a,point b)//点 在 直线 的 投影{ Vector v=b-a; return a+v*(dot(v,p-a)/dot(v,v));}bool is_segment_intersection(point a1,point a2,point b1,point b2)//判断 是否 两直线(不允许在端点处) 相交;如果相交 返回true;{ double c1=cross(a2-a1,b1-a1),c2=cross(a2-a1,b2-a1),c3=cross(b2-b1,a1-b1),c4=cross(b2-b1,a2-b1); return dcmp(c1)*dcmp(c2)<0&&dcmp(c3)*dcmp(c4)<0;}bool is_on_segment(point p,point a1,point a2)//判断一个点是否在直线上{ return dcmp(cross(a1-p,a2-p))==0&&dcmp(dot(a1-p,a2-p))<0;}/*end-5*/
- 计算几何-基本定义(编译通过,性能未测试)
- 计算几何基本板子(待补)
- 基本的计算几何
- 计算几何基本模板
- 计算几何基本函数
- PAT乙级1007(编译未通过)
- 基准测试的定义(性能测试)
- VS2010编译STLport (未测试)
- 计算几何的基本应用~~~~
- 性能测试定义
- 并行计算性能测试
- POJ2318(计算几何)
- poj1939(计算几何)
- POJ1265Area(计算几何)
- sicily_1012 (计算几何)
- HDU1086(计算几何)
- Intersection (计算几何)
- 计算几何(一)
- Observer(观察者)
- eclipse优化设置(四)
- 浅谈电子信息工程、通信工程、电子科学与技术、信息和电子行业的专业方向和就业前景
- Linked List Cycle II
- java获得当前文件路径
- 计算几何-基本定义(编译通过,性能未测试)
- MFC中修改GroupBox控件的背景色
- Mac之Git/GitHub使用(2)——Create A Repo
- Android学习之path类
- 找到和为sum的两个数(剑指offer41、编程之美2.12)
- Hadoop家族学习路线图
- Settings的数据库中加新的字段
- Python 爬虫把美空的图片都扒下来了
- 快速搭建 Node.js 开发环境以及加速 npm