我写的判断圆和矩形详细位置的函数

/*判断圆与长方形的关系,一共四种关系:圆与长方形不包含也不相交,返回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;
 
 }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
判断一个半矩形是否有重叠部分,可以通过以下步骤进行: 1. 确定半矩形位置关系,即判断心是否在矩形内部或边界上。 2. 如果半心在矩形内部,则一定有重叠部分。 3. 如果半心在矩形边界上,则需要进一步判断的直径是否与矩形相交。 4. 如果半的直径与矩形相交,则一定有重叠部分。 下面是一个判断矩形是否有重叠部分的 C# 代码示例: ```csharp public bool IsOverlap(Rectangle rect, Point center, int radius) { // 判断心是否在矩形内部或边界上 if (center.X < rect.Left || center.X > rect.Right || center.Y < rect.Top || center.Y > rect.Bottom) { // 半心不在矩形内部或边界上,一定没有重叠部分 return false; } // 判断的直径是否与矩形相交 int diameter = radius * 2; int left = Math.Max(rect.Left, center.X - radius); int right = Math.Min(rect.Right, center.X + radius); int top = Math.Max(rect.Top, center.Y - radius); int bottom = Math.Min(rect.Bottom, center.Y + radius); int dx = center.X - left; int dy = center.Y - top; if (dx * dx + dy * dy <= radius * radius) { // 半的左端点在矩形内部或边界上 return true; } dx = center.X - right; dy = center.Y - top; if (dx * dx + dy * dy <= radius * radius) { // 半的右端点在矩形内部或边界上 return true; } dx = center.X - left; dy = center.Y - bottom; if (dx * dx + dy * dy <= radius * radius) { // 半的下端点在矩形内部或边界上 return true; } dx = center.X - right; dy = center.Y - bottom; if (dx * dx + dy * dy <= radius * radius) { // 半的上端点在矩形内部或边界上 return true; } return false; } ``` 其中,`Rectangle` 表示矩形,`Point` 表示半心,`radius` 表示半径。函数返回布尔值,表示半矩形是否有重叠部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值