【问题标题】:Checking for intersection points between two rectangles?检查两个矩形之间的交点?
【发布时间】:2016-11-21 21:58:07
【问题描述】:

如果我有两个矩形,其位置是使用两个 2D 向量(即左上角、右下角)定义的,我如何检查它们相交的点?

【问题讨论】:

    标签: c++ intersection testing


    【解决方案1】:

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

    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
    

    【讨论】:

    • 分离轴版本效率更高,这个版本意味着你总是需要做四次比较。
    • + 你必须至少做一个额外的测试,看看结果矩形是否为空。这意味着这个版本是 5-6 个条件句,而 SAT 版本是 1-4 个。
    • 我确实认为张贴者实际上想要得到的一组相交点,而不仅仅是两个相交的测试。根据上下文,最好计算交集并断言它不为空。
    • 如果您不进行分支,通常代码在现代处理器上会更快。 Max 和 Min 经常变成 fsel。所以上面的seudo代码中没有代码分支。唯一真正的答案当然是个人资料。
    • 抱歉没有正确阅读问题,英特尔处理器真的有fsel,我还以为这是一条PPC/CELL 指令? (Visual Studio 2008 为a &lt; b ? a : b 生成分支代码)
    【解决方案2】:

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

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

    点是(x2,|y2-y3|)(|x2-x3|,y2)

    这是用于矩形1右侧的矩形1和reactangle2。

    对左平移应用逆向。

    【讨论】:

      【解决方案3】:

      两个矩形重叠是至少有一个内部点 X,Y 两者共有。让第一个矩形为{T1, L1, B1, R1},第二个为{T2, L2, B2, R2}(上、左、下、右)。现在遵循(X&gt;L1)(X&lt;R1)(Y&gt;T1)(Y&lt;B1),对于矩形2 也是如此。从(X&gt;L1)(X&lt;R2) 遵循(L1&lt;R2)。同样,(L2&lt;R1)(T1&lt;B2)(T2&lt;B1)

      因此,这 4 个条件是必要的。它们是否也足够并不是直接显而易见的,但事实也是如此。

      【讨论】:

        【解决方案4】:

        如果您对完成这项工作的函数更感兴趣,而不是实现算法,
        在 Windows 上查看 IntersectRect Function

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-06-13
          • 2013-12-13
          • 2013-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多