Эффективная выпуклая оболочка вокруг прямоугольников (и проверка того, лежит ли точка внутри оболочки)

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

Я запрограммировал классический алгоритм выпуклой оболочки (просто перечислив все точки), но, поскольку у меня есть куча пар прямоугольников, я блуждал, не мог ли быть более эффективный способ сделать это для этого особого случая.

Это то, о чем я говорю, чтобы уточнить:

Выпуклая оболочка вокруг пар прямоугольников

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

Обновить

Чтобы прояснить мою конечную цель, у меня есть ~ 100 прямоугольников, уже сгруппированных в пары по два, и тысячи точек, для которых я должен проверить, лежат ли они внутри каждой из этих выпуклых оболочек в режиме реального времени. Теперь, когда я немного подумал об этом, я думаю, что выпуклая часть корпуса не будет узким местом во всей операции (но их все еще ~ 100, и я стремлюсь к обработке 60 кадров в секунду в реальном времени), так что я мог бы также используйте простой старый алгоритм, как предложил @BartKiers, а затем вернитесь к этому после профилирования.

Я оставлю вопрос открытым на некоторое время, возможно, у кого-то есть идея оптимизации, которая в любом случае может быть полезна.


person Lou    schedule 30.01.2015    source источник
comment
Могут быть более быстрые решения, но я сомневаюсь, что они вам понадобятся: вы всегда выполняете алгоритм на 8 точках, верно? Ручная сортировка точек приведет к тому же времени выполнения, что и правильно реализованный алгоритм выпуклой оболочки.   -  person Bart Kiers    schedule 30.01.2015
comment
@Bart: спасибо, да, всегда по 8 точкам, но таких прямоугольников ~50 пар (100 прямоугольников, сгруппированных в пары), и мне нужно проверить, лежит ли определенная точка внутри каждой из этих выпуклых оболочек - а у меня есть тысячи эти точки для проверки в режиме реального времени по сравнению со всеми этими корпусами (большинство из них я обрезаю с помощью простых ограничивающих рамок, но их еще много нужно проверить).   -  person Lou    schedule 30.01.2015


Ответы (1)


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

При тех же рассуждениях по четырем сторонам света есть 16 различных случаев, которые вы можете жестко закодировать.

введите здесь описание изображения

Другой способ взглянуть на это - заметить, что выпуклая оболочка является самой узкой ограничивающей рамкой из двух прямоугольников с «отрезанными» 0, 2 или 4 углами. Поиск ограничивающей рамки тривиален, и вы решаете, следует ли обрезать угол, если он не принадлежит ни одному из прямоугольников.

Из этого правила легко вывести тест на включение точек. Если у вас уже есть тест ограничивающей рамки, достаточно добавить тесты углов.

person Yves Daoust    schedule 30.01.2015
comment
Спасибо! Хотя я не уверен, как вы получили 16 случаев? :) - person Lou; 30.01.2015
comment
Если ваша цель — проверить внутреннюю часть точки, вам даже не нужно явно строить CH, просто проверьте, что точка находится на положительной стороне каждого ребра (4, 6 или 8 из них). - person Yves Daoust; 30.01.2015
comment
Большое спасибо, это действительно полезно! - person Lou; 30.01.2015