Если вы нашли выпуклую оболочку для точек X
и O
по отдельности (то есть на этом этапе у вас есть две отдельные выпуклые оболочки), вам нужно будет просто проверить, пересекались ли какие-либо сегменты корпусов или был ли один корпус закрыт другим.
Если бы оказалось, что два корпуса полностью не пересекаются, два набора данных будут геометрически разделены.
Поскольку по определению корпуса являются выпуклыми, любой разделитель будет прямой линией.
Существуют эффективные алгоритмы, которые можно использовать как для поиска выпуклой оболочки (алгоритм qhull основан на подходе O(nlog(n))
quickhull , я думаю), так и для выполнения линии тесты пересечения линии для набора сегментов ( развертка при O(nlog(n))
), поэтому в целом кажется, что эффективный алгоритм O(nlog(n))
должен быть возможен.
Этот тип подхода должен также распространяться на общие k-way
тесты разделения (где у вас есть k
групп объектов) путем формирования выпуклой оболочки и выполнения тестов пересечения для каждой группы.
Он также должен работать в более высоких измерениях, хотя испытания на пересечение станут более сложными ...
Надеюсь, это поможет.