检查两个矩形之间的交点?

3
如果我有两个矩形,它们的位置是使用两个二维向量定义的(即左上角,右下角),那么如何检查它们相交的点?
4个回答

4
我假设您实际上想要矩形的交集结果,而不仅仅是测试两个矩形是否相交。

矩形rect1 = (l1, t1, r1, b1)和矩形rect2 = (l2, t2, r2, b2)的交集又是一个矩形:

rectIntersection = ( max(l1, l2), max(t1, t2), min(r1, r2), min(b1, b2) )

如果假设一个矩形是左/上包含,右/下不包含的,并且 left >= right || top >= bottom,那么rectIntersection当然为空。

如果矩形相交,则满足以下条件:

l1 < r2 && l2<r1 && t1<b2 && t2<t1

分离轴版本更高效,这个版本意味着你总是需要进行四次比较。 - Andreas Brinck
我认为海报实际上想要交点的结果集,而不仅仅是测试两者是否相交。根据上下文,计算交点并断言它不为空可能更好。 - Sebastian
通常情况下,如果您不进行分支,现代处理器上的代码会更快。最大值和最小值通常会变成fsel。因此,上述伪代码中没有代码分支。当然,唯一真正的答案是进行性能分析。 - Charles Beattie
即使没有使用 fsel,现代编译器也完全能够为您优化这样的代码。只要不妨碍它,那就可以了。 无论如何,这个解决方案给出了_正确_的结果(不像其他一些解决方案)。 如果需要,它可以在以后进行优化。 - Tomek Szpakowicz
如果l3,t3,r3,b3表示中间交集结果,那么仅检查r3-l3 <0 || b3-t3 <0是否更快? - Philip Kamenarsky
显示剩余2条评论

2
假设原点位于屏幕的左上角。
如果检查一个矩形的左上角坐标 (x3,y3) 是否小于另一个矩形的右下角坐标 (x2,y2),则两个矩形相交。
这些点是 (x2,|y2-y3|)(|x2-x3|,y2)
这适用于矩形1和矩形2位于矩形1的右侧。
应用左平移的反向操作。

1

如果两个矩形有至少一个内部点X,Y是共同的,则它们重叠。设第一个矩形为{T1, L1, B1, R1},第二个矩形为{T2, L2, B2, R2}(上、左、下、右)。现在有(X>L1)(X<R1)以及(Y>T1)(Y<B1),对于矩形2也是类似的。从(X>L1)(X<R2)可以得出(L1<R2)。同样地,(L2<R1)(T1<B2)(T2<B1)

这4个条件是必要的。它们是否充分并不直接明显,但事实上也是如此。


0

如果你更关心一个函数来完成工作,而不是实现一个算法,
可以查看Windows上的IntersectRect函数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接