RSS发布话题

矩形相交_相关算法

acmer

acmer发表于78天 14小时 40分钟前
来源:www.608088.com  标签:算法

Google
如何判断两个矩形是否相交???
--------------------------------------------------------------------------------
假定矩形是用一对点表达的(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.
免责声明:本站部分文章来源于网络等其它媒体,如果侵犯了原作者的版权,请联系我们,本站将立即删除。

关注用户

    最近还没有登录用户关注过这篇文章…
暂无评论
共有 0 位网友发表了评论

评论


google 提供的广告

本周热门评论

google 提供的广告