【问题标题】:How can you calculate the percentage overlap of two rectangles?如何计算两个矩形的重叠百分比?
【发布时间】:2010-11-29 06:49:51
【问题描述】:

我写了一个绘图函数来绘制各种屏幕精灵。这些精灵只能重叠到一个点。如果它们有太多重叠,它们就会变得太模糊。因此,我需要检测这些精灵何时重叠过多。幸运的是,问题得到了简化,精灵可以被视为正交矩形。我想知道这些矩形重叠了多少。现在,我只是通过测试一个矩形中的每个像素以查看另一个矩形中是否包含它来强制它。我计算这些并计算重叠百分比。我认为可能有一种更好、更少蛮力的方法。我可以使用什么算法来确定这一点?

我正在使用 wxwidgets。

【问题讨论】:

  • 这是一道作业题吗?此外,您应该考虑更清楚地定义“百分比”。您的问题至少可以用两种方式解释 - 例如,作为两个矩形而不是其中一个矩形占据的总覆盖面积的百分比,或者 rect2 覆盖的 rect1 面积的百分比。
  • 另外,哪个矩形的百分比?如果一个非常大的矩形与一个小得多的矩形重叠,它可能(比如说)50% 的小矩形重叠,而 0.1% 的大矩形重叠。
  • 谁认为这是“公然冒犯”?这有点傻。与非编程相关的类似。它是。相反,我会说这不是一个问题。它更像是一个命令(“为我做这个”)。显然是功课。所以max:如果你不尝试,你就不会学习。告诉我们你到目前为止有什么,你被困在哪里等等......如果你不想做你自己的工作,我们为什么要这样做?我们想提供帮助,这就是我们在这里的原因,但这里的大多数人也知道,做你的家庭作业并没有真正帮助你。
  • 家庭作业!?我希望。在我的个人资料中查看我的其他问题。我看起来像在学校吗?如果它让我想的人不高兴,我会删除它。

标签: c++ algorithm math wxwidgets


【解决方案1】:

结果取决于你如何定义重叠百分比,为了保持对称,我会这样编码:

double CalculatePercentOverlap(const wxRect& rect1, const wxRect& rect2)
{
  wxRect inter = rect1.Intersect(rect2);
  if (inter.IsEmpty())
    return 0;
  return (double)(inter.GetWidth()*inter.GetHeight()) * 2.0 /
    (double)(rect1.GetWidth()*rect1.GetHeight() + 
             rect2.GetWidth()*rect2.GetHeight());
}

【讨论】:

  • @max - 如果他的代表被重新计算,它将删除分数,这最终会发生
  • 我会离开这个。不要删除您的问题,因为将来有人会发现这很有用。
  • 另外,你应该更喜欢 static_cast 而不是 C 风格的演员表。
  • @max 你仍然可以编辑你的问题,解释你的意思。这可能会让人们收回他们的 -1 或支持你
  • 需要注意的是,这个函数返回的是小矩形对大矩形的百分比。因此参数顺序无关紧要 CalculatePercentageOverlay(wxRect(0,0,200,200), wxRect(0,0,50,50)) 给出与 CalculatePercentageOverlay(wxRect(0,0,50,50), wxRect(0,0,200,200) 相同的答案))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 2021-12-17
  • 2023-03-18
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多