计算几何的基本代码模板
来源:互联网 发布:js radio 多选 编辑:程序博客网 时间:2024/05/19 02:44
代码来自刘汝佳的训练指南
计算π值
const double PI=acos(-1);
角度化弧度
double torad(double deg){ return deg/180*PI;}
坐标点和运算
struct Point{ double x,y; Point(double x=0,double y=0):x(x),y(y){}};bool operator < (const Point &a,const Point &b)//排序用,按照x的坐标从小到大,如果x相同,那么按照y从小到大{ return a.x<b.x||(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,Vector B){return Vector(A.x-B.x,A.y-B.y);}//相减
三态函数,用来减少精度问题
int dcmp(double x){ if(fabs(x)<eps) return 0; else return x<0?-1:1;}
点积
double Dot(Vector A,Vector B) {return A.x*B.x+A.y*B.y;}
叉积
#define Vector Pointdouble Cross(Vector A,Vector B){ return A.x*B.y-A.y*B.x;}
andrew算法 求凸包
int ConvexHull(Point *p,int n,Point *ch)//p是所有点,n所有点的个数,ch里面记录形成凸包的点,返回凸包点的个数{ sort(p,p+n); int m=0; for(int i=0;i<n;i++) { while(m>1&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0) m--; ch[m++]=p[i]; } int k=m; for(int i=n-2;i>=0;i--) { while(m>k&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0) m--; ch[m++]=p[i]; } if(n>1) m--; return m;}
某点绕着原点逆时针旋转
#define Vector PointVector Rotate(Vector A,double rad)//旋转{ return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad));}
计算多边形有向面积
double PolyonArea(Point* p,int n)//多边形面积{ double area=0; for(int i=1;i<n-1;i++) area+=Cross(p[i]-p[0],p[i+1]-p[0]); return area/2;}
判断点是否在直线上面
bool OnSegment(Point p,Point a1,Point a2){ return dcmp(Cross(a1-p,a2-p))==0&&dcmp(Dot(a1-p,a2-p))<0;}
判断点是否在多边形内部
int isPointInPolygon(Point p,Point *ch,int n){ int wn=0; for(int i=0;i<n;i++) { if(OnSegment(p,ch[i],ch[(i+1)%n]))return -1; int k=dcmp(Cross(ch[(i+1)%n]-ch[i],p-ch[i])); int d1=dcmp(ch[i].y-p.y); int d2=dcmp(ch[(i+1)%n].y-p.y); if(k>0&&d1<=0&&d2>0) wn++; if(k<0&&d2<=0&&d1>0) wn--; } if(wn!=0) return 1; return 0;}
线段是否相交(不考虑端点的情况)
bool SegmentProperIntersection(Point a1,Point a2,Point b1,Point b2){ 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;}
to be continue~
0 0
- 计算几何的基本代码模板
- 计算几何基本模板
- 【原创】计算几何的基本模板
- 计算几何的模板
- 基本的计算几何
- 计算几何的一些模板
- 计算几何的基本应用~~~~
- [模板]计算几何模板
- 计算几何的一些代码。。。
- 求凸包的周长(计算几何模板)
- 计算几何的模板(大神整理)
- 计算几何:非规范相交的模板
- 计算几何:点积的模板
- 计算几何入门的几个模板
- 浅谈计算几何的模板集合
- <模板><计算几何>凸包及其基本算法
- 经典计算几何模板
- 计算几何模板2
- PAT-A 1006. Sign In and Sign Out
- 二叉查找树BST总结
- MyEclipse部署/启动服务报错 'update progress' has encountered aproblem.An tinernal error has occurred
- JS内置对象
- CArray Class
- 计算几何的基本代码模板
- H264的I帧的判断
- 线性筛法求素数表
- win、mac、ubuntu下安装安卓开发环境
- PAT-A 1007. Maximum Subsequence Sum
- 极光推送
- Spacemas的Dotfile配置
- 桶排序
- NYOJ水题题解-63小猴子下落(memset,三目运算符,左移运算符 )