Редактировать: Приведенный ниже подход работает, но игнорирует критическую особенность R-деревьев - способность расщепления узлов R-дерева хорошо определена и поддерживает сбалансированное дерево (через B-дерево свойства). Так что на самом деле все, что вам нужно сделать, это:
- Выберите максимальное количество прямоугольников на странице
- Создайте начальные прямоугольники (используйте точки, наиболее удаленные друг от друга, центроиды, что угодно).
- Для каждой точки выберите прямоугольник, чтобы поместить его в
- Если он уже упал в один прямоугольник, поместите его туда
- Если этого не произойдет, вытяните прямоугольник, который должен быть как минимум расширен (разные способы измерения «наименьших» выходов - область работает)
- Если применимо несколько прямоугольников - выберите один из них на основе его заполненности или другой эвристический
- Если происходит переполнение - используйте квадратное разбиение для перемещения ...
- И так далее, используя алгоритмы R-дерева прямо из учебника.
Я думаю, что метод ниже подходит для поиска ваших начальных прямоугольников семян; но вы не хотите заполнять все ваше R-дерево таким образом. Выполнение разделения и повторной балансировки все время может быть немного дорогостоящим, поэтому вы, вероятно, захотите выполнить приличную часть работы с подходом KD ниже; просто не вся работа.
Подход KD: заключите все в прямоугольник.
Если количество точек в прямоугольнике> пороговое, поворачивайте в направлении D, пока не закроете половину точек.
Разделите на прямоугольники слева и справа (или выше и ниже) точку разделения).
Вызовите ту же процедуру рекурсивно для новых прямоугольников со следующим направлением (если вы шли слева направо, теперь вы будете идти сверху вниз и наоборот).
Преимущество этого подхода по сравнению с подходом деления на квадраты, предложенным другим автором, заключается в том, что он лучше приспосабливается к перекошенным точечным распределениям.