【问题标题】:Algorithm for calculating all boxes selected by a rectangular selection计算矩形选择所选择的所有框的算法
【发布时间】:2020-08-28 13:32:46
【问题描述】:

假设你已经绘制了大量的盒子,用户可以在它们上面绘制一个矩形区域。

虽然我将在浏览器中实现它,但让我们将其抽象出来,并假设我们已经获得了每个矩形的每个点的坐标。

如果我想检查哪些框a) intersectb) are contained by选择,这里最有效的数据结构和算法是什么?

我目前的想法是:

  • x对所有框排序
  • 通过 binsearch,检查哪些框与选择区域在 x 方向上重叠,然后,对于每个 x 方向重叠的框,检查它们是否也与 y 方向对齐。

  • xy 对所有框进行排序,每个框都在单独的数组中
  • 通过 binsearch,首先找到所有 x 重叠的框,然后找到所有 y 重叠的框,然后检查两组中都有哪些框,

...虽然我很确定有一些众所周知的算法可以解决这样的问题。

【问题讨论】:

  • 注意这里有一个区别:“我有大量的框,加上一个矩形区域;计算哪些框被选中最有效的方法是什么?”和“我有大量的框,我想准备一个数据结构,以便在将来最有效地找到选择了哪些框时,我得到了矩形区域”。
  • 例如,逐一测试每个盒子,盒子的数量是线性的;而对盒子进行排序需要n log n 操作,其中n 是盒子的数量;因此,虽然从长远来看排序可能是有效的(如果你只排序一次,然后重复呈现矩形区域),如果你想要一个只有一个矩形区域的即时结果,它实际上比简单算法效率低。
  • 确实,我的意思是第二个:允许快速搜索的数据结构。将其添加到问题中。

标签: algorithm


【解决方案1】:

我想通过某个矩形选择你的意思是相交某个矩形或包含在某个矩形中。如果“绘制的框”是固定位置的,那么想到的一种方法是binary space partition。粗略地说,可以为“绘制的框”生成(理想平衡的)二元空间分区树。如果选择矩形被定位,其角的位置将与二叉空间分区树匹配,并且可以从显式检查交叉点中排除大半空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多