给定矩形区域和一组矩形,检查整个区域是否被它们覆盖

时间:2013-04-23 23:10:00

标签: c++ algorithm

此处的所有值均为实数,最多包含两个浮点数。

假设我们有一个矩形区域100.0 75.0

然后给你一组矩形。如何检查这些矩形是否覆盖了整个区域?

如果我们有

(0,0,50,75)
显然,这不会发生,因为它只覆盖了一半的面积。如果我们有

(0,0,50,75)
(50,0,50,75)

然后这确实有效,因为两个矩形都会有效地覆盖整个(100,75)

我尝试了什么

尝试(没有用)制作一个多维的布尔数组:

bool area[10000][7500];

这些是区域的维度,乘以100,这样我就不必处理浮点数了。然后我只迭代我的每个矩形(它们的值也乘以100),对于它们中的每个“像素”,我将布尔值转换为true

最后,我检查该地区的所有布尔值是否为true

这被证明是非常愚蠢的。你能帮我找到更好的方法吗?

3 个答案:

答案 0 :(得分:4)

我认为像这样的策略会奏效:

  1. 丢弃任何完全在您所在区域之外的矩形
  2. 沿着列表中相对于一个轴的矩形边缘以较小的矩形分割您的区域
  3. 沿着封面列表中的矩形边缘相对于另一个轴分割在步骤2中创建的区域矩形列表
  4. 您现在有两个矩形列表,其中封面列表中必须有一个矩形完全覆盖每个区域矩形

答案 1 :(得分:2)

我认为你的“位图”尝试失败是因为(通常的)浮点舍入问题。不幸的是,你无能为力。

现在算法正确,我会使用减法技术来处理它。

  • 让我们调用你的初始矩形R。
  • 初始化第二组矩形S,最初包含覆盖整个区域的单个矩形。
  • 对于R中的每个矩形:
    • 对于S中的每个矩形:
      • 如果两个R和S矩形相交,则将S矩形替换为需要的矩形(如果我没记错,则为0到4),覆盖S矩形左边的非相交部分。
      • 继续迭代S,注意不要为刚添加的新S矩形计算任何东西(我们已经知道它们与当前的R矩形不相交)。
    • 继续迭代R,这次考虑新的S矩形,直到:
      • S中没有剩下的矩形,在这种情况下,你的R矩形覆盖整个区域。
      • 或者,你迭代了所有的R矩形,还剩下S个矩形,在这种情况下你的R矩形不会覆盖整个区域。

至于复杂性,我不确定它与@ 500-Internal-Server-Error或@ Tommy的解决方案相比如何,但是嘿,至少我设法想出了一些东西,我认为我不能当我第一次阅读你的问题时 - 我通常不太擅长空间的东西。 :)

答案 2 :(得分:1)

概念上非常类似于500的方法 - 内部服务器错误避免了最后一步暗示的O(n ^ 2)搜索:

  1. 构建覆盖集中每个矩形的垂直边界列表;
  2. 假设有n个边界,你需要在源矩形上考虑n + 1条垂直条;
  3. 对于每个条带,获取与其重叠的所有矩形的列表(您可以在O(n)时间内通过从矩形推送到箱子而不是向后搜索);
  4. 从左到右排序列表(即O(n log n));
  5. 浏览排序列表并尝试找到一个跨度结束的间隙,其他任何东西都开始,直到稍后(另一个O(n)任务)。
  6. 如果找到合适的间隙,则不包括原件。如果你不这样做。顺便说一下,这实质上就是span缓冲的工作方式。