40 std::vector<std::pair<size_t, size_t>> pairs;
41 std::vector<BOX2I> boxes( aOrderedIndices.size() );
42 std::vector<char> present( aOrderedIndices.size(), 0 );
43 PAIR_TREE::Builder builder;
45 builder.Reserve( aOrderedIndices.size() );
47 for(
size_t pos = 0; pos < aOrderedIndices.size(); ++pos )
49 std::optional<BOX2I> box = aBox( aOrderedIndices[pos] );
58 const int min[2] = { box->GetX(), box->GetY() };
59 const int max[2] = { box->GetRight(), box->GetBottom() };
60 builder.Add( min, max, pos );
63 PAIR_TREE tree = builder.Build();
64 std::vector<size_t> overlaps;
72 overlaps.push_back( aOther );
77 for( pos = 0; pos < aOrderedIndices.size(); ++pos )
84 const int min[2] = { boxes[pos].GetX(), boxes[pos].GetY() };
85 const int max[2] = { boxes[pos].GetRight(), boxes[pos].GetBottom() };
87 tree.Search( min, max, visitor );
89 std::sort( overlaps.begin(), overlaps.end() );
91 for(
size_t other : overlaps )
92 pairs.emplace_back( aOrderedIndices[pos], aOrderedIndices[other] );
std::vector< std::pair< size_t, size_t > > CollectOverlappingPairs(const std::vector< size_t > &aOrderedIndices, BOX_FN aBox)
Enumerate the pairs of aOrderedIndices whose boxes overlap, in the order a nested loop over the vecto...