2009-12-04 100 views

回答

4

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

Rect1的的交点=(L1,T1,R1,b1)和RECT2 =(L2,T2,R2,B2)又是一个矩形:

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

rectIntersection当然是空的,如果left >= right || top >= bottom假设一个矩形是左/顶端和右/底排他。

的矩形相交如果

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

分离轴版本更有效率,这个版本意味着你将永远需要做四个比较。 – 2009-12-04 10:24:56

+0

+您必须至少执行一次额外的测试才能查看生成的矩形是否为空。这意味着这个版本是5-6个条件,而SAT版本是1-4。 – 2009-12-04 10:26:21

+0

我确实认为海报实际上是想要得到的一组相交点,而不是只有在相交时才进行测试。根据上下文,计算交叉点并声明它不为空可能更好。 – Sebastian 2009-12-04 10:40:35

2

假设原点位于屏幕的left-top

如果检查一个矩形(x3,y3)的左上角是否小于另一个矩形(x2,y2)的右下角,则两者相交。

积分是(x2,|y2-y3|)(|x2-x3|,y2)

这是矩形1右边的rectangle1和reactangle2。

将反转应用于左侧翻译。

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 Function