首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

矩形跟圆碰撞_方法

2012-12-26 
矩形和圆碰撞_方法/*判断圆与长方形的关系,一共四种关系:圆与长方形不包含也不相交,返回1;相交返回2 ; 圆

矩形和圆碰撞_方法

/*判断圆与长方形的关系,一共四种关系:圆与长方形不包含也不相交,返回1;相交返回2 ; 圆在长方形内部返回3;长方形在圆内部返回4*///假定矩形由d1,d2,d3,d4顶点按顺时针方向组成,ywz为圆心位置,yzj为圆直径。  int Y_ZFX_WZ(D3DXVECTOR2 &ywz,float &yzj,D3DXVECTOR2 &d1,D3DXVECTOR2 &d2,D3DXVECTOR2 &d3,D3DXVECTOR2 &d4) {  /*1、根据圆的方程和长方形的边直线方程,计算交点,如果存在一交点,且在长方形边的线段上,则返回相交2*/  float k,k1,k2;  k=4*pow((d2.x-d1.x)*(d2.x-ywz.x)+(d2.y-d1.y)*(d2.y-ywz.y),2)-4*(pow(d2.x-d1.x,2)+pow(d2.y-d1.y,2))*(pow(d1.x-ywz.x,2)+pow(d1.y-ywz.y,2)-pow(yzj,2));      //如果有在d2-d1确定的直线上有交点  if (k>=0)    {  k1=(-2*(d2.x-d1.x)*(d2.x-ywz.x)-2*(d2.y-d1.y)*(d2.y-ywz.y)+sqrt(k))/(2*(pow(d2.x-d1.x,2)+pow(d2.y-d1.y,2)));  k2=(-2*(d2.x-d1.x)*(d2.x-ywz.x)-2*(d2.y-d1.y)*(d2.y-ywz.y)-sqrt(k))/(2*(pow(d2.x-d1.x,2)+pow(d2.y-d1.y,2)));      /*如果在d2-d1线段上有交点,返回2*/  if ((k1>0)&&(k1<1)) return 2;     if ((k2>0)&&(k2<1)) return 2;  }  k=4*pow((d3.x-d2.x)*(d3.x-ywz.x)+(d3.y-d2.y)*(d3.y-ywz.y),2)-4*(pow(d3.x-d2.x,2)+pow(d3.y-d2.y,2))*(pow(d2.x-ywz.x,2)+pow(d2.y-ywz.y,2)-pow(yzj,2));     //如果有在d3-d2确定的直线上有交点  if (k>=0)  {  k1=(-2*(d3.x-d2.x)*(d3.x-ywz.x)-2*(d3.y-d2.y)*(d3.y-ywz.y)+sqrt(k))/(2*(pow(d3.x-d2.x,2)+pow(d3.y-d2.y,2)));  k2=(-2*(d3.x-d2.x)*(d3.x-ywz.x)-2*(d3.y-d2.y)*(d3.y-ywz.y)-sqrt(k))/(2*(pow(d3.x-d2.x,2)+pow(d3.y-d2.y,2)));     /*如果在d3-d2线段上有交点,返回2*/  if ((k1>0)&&(k1<1)) return 2;  if ((k2>0)&&(k2<1)) return 2;  }  k=4*pow((d4.x-d3.x)*(d4.x-ywz.x)+(d4.y-d3.y)*(d4.y-ywz.y),2)-4*(pow(d4.x-d3.x,2)+pow(d4.y-d3.y,2))*(pow(d3.x-ywz.x,2)+pow(d3.y-ywz.y,2)-pow(yzj,2));     //如果有在d4-d3确定的直线上有交点  if (k>=0)  {  k1=(-2*(d4.x-d3.x)*(d4.x-ywz.x)-2*(d4.y-d3.y)*(d4.y-ywz.y)+sqrt(k))/(2*(pow(d4.x-d3.x,2)+pow(d4.y-d3.y,2)));  k2=(-2*(d4.x-d3.x)*(d4.x-ywz.x)-2*(d4.y-d3.y)*(d4.y-ywz.y)-sqrt(k))/(2*(pow(d4.x-d3.x,2)+pow(d3.y-d3.y,2)));  /*如果在d4-d3线段上有交点,返回2*/  if ((k1>0)&&(k1<1)) return 2;  if ((k2>0)&&(k2<1)) return 2;  }  k=4*pow((d1.x-d4.x)*(d1.x-ywz.x)+(d1.y-d4.y)*(d1.y-ywz.y),2)-4*(pow(d1.x-d4.x,2)+pow(d1.y-d4.y,2))*(pow(d4.x-ywz.x,2)+pow(d4.y-ywz.y,2)-pow(yzj,2));     //如果有在d1-d4确定的直线上有交点     if (k>=0)  {  k1=(-2*(d1.x-d4.x)*(d1.x-ywz.x)-2*(d1.y-d4.y)*(d1.y-ywz.y)+sqrt(k))/(2*(pow(d1.x-d4.x,2)+pow(d1.y-d4.y,2)));  k2=(-2*(d1.x-d4.x)*(d1.x-ywz.x)-2*(d1.y-d4.y)*(d1.y-ywz.y)-sqrt(k))/(2*(pow(d1.x-d4.x,2)+pow(d1.y-d4.y,2)));     /*如果在d1-d4线段上有交点,返回2*/  if ((k1>0)&&(k1<1)) return 2;  if ((k2>0)&&(k2<1)) return 2;  }      /* 2、计算圆心点与四边线段的距离,根据正负距离判断*/      D3DXVECTOR2 ls;  float z,l1,l2,l3,l4;//l1,l2,l3,l4为记录圆心点与四边的距离,在边法向量正侧为正,反之为负  ls=d2-d1;  z=ls.x;ls.x=ls.y;ls.y=-z;    D3DXVec2Normalize(&ls,&ls);//第一个边的法向量  l1= ls.x*(ywz.x-d1.x)+ls.y*(ywz.y-d1.y); //圆心与d2-d1边的距离  l2= ls.y*(ywz.x-d2.x)-ls.x*(ywz.y-d2.y); //圆心与d3-d2边的距离  l3= -ls.x*(ywz.x-d3.x)-ls.y*(ywz.y-d3.y); // 圆心与d4-d3边的距离  l4= -ls.y*(ywz.x-d4.x)+ls.x*(ywz.y-d4.y); //圆心与d1-d4边的距离   if ((l1>=yzj)&&(l2>=yzj)&&(l3>=yzj)&&(l4>=yzj))    return 3; //圆在长方形内部,也就是长方形包含圆  //3、如果矩形四个顶点都在圆内,则返回4  if ((pow(d1.x-ywz.x,2)+pow(d1.y-ywz.y,2)<=yzj*yzj)&&(pow(d2.x-ywz.x,2)+pow(d2.y-ywz.y,2)<=yzj*yzj)&&(pow(d3.x-ywz.x,2)+pow(d3.y-ywz.y,2)<=yzj*yzj)&&(pow(d4.x-ywz.x,2)+pow(d4.y-ywz.y,2)<=yzj*yzj))  return 4;      //4、必定剩余第一种情况,圆与正方形不相交,也不包含  return 1;    }

热点排行