计算几何模板

来源:互联网 发布:mac quick time 编辑:程序博客网 时间:2024/06/16 13:17


struct point{//点类  double x,y;  point (double i,double j){x=i;y=j;}//普通构造函数  point (const point& p){x=p.x;y=p.y;}//拷贝构造函数  point& operator = (const point& p){//重载=    x=p.x;y=p.y;    return *this;  }  point operator - (const point& p){//重载-,b-a => b.-(a) 即线段abreturn point (p.x-x,p.y-y);  }  point operator + (const point& p){//重载+,计算中点return point ((p.x+x)/2,(p.y+y)/2);  }  point (){}};struct segment{//线段类  point left,right;  segment (point a,point b){left=a;right=b;}  segment (){}};double CrossMuti (point a,point b){return a.x*b.y-a.y*b.x;}//叉积/***判断两个线段是否相交,参数为4个端点**0-不相交  1-正常相交  2-端点在线段上  3-重合*/int ab_cross_cd (point a,point b,point c,point d){  if(min_2(a.x,b.x)>max_2(c.x,d.x)||min_2(a.y,b.y)>max_2(c.y,d.y)||     max_2(a.x,b.x)<min_2(c.x,d.x)||max_2(a.y,b.y)<min_2(c.y,d.y) ) return 0;  point abVec=b-a,acVec=c-a,adVec=d-a;  double x = CrossMuti (abVec,acVec);  double y = CrossMuti (abVec,adVec);  if(x==0.0&&y==0.0)//重合    return 3;  else if (x==y)    return 0;//不相交  else{    point cdVec=d-c,caVec=a-c,cbVec=b-c;    x*=y;    y=CrossMuti (cdVec,caVec)*CrossMuti (cdVec,cbVec);    if (x<0 && y<0) return 1;    else if ((x==0&&y<=0)||(y==0&&x<=0)) return 2;    else return 0;  }}


0 0
原创粉丝点击