подсчитать количество соседних прямоугольников

Мой код печатает наборы координат (X, Y) в 2D-пространстве в диапазоне [0,1].

void Rect_Print() {
    cout << "In counter-clockwise fashion" << endl;
    cout << "#Rectangle    (   x0,   y0)   (   x1,   y1) " << endl;

    for (int b=0; b<Rect_Count; b++) {
       double Area = (Rect[b].x0 - Rect[b].x1) * (Rect[b].y0 - Rect[b].y1);

       cout << fixed << setprecision(4) << (b+1) <<
               "  (" << Rect[b].x0 << "," << Rect[b].y0 <<
             ")   (" << Rect[b].x1 << "," << Rect[b].y1 << ")" << endl;
    }

    cout << "Number of divisions (N = 3j-2) = " << Rect_Count << endl;
}

Эти точки делят единичный квадрат на (3j-2) подпрямоугольников (не равномерных). Для каждого конкретного прямоугольника я хотел бы подсчитать общее количество прилегающих к нему прямоугольников.

Пример

  1. Предположим, что первая координата делит единичный квадрат на четыре прямоугольника, например:

    Изображение

    На этом рисунке вы видите три прямоугольника, смежные с прямоугольником-3.

  2. Если я буду действовать таким образом, то после моего шестого шага единичный квадрат разделится на 19 прямоугольников. Так это выглядит так:

    Изображение

    Теперь к прямоугольнику-3 примыкают пять прямоугольников. шесть прямоугольников, смежных с прямоугольником-11.

Предположим, у меня есть наборы координат десять тысяч, и они делят квадрат на маленькие подпрямоугольники. Я хотел бы использовать С++ для подсчета количества прямоугольников, прилегающих к каждому из них. Как мне это сделать?

После поиска в Интернете кажется, что Фланн может помочь мне добиться цели. Я прочитал руководство пользователя, но не мог понять, как я могу это сделать.

Может кто-нибудь помочь мне?


person aries0152    schedule 24.06.2013    source источник
comment
Возможно, вы можете удерживать точки прямоугольника в переменных (класс Rectangle должен это делать). затем в конце вы можете подсчитать соседние, сравнив каждый прямоугольник с другими (путем сравнения сохраненных точек).   -  person Varvarigos Emmanouil    schedule 24.06.2013
comment
@V_Maenolis: Не могли бы вы уточнить это немного подробнее? Несколько строк кода могут помочь.   -  person aries0152    schedule 24.06.2013
comment
возможный дубликат Подсчитайте количество соседних блоков   -  person Karoly Horvath    schedule 02.07.2013


Ответы (2)


Я бы посоветовал вам структурировать это с помощью чего-то похожего на квадродерево (см. статью Wikipedia Quadtree). Разница здесь в том, что вы не разделяете подузлы дерева квадроциклов равномерно — вы разделяете точки, которые вставляются.

Затем вы можете перемещаться по дереву в поисках пересекающихся ребер.

Если у узла нет ребра, которое пересекает ваш прямоугольник запроса, вам не нужно рекурсивно обращаться к его дочерним элементам, что сэкономит время процессора при выполнении этого для 10 000 прямоугольников, поскольку сложность будет логарифмической, а не линейной.

Плитки листьев дерева — это ваш список прямоугольников, поэтому вы должны учитывать только те прямоугольники, которые являются листьями дерева и пересекаются с прямоугольником запроса.

Это также удобный способ обработки подразделения прямоугольников — когда вы вставляете точку, вы можете вернуться к дереву, чтобы найти прямоугольник для быстрого разделения.

person Pete    schedule 24.06.2013

Вы можете искать r-дерево или kd-дерево. Алгоритм карты дерева работает аналогично. Хорошее начало — отсортировать блоки и поместить их в дерево, рекурсивно разделив его по оси 2, и посмотреть, где подходит следующий блок.

person Gigamegs    schedule 26.08.2013