如何判断两个矩形是否相交??? --------------------------------------------------------------------------------
假定矩形是用一对点表达的(minx,miny)(maxx, maxy)
那么两个矩形rect1{(minx1,miny1)(maxx1, maxy1)}, rect2{(minx2,miny2)(maxx2, maxy2)} [/font]
相交的结果一定是个矩形,构成这个相交矩形rect{(minx,miny)(maxx, maxy)}的点对坐标是:
minx = max(minx1, minx2)
miny = max(miny1, miny2)
maxx = min(maxx1, maxx2)
maxy = min(maxy1, maxy2) 如果两个矩形不相交,那么计算得到的点对坐标必然满足
minx > maxx
或者
miny > maxy 判定是否相交,以及相交矩形是什么都可以用这个方法一体计算完成 --------------------------------------------------------------------------------晕,这个问题也值50分。。。
你只要判断一个矩形的x/y的最小值是否大于另一个的最大值即可。================================================================================================================
#include
struct RECT
{
int X1;
int Y1;
int X2;
int Y2;
RECT(int x1,int y1,int x2,int y2)
{
X1 = x1;
Y1 = y1;
X2 = x2;
Y2 = y2;
}
};
RECT* f(RECT& rect1,RECT& rect2)
{
if(((rect1.X1<=rect2.X1&& rect1.X2>=rect2.X1) && (rect1.Y1>=rect2.Y1&& rect1.Y2<=rect2.Y1)) ||
((rect2.X1<=rect1.X1 && rect2.X2>=rect1.X1) && (rect2.Y1>=rect1.Y1 && rect2.Y2<=rect1.Y1)))
{
RECT* rect = new RECT(
rect1.X1
rect1.Y1>rect2.Y1?rect2.Y1:rect1.Y1,
rect1.X2
rect1.Y2>rect2.Y2?rect1.Y2:rect2.Y2
);
return rect;
}
else
return NULL;
}
int main ()
{
RECT rect1(1,4,4,2);
RECT rect2(2,3,4,1);
RECT* rect = f(rect1,rect2);
if(rect == NULL)
printf("NO");
else
printf("x1:%d y1:%d X2:%d y2:%d\n",rect->X1,rect->Y1,rect->X2,rect->Y2);
delete rect;
system("pause");
return 0;
}
============================================================================
#define min(a,b) ((a
#define max(a,b) ((a
bool sc(double xa1, double ya1, double xa2, double ya2,double xb1, double yb1, double xb2,
double yb2, double &xc, double &yc)
{//这个函数输入两线断端点,返回交点坐标 xc,yc
if(xa1==xa2)
{
if(xb1==xb2)return false;
xc=xa1;
yc=(xc*yb1+xb2*yb1-xc*yb2-xb1*yb2)/(xb1-xb2);
return true;
}
if(xb1==xb2)
{
if(xa1==xa2) return false;
xc=xb1;
yc=(xc*ya1+xa2*ya1-xc*ya2-xa1*ya2)/(xa1-xa2);
return true;
}
xc=(xb2*(ya1-ya2)+xb1*(ya2-ya1)+(xa1-xa2)*(yb1-yb2));
if (xc == 0)return false;
xc=(xa2*(xb2*(yb1-ya1)+xb1*(ya1-yb2))+xa1*(xb2*(ya2-yb1)+xb1*(yb2-ya2)))/xc;
yc=(xb2*(ya1-ya2)+xb1*(ya2-ya1)+(xa1-xa2)*(yb1-yb2));
if (yc == 0)return false;
yc=(xb2*(ya2-ya1)*yb1-xa1*ya2*yb1+xa2*ya1*(yb1-yb2)+xb1*ya1*yb2+xa1*ya2*yb2-xb1*ya2*yb2)/yc;
return true;
}
void a()
{
double rx1,rx2,rx3,rx4;//矩形坐标
double ry1,ry2,ry3,ry4;//矩形坐标
double lx1,lx2;//直线坐标
double ly1,ly2;
double jx,jy;
if(sc(rx1,ry1,rx2,ry2,lx1,ly1,lx2,ly2,jx,jy))//找第一条线断和直线的交点
{
if(jx>= min(rx1,rx2) && jx<=max(rx2,rx1) && jy>=min(ry1,ry2) && jy<=max(ry1,ry2)) //看看交点在不在线段内
{
// 保存交点
}
}
if(sc(rx2,ry2,rx3,ry3,lx1,ly1,lx2,ly2,jx,jy))//找第2条线断和直线的交点
{
if(jx>= min(rx1,rx2) && jx<=max(rx2,rx1) && jy>=min(ry1,ry2) && jy<=max(ry1,ry2)) //看看交点在不在线段内
{
// 保存交点
}
}
if(sc(rx3,ry3,rx4,ry4,lx1,ly1,lx2,ly2,jx,jy))//找第3条线断和直线的交点
{
if(jx>= min(rx1,rx2) && jx<=max(rx2,rx1) && jy>=min(ry1,ry2) && jy<=max(ry1,ry2)) //看看交点在不在线段内
{
// 保存交点
}
}
if(sc(rx3,ry3,rx1,ry1,lx1,ly1,lx2,ly2,jx,jy))//找第4条线断和直线的交点
{
if(jx>= min(rx1,rx2) && jx<=max(rx2,rx1) && jy>=min(ry1,ry2) && jy<=max(ry1,ry2)) //看看交点在不在线段内
{
// 保存交点
}
}
// .......
}
int main(int argc, char* argv[])
{
printf("Hello World!\n");
return 0;
}
Disclaimer: some contents on this website are collected through internet etc. Please notify if violated the original author's copyright and we will delete it immediately.
免责声明:本站部分文章来源于网络等其它媒体,如果侵犯了原作者的版权,请联系我们,本站将立即删除。
评论