Единственный вариант, если Quickhull недостаточно хорош, - это cudahull, если вам нужны точные решения. Хотя даже тогда вы получите только 40-кратное увеличение (кажется).
Я предполагаю, что каждая выпуклая оболочка, которую вы создаете, имеет не менее 10 вершин (если их намного меньше, вы мало что можете сделать). Если вы не против "достаточно близких" решений. Вы можете создать версию quickhull, которая ограничивает количество вершин на многоугольник. Количество вершин, которым вы ограничиваете вычисление, также позволит при необходимости вычислить максимальную ошибку.
Дело в том, что по мере того, как число вершин выпуклой оболочки приближается к бесконечности, вы получаете сферу. Это означает, что из-за того, как работает быстрый корпус, каждая дополнительная вершина, которую вы добавляете к выпуклой оболочке, имеет меньший эффект *, чем предыдущие.
* В зависимости от того, как кодируется quickhull, это может быть правдой только в общем смысле. Чтобы реализовать это на практике, потребуется изменить алгоритм рекурсии Quickhull, поэтому, хотя «следующая вершина» всегда вычисляется (кроме случаев, когда добавляется последняя вершина или для этого участка не остается точек), вершины фактически добавляются к выпуклой оболочке в порядок, который максимизирует увеличение объема многогранников (вероятно, в порядке от наиболее удаленного до наименее удаленного). Вы понесете некоторую стоимость производительности для отслеживания порядка добавления вершин, но пока соотношение ожидающих выпуклых точек корпуса и ожидающих точек достаточно велико, оно того стоит. Что касается ошибки, то лучшим вариантом, вероятно, является остановка алгоритма либо когда будет достигнута фактическая выпуклая оболочка, либо когда максимальное увеличение объема станет меньше определенной части текущего общего объема. Если производительность важнее, просто ограничьте количество точек выпуклой оболочки на многоугольник.
Вы также можете взглянуть на различные приблизительные алгоритмы выпуклой оболочки, но метод, который я описал выше, должен хорошо работать для аппроксимации объема / центроида с возможностью определения ошибки.
person
Nuclearman
schedule
07.01.2013