当前位置:编程学习 > C/C++ >>

C/C++判断两矩形是否相交

typedef struct Rect
{
 int x;  //左上角x坐标
 int y;  //左上角Y坐标
 int h;  //矩形的高
 int w;  //矩形的宽
}RECT;

矩形定义如上,请编写一个函数判断两个矩形是否相交。

函数形式为 BOOL  FUN(矩形1,矩形2)。传入两个矩形,返回是否相交。

我需要完整的代码,可以直接运行的。最好要有注释。

我最终目的是做游戏物体碰撞检测。

补充:谢谢大家的帮忙...可能是我描述得不够详细.一二楼修改后的答案,仍然满足不了我的需求,代入数据测试部分用例能通过,但不是所有.二楼的方法比较容易理解,但好象有些判断多余了??我修改一下,部分代码如下:

//输入两个矩形,返回是否碰撞
BOOL  cross(HUMAN *pHuman,BOX *pBox)
{
 bool b_Result=true;
 //  如果第一个矩形的左边x坐标大于第二个矩形右边的x坐标,或者第一个矩形的右边X坐标小于第二个矩形的左边的X坐标,肯定不相交
 if(pHuman->x >pBox->x + pBox->w || (pHuman->x + pHuman->w<pBox->x))
  b_Result=false;
 //  如果第一个矩形的底边y坐标<第二个矩形顶边的y坐标,或者第一个矩形的顶部Y坐标>第二个矩形的底部Y坐标, 肯定不相交
 if( pHuman->y+pHuman->h <pBox->y ||   ( pHuman->y > pBox->y + pBox->h))
  b_Result=false;
 // 其它情况,均会相交
 return b_Result;

}

我的测试都能通过....

大家看下有没有问题,或者有没有更好的答案提供一下..

追问:代入 

RECT rect1 = {100,100,50,50};
 RECT rect2 = {148,172,74,60};

理应不相交,但实际输出却相交了...

答案:这个函数比较好理解。看看

 

#include<iostream>
using namespace std;

 

typedef struct Rect
{
 int x;  //左上角x坐标
 int y;  //左上角Y坐标
 int h;  //矩形的高
 int w;  //矩形的宽
}RECT;

 

bool FUN(RECT rcSour, RECT rcDest)
{
 bool b_Result=true;
 //  如果第一个矩形的左边x坐标大于第二个矩形右边的x坐标,肯定不相交
 if(rcSour.x>(rcDest.x + rcDest.w) && (rcSour.x + rcSour.w)>rcDest.x)
  b_Result=false;
 //  如果第一个矩形的右边x坐标小于第二个矩形左边的x坐标,肯定不相交
 if(rcSour.x<(rcDest.x + rcDest.w) && (rcSour.x + rcSour.w)<rcDest.x)
  b_Result=false;
 //  如果第一个矩形的底边y坐标大于第二个矩形顶边的y坐标,肯定不相交
 if(rcSour.y>(rcDest.y - rcDest.h) && (rcSour.y - rcSour.h)>rcDest.y)
  b_Result=false;
 //  如果第一个矩形的顶边y坐标小于第二个矩形底边的y坐标,肯定不相交
 if(rcSour.y<(rcDest.y - rcDest.h) && (rcSour.y - rcSour.h)<rcDest.y)
  b_Result=false;
 // 其它情况,均会相交
 return b_Result;
}


int main()
{
 RECT rect1 = {5,5,3,3};
 RECT rect2 = {1,4,6,6};
    if (FUN(rect1,rect2))
    {
  cout<<"相交"<<endl;
    }
 else
 {
  cout<<"不相交"<<endl;
 }
    return 0;
}

BOOL  FUN(RECT &rt,RECT &rc)
{
 if((abs( rt.x - rc.x  ) > (rt.w + rt.w) / 2) ||
 (abs( rt.y - rc.y  ) > (rt.h + rt.h) / 2))

 return FALSE;
 else
  return TRUE;
}

你可以判断他俩的很坐标之差 大于 h1/2 + h2/2

或者纵坐标之差                       大于 w2/2 +w2/2

就不想交

#include<stdio.h>
//根据下面的数据结构,可以确定的矩形的边必与坐标轴平行
typedef struct Rect
{
 int x;  //左上角x坐标
 int y;  //左上角Y坐标
 int h;  //矩形的高
 int w;  //矩形的宽
}rect;

int jugdeonepoint(int pointx,int pointy,rect k)
 {
  if(pointx>=k.x&&pointx<=k.x+k.w&&pointy<=k.y&&pointy>=k.y-k.h)
   return 1;
  else
   return 0;
 }

 int FUN(rect m,rect n)
 {
  if(jugdeonepoint(n.x,n.y,m)==1)
   return 1;
  else if(jugdeonepoint(n.x+n.w,n.y,m)==1)
   return 1;
  else if(jugdeonepoint(n.x,n.y-n.h,m)==1)
   return 1;
  else if(jugdeonepoint(n.x+n.w,n.y-n.h,m)==1)
   return 1;
  else
   return 0;
}

 void main()
 {
 rect m,n;
 printf("请初始化两个矩形:左上角x坐标,左上角y坐标,矩形的高h,矩形的宽w:\n");
 scanf("%d%d%d%d",&(m.x),&(m.y),&(m.h),&(m.w));
 scanf("%d%d%d%d",&(n.x),&(n.y),&(n.h),&(n.w));
 if(FUN(m,n)==1||FUN(n,m)==1)
  printf("两矩形相交!\n");
    else
  printf("两矩形不相交!\n");
 }

附上结果图:

二楼的朋友从反面考虑,方法很可取

但是有一点,windows下的坐标系(0,0)在屏幕左上角,而不是左下角,所以判断y坐标的时候关系符号改一下方向就可以了

上一个:c++程序题补充 继续输入要手动
下一个:谭浩强写过c++的书吗?

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,