文章标题 计算几何
2017-10-25 18:44
429 查看
#include<iostream> #include<string> #include<cstdio> #include<cstring> #include<vector> #include<math.h> #include<map> #include<queue> #include<algorithm> using namespace std; const double pi=acos(-1.0); const int inf = 0x3f3f3f3f; const int maxn=100005; const double eps=1e-8; //精度函数 int sgn(double x){ if (fabs(x)<eps)return 0; if (x<0) return -1; return 1; } struct point { double x,y; point (double a=0,double b=0){ x=a;y=b; } bool operator <(const point &t){ return (x<t.x)||(x==t.x&&y<t.y); } //相减 point operator - (const point &b)const { return point(x-b.x,y-b.y); } //叉积 double operator ^ (const point &b)const{ return x*b.y-y*b.x; } //点积 double operator * (const point &b) const { return x*b.x+y*b.y; } //绕原点旋转角度B(弧度值),后x,y的变化 ,返回点 point transXY(double B){ double tx=x,ty=y; x = tx*cos(B) - ty*sin(B); y = tx*sin(B) + ty*cos(B); return point(x,y); } }; struct line{ point s,e; line(){} line (point x,point y){ s=x,e=y; } //两直线相交求交点 //第一个值为0表示直线重合,为1表示平行,为0表示相交,为2是相交 //只有第一个值为2时,交点才有意义 pair<int,point> operator &(const line &b)const{ point res = s; if(sgn((s-e)^(b.s-b.e)) == 0){ if(sgn((s-b.e)^(b.s-b.e)) == 0)return make_pair(0,res);//重合 else return make_pair(1,res);//平行 } double t = ((s-b.s)^(b.s-b.e))/((s-e)^(b.s-b.e)); res.x += (e.x-s.x)*t; res.y += (e.y-s.y)*t; return make_pair(2,res); } }; //计算多边形面积 //点的编号从0~n-1 double calArea(point P[],int len){ double ans=0; for (int i=0;i<len;i++){ ans+=(P[i]^P[(i+1)%len])/2; } return fabs(ans); } //*判断线段相交 bool inter(line l1,line l2){ return max(l1.s.x,l1.e.x)>=min(l2.s.x,l2.e.x)&& max(l2.s.x,l2.e.x)>=min(l1.s.x,l1.e.x)&& max(l1.s.y,l1.e.y)>=min(l2.s.y,l2.e.y)&& max(l2.s.y,l2.e.y)>=min(l1.s.y,l1.e.y)&& sgn((l2.s-l1.e)^(l1.s-l1.e))*sgn((l2.e-l1.e)^(l1.s-l1.e))<=0&& sgn((l1.s-l2.e)^(l2.s-l2.e))*sgn((l1.e-l2.e)^(l2.s-l2.e))<=0; } //求凸包 /* 计算凸包,输入点数组p,个数为n,输出点数组ch,函数返回凸包定点的数 输入不能有重复点。函数执行完之后输入点的顺序被破坏 如果不希望在凸包的边上有输出点,把两个<=改成< 在精度也要求高时建议用sgn比较 */ int convexHull(point p[],int n,point ch[]){ sort(p,p+n); int m=0; for (int i=0;i<n;i++){ while (m>1&&(sgn(point(ch[m-1]-ch[m-2])^point(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&&(sgn(point(ch[m-1]-ch[m-2])^point(p[i]-ch[m-2])))<=0)m--; ch[m++]=p[i]; } if (n>1)m--; return m; } //二分判断点A是否在凸包边界上和内部里面 ,ch表示凸包数组 bool check(point A,int n){ int l=1,r=n-2; while (l<=r){ int mid=(r+l)/2; double a1=(ch[mid]-ch[0])^(A-ch[0]); double a2=(ch[mid+1]-p[0]^(A-ch[0])); if (sgn(a1)>=0&&sgn(a2)<=0){ if (sgn((ch[mid+1]-ch[mid])^(A-ch[mid]))>=0)return true; return false; } if (a1<0)r=mid-1; else l=mid+1; } return false; } int main() { return 0; }
相关文章推荐
- 文章标题 POJ 2318 : TOYS (计算几何)
- 文章标题:计算s=1+12+123+1234...
- 文章标题编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。
- 文章标题 并行计算 -- OpenMP简介和计算实例 (计算pi)
- 文章标题 汇编 计算 Fibonacci 数(20~30)
- java文章标题及文章相似度计算hash算法实现
- 文章标题
- 计算几何模板
- 3.第二单元任务五实训:通过程序设计几何图形接口(Shape),实现类矩形(Rectangle)、圆形(Circle)、正方形(Square)几种类型,能够利用接口和多态性计算几何图形的面积和周长并显
- POJ2398 计算几何外积+二分
- 文章标题
- 文章标题
- 文章标题
- POJ 2318 TOYS 计算几何 入门题 叉积 + 二分
- 文章标题 coderforces 339D : Xenia and Bit Operations (线段树+点修改)
- 文章标题
- 【计算几何初步-判断是否凸多边形】【HDU2108】Shape of HDU
- XMOJ 1133: 膜拜大牛 计算几何/两圆相交
- 文章标题 关于MySQL卸载几点注意事项
- 文章标题