Я список прямоугольников (они не могут вращаться):Найти группу пересекающихся прямоугольников
struct Rectangle {
double centerX;
double centerY;
double width;
double height;
Rectangle(double x, double y, double w, double h):centerx(x),centery(y),width(w),height(h){}
};
std::vector<Rectangle> rectangles;
rectangles.push_back(Rectangle(0 , 0 , 1 , 1 );
rectangles.push_back(Rectangle(0.5, 0.5, 1 , 1 );
rectangles.push_back(Rectangle(3 , 2 , 0.5, 0.6);
rectangles.push_back(Rectangle(0.2, 0.5, 0.5, 0.6);
rectangles.push_back(Rectangle(2 , -0.3, 0.4, 0.4);
rectangles.push_back(Rectangle(0.2, -0.4, 0.3, 0.4);
Я хочу, чтобы вычислить группу прямоугольников, которые имеют, по меньшей мере, одно пересечение с транзитивность собственности. т. е. если r1 пересекают r2 и r2 пересекают r3, r1, r2, r3 являются частью одной и той же группы.
В этом примере группа будет
{{3}, {4, 1, 2}, {5, 6}}
Порядок групп и порядок элементов внутри группы не имеет значения.
Как я могу рассчитать эти группы? При необходимости я могу изменить структуру данных.
Например, я могу изменить std::vector
на std::set
и упорядочить прямоугольники левой координатой X вершины. Таким образом, я могу использовать алгоритм развертки. Но я не могу найти образец, который можно применить к моей проблеме.
Как получить пересекающиеся группы?
Вы можете легко комбинировать подметание с помощью объединения-поиска. – Danstahr
Есть ли библиография или образец, который может быть адаптирован к моей конкретной проблеме? – Jepessen
@ Danstahr Спасибо за ключевое слово, хорошо знать :) [Структура данных с несвязанными наборами] (http://en.wikipedia.org/wiki/Disjoint-set_data_structure). – legends2k