【发布时间】:2016-11-21 21:58:07
【问题描述】:
如果我有两个矩形,其位置是使用两个 2D 向量(即左上角、右下角)定义的,我如何检查它们相交的点?
【问题讨论】:
标签: c++ intersection testing
如果我有两个矩形,其位置是使用两个 2D 向量(即左上角、右下角)定义的,我如何检查它们相交的点?
【问题讨论】:
标签: c++ intersection testing
我假设您实际上想要相交的结果,而不仅仅是两个矩形相交的测试。
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
【讨论】:
fsel,我还以为这是一条PPC/CELL 指令? (Visual Studio 2008 为a < b ? a : b 生成分支代码)
假设原点位于屏幕的left-top。
如果检查一个矩形(x3,y3) 的左上角是否小于另一个矩形(x2,y2) 的右下角,则两者相交。
点是(x2,|y2-y3|) 和(|x2-x3|,y2)。
这是用于矩形1右侧的矩形1和reactangle2。
对左平移应用逆向。
【讨论】:
两个矩形重叠是至少有一个内部点 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 个条件是必要的。它们是否也足够并不是直接显而易见的,但事实也是如此。
【讨论】:
如果您对完成这项工作的函数更感兴趣,而不是实现算法,
在 Windows 上查看 IntersectRect Function。
【讨论】: