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++的书吗?