Как вы можете рассчитать процентное совпадение двух прямоугольников? - PullRequest
9 голосов
/ 17 сентября 2009

Я написал функцию рисования, которая рисует различные экранные спрайты. Эти спрайты могут перекрываться только до определенной точки. Если им приходится сильно перекрывать друг друга, они становятся слишком затененными. В результате мне нужно определить, когда эти спрайты слишком сильно перекрываются. К счастью, проблема упрощается тем, что спрайты можно рассматривать как ортогональные прямоугольники. Я хотел бы знать, насколько эти прямоугольники перекрываются. Прямо сейчас я просто перебираю его, проверяя каждый пиксель в одном прямоугольнике, чтобы увидеть, содержит ли его другой. Я считаю это и рассчитываю процентное совпадение. Я думаю, что, возможно, есть лучший, менее грубый подход. Какой алгоритм я могу использовать, чтобы определить это?

Я использую wxwidgets.

1 Ответ

9 голосов
/ 18 сентября 2009

Результат зависит от того, как вы определяете процент перекрытия, чтобы он оставался симметричным, я бы написал его так:

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());
}
...