void CollisionMap::mergeHelper(std::vector<sf::FloatRect> &rects, bool moveOnIfFar) { bool (*nextRowFunc)(const sf::FloatRect *last, const sf::FloatRect *current); if (moveOnIfFar) { nextRowFunc = [](const sf::FloatRect *lastRect, const sf::FloatRect *rect) { return powf(rect->left - lastRect->left, 2.f) + powf(rect->top - lastRect->top, 2.f) > Constants::tileSizef * Constants::tileSizef; }; } else { nextRowFunc = [](const sf::FloatRect *lastRect, const sf::FloatRect *rect) { // adjacent and same dimensions return !(lastRect->left <= rect->left + rect->width && rect->left <= lastRect->left + lastRect->width && lastRect->top <= rect->top + rect->height && rect->top <= lastRect->top + lastRect->height && lastRect->width == rect->width && lastRect->height == rect->height); }; } std::vector<sf::FloatRect> rectsCopy(rects.begin(), rects.end()); rects.clear(); sf::FloatRect *current = nullptr; sf::FloatRect *lastRect = nullptr; rectsCopy.push_back(sf::FloatRect(-100.f, -100.f, 0.f, 0.f)); // to ensure the last rect is included for (size_t i = 0; i < rectsCopy.size(); ++i) { sf::FloatRect *rect = &rectsCopy[i]; // no current rect expanding if (current == nullptr) { current = lastRect = rect; continue; } if ((nextRowFunc)(lastRect, rect)) { rects.push_back(*current); current = lastRect = rect; continue; } // stretch current current->left = std::min(current->left, rect->left); current->top = std::min(current->top, rect->top); current->width = std::max(current->left + current->width, rect->left + rect->width) - current->left; current->height = std::max(current->top + current->height, rect->top + rect->height) - current->top; lastRect = rect; } }
QValueList< ObjectRect * > KPDFOutputDev::takeObjectRects() { if ( m_rects.isEmpty() ) return m_rects; QValueList< ObjectRect * > rectsCopy( m_rects ); m_rects.clear(); return rectsCopy; }