怎样判断两个矩形是否有交点?(算法的效率一定要考虑)

pengzhenwanli 2003-10-04 09:38:40
如题
...全文
836 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengzhenwanli 2003-10-11
  • 打赏
  • 举报
回复
不论怎样放,相交就行。
边相交也算
justju 2003-10-08
  • 打赏
  • 举报
回复
看四点之差的乘积。
liao2001 2003-10-08
  • 打赏
  • 举报
回复
不过还存在问题,就是矩阵斜着放就不行了
liao2001 2003-10-08
  • 打赏
  • 举报
回复
我的想法和楼上的一样,采用反向思维
hyifeng 2003-10-08
  • 打赏
  • 举报
回复
struct rect {
int top,left,bottom,right;
}

// 数学直角坐标 (top>bottom,right>left)
bool isIntersect(rect r1,rect r2) {
return ! (r1.top < r2.bottom || r1.right < r2.left ||
r1.bottom > r2.top || r1.left > r2.right);
}
playboyxp 2003-10-08
  • 打赏
  • 举报
回复
楼主没有说清楚交边的算不算是相交
如果都算在内的话就要判断8次
顶点是否在一个内和两条边重合的情况
DESL 2003-10-08
  • 打赏
  • 举报
回复
楼主在把题说的详细一些...
我的看法是:
如果判断二个矩形是否有交点..
是判断一个矩形的其中三个任意点是否在别一个矩形内...
如果有1-3个点在别一个矩形内(注:3个点在别一个矩形内时第4个点在矩形外)这时就有交点.
如果4个点都不在矩形内但矩形中心点在别一个矩形内是这时就有交点

矩形的范围用循形就可以实现了.
里面加几个判断就可以了
以上的算法用三个判断语句判断4个点...在用算法求出矩形的中心点进行判断就可以了.
如有错误处请发留言
pengzhenwanli 2003-10-06
  • 打赏
  • 举报
回复
还有一个问题是。如果判断点或者是边,必须要判断8次,能否有化简的办法?
pengzhenwanli 2003-10-06
  • 打赏
  • 举报
回复
上面的各位使用API的不算!!!
因为我的要求是自己实现算法,使用API如果在不是windows的系统怎么办?我认为最好是能给出API的实现!!!!
我的想法是:
比如有两个矩形A,B,判断A的4个顶点是否有一个在B内,再判断B的4个顶点是否有在A内的。
这样的话如果情况比较不幸,需要比较8次,如果比较幸运,比较一次就行了。
但是我实在惭愧,没有想到如果两个较长的矩形如果相交,可能他们的顶点不满足我的条件,但是实际上确实是相交。
我的相交包括一个矩形包含另一个的情况。
made_in_ 2003-10-06
  • 打赏
  • 举报
回复 1
采用这两个矩形同方向的平行对角线端点测试,会比较高效。
比如两个矩形a,b。其中a的左上角坐标为(axl,ayl),右下角坐标为(axr,ayr)。
下面假设这么几种情况:
1:a的两个对角线顶点都在b内,则肯定不相交。
2:若a的俩顶点一个在而另一个不在,则肯定相交。
3:若a的两顶点都不在b内,则换成a的另外一个方向的对角线顶点(即a的右上角和左下角坐标),并回到第一步,进行同样测试,就可以得到最终结果。

这样的算法效率应该算比较高的,只需要进行简单的加减法就可以完成。所利用的思想就是:若一个矩形a在另一个矩形b中,则a的四个顶点必定都在b中;若不然,则a至多有两个非对角顶点在b中。
dddd8888 2003-10-06
  • 打赏
  • 举报
回复
BOOL IntersectRect(

LPRECT lprcDst, // address of structure for intersection
CONST RECT *lprcSrc1, // address of structure with first rectangle
CONST RECT *lprcSrc2 // address of structure with second rectangle
);
我不懂电脑 2003-10-05
  • 打赏
  • 举报
回复
用API
The IntersectRect function calculates the intersection of two source rectangles and places the coordinates of the intersection rectangle into the destination rectangle. If the source rectangles do not intersect, an empty rectangle (in which all coordinates are set to zero) is placed into the destination rectangle.

BOOL IntersectRect(

LPRECT lprcDst, // address of structure for intersection
CONST RECT *lprcSrc1, // address of structure with first rectangle
CONST RECT *lprcSrc2 // address of structure with second rectangle
);


Parameters

lprcDst

Points to the RECT structure that is to receive the intersection of the rectangles pointed to by the lprcSrc1 and lprcSrc2 parameters.

lprcSrc1

Points to the RECT structure that contains the first source rectangle.

lprcSrc2

Points to the RECT structure that contains the second source rectangle.



Return Values

If the rectangles intersect, the return value is nonzero.
If the rectangles do not intersect, the return value is zero. To get extended error information, call GetLastError.
DESL 2003-10-05
  • 打赏
  • 举报
回复
上面第一个判断是分别判断3个点
DESL 2003-10-05
  • 打赏
  • 举报
回复
应该分别判断
1.3个点是否在矩形内
2.小于等于3个点的情况..大于等于4就不是相交了...
3.注意一个特殊的情况就是四个点都不在别一个矩形内时中心在矩形内这个情况也是相交
oldfhp 2003-10-05
  • 打赏
  • 举报
回复
上面的方法不全面。
如果两个矩形很长,它们垂直相交(或不垂直)。那怎么判断?
我觉得还是看两个矩形的遍是否相交比较保险。虽然土了那么一点点。
leyt 2003-10-05
  • 打赏
  • 举报
回复
判断一个矩形的顶点是否在另一给矩形内,并且另一个矩形的顶点是否在该矩形内。
021850524 2003-10-05
  • 打赏
  • 举报
回复
www007www(shadow)说的对.
依次判断直到找到一个点在另一个矩形内.否则就是不在.
fierygnu 2003-10-05
  • 打赏
  • 举报
回复
楼上的方法对。Windows的话用PtInRegion就可以。
cutestar 2003-10-05
  • 打赏
  • 举报
回复
楼主的要求是判断两个矩形是否有交点,至于有几个不用计算,那么根据两个矩形相交的特征,每个矩形至少有一条对角线和另一个矩形相交。
现建立一个数学模型:矩形A的四条边A1,A2,A3,A4,矩形B的四条边B1,B2,B3,B4,求A的两条对角线A13,A24,依次判断各条对角线两端点是否在B的范围内,B的范围:TOP,BOTTON,LEFT,RIGHT,其中一条对角线的端点PT1(X1,Y1),PT2(X2,Y2),如果LEFT<=X1<=RIGHT AND BOTTON<=Y1<=TOP并且X2不在该范围内,则相交。
这样就把比较的次数减少,同时也不需要判断两个矩形摆放位置之间的关系。
www007www 2003-10-05
  • 打赏
  • 举报
回复
判断一个矩形的顶点是否在另一给矩形内
加载更多回复(1)

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧