Аппроксимация твердого тела объединением сфер

У меня есть трехмерное тело, представленное как объединение набора многогранных выпуклых оболочек. (Или одну выпуклую, если это упрощает задачу.) Я хотел бы аппроксимировать это тело как объединение набора сфер таким образом, чтобы минимизировать как количество сфер в наборе, так и ошибку в приближении. (Последняя цель преднамеренно расплывчата: подойдет любая разумная метрика ошибки. Точно так же способ объединения целей висит в воздухе; либо количество сфер, либо метрика ошибки могут быть ограничены, либо какая-то функция двух можно свернуть. Не хочу загонять себя в угол.)

Аппроксимация не обязательно должна полностью содержать или полностью содержаться в исходном наборе. Каждая сфера может иметь произвольный радиус.

Это похоже на проблему, которая является NP-полной, и в любом случае вряд ли будет практичной с использованием точных методов, поэтому я предполагаю, что решение лежит в области стохастической оптимизации. Кажется, что может подойти какой-то вариант k-средних (назначение непокрытых местоположений ближайшим к ним сферам и уточнение сфер для покрытия некоторых из них), но я не уверен, как обращаться с многократно покрытыми местоположениями или как найти локальный, не обязательно охватывающий все оптимум даже для одной сферы. Кроме того, для итерационных методов важна эффективность, и выполнение трехмерных логических операций не будет эффективным.


person Sneftel    schedule 14.05.2015    source источник
comment
Вероятно, не NP-полный, потому что это не проблема решения. Звучит смутно, как ранцевый, так что я бы поставил на NP-тяжело.   -  person user12341234    schedule 14.05.2015
comment
@user12341234 user12341234 Многие NP-сложные проблемы оптимизации (включая KP) становятся NP-полными после установления порога; в этом случае будет ли решение, включающее n сфер и показатель ошибки не выше e? Если мы возьмем подход объединения выпуклостей и заставим аппроксимацию быть надмножеством исходного твердого тела, на самом деле получится довольно тривиальное сокращение до 3SAT.   -  person Sneftel    schedule 15.05.2015


Ответы (4)


Проблема не простая, но изучена ранее. Центральным понятием является средняя ось, которую можно рассматривать как представление объекта бесконечным объединение шаров. Ключевой документ, посвященный вашему вопросу:

«Силовая кора, соединения шаров и медиальная ось трансформируются». Нина Амента, Сунхи Чой, Рави Кришна Коллури. Вычислительная геометрия. Том 19, выпуски 2–3, июль 2001 г., страницы 127–153. (ссылка на журнал.)


FootBallsShellBalls
(Источник изображений: От облаков точек к Power Crusts.)


Второй документ

Казальс, Фредерик и др. «Жадные геометрические алгоритмы для сбора шаров с приложениями к геометрической аппроксимации и молекулярной грубой зернистости». Форум компьютерной графики. Том. 33. № 6. 2014 г. (скачать в формате PDF. )

чье 1-е предложение звучит так: «Выбор шаров, которые лучше всего соответствуют 3D-объекту, — нетривиальная задача». Их основное применение — молекулярные модели, которые могут быть далеки от ваших интересов.

person Joseph O'Rourke    schedule 27.05.2015
comment
Хорошо, на первый взгляд, эта бумага, похоже, удовлетворяет мои потребности. :) Я знал о связи с преобразованием средней оси, но я не мог убедить себя, что в случае не бесконечного числа сфер обязательно будет оптимальной идеей разместить их все в точках средней оси. . Рассмотрим капсулу, образованную выпуклой оболочкой двух соприкасающихся шаров; лучший способ приблизиться к этому, скажем, с пятью сферами, будет по одной на каждом конце отрезка линии средней оси, а три расположены каким-то умным образом вне оси между ними. Я буду читать газету более внимательно, хотя. - person Sneftel; 28.05.2015
comment
@Sneftel: я думаю, что в вашем примере с капсулой вместо трех внеосевых было бы лучше центрировать три по оси. В любом случае алгоритм корки предназначен для произвольных форм. Геометрически простые примеры, такие как капсула, часто имеют лучшие специальные решения, использующие их симметрию. - person Joseph O'Rourke; 28.05.2015

Хм, моя лучшая идея на данный момент связана с машинами опорных векторов. Превратите ваш объект в целую кучу (возможно, равномерно расположенных) точек внутри и на поверхности объекта. Обучите модель SVDD с помощью линейного ядра (см. libsvm для SVDD). реализация). Затем решающая функция модели представляет собой неявную поверхность, определяемую опорными векторами модели (и ро). Снижение стоимости даст вам больше векторов поддержки, увеличение — меньше.

К сожалению, природа SVM такова, что область, охватываемая близлежащими опорными векторами, будет, э-э, «капли» вместе, примерно так:

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

(извините, моя интуиция для SVM полностью геометрическая/визуальная.)

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

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

Если вы хотите использовать больше ресурсов процессора, вы можете запустить еще один уровень минимизации ошибок поверх этого, который повторно запускает весь вышеописанный процесс для разных затрат вектора поддержки, пытаясь минимизировать некоторую комбинацию ошибки и стоимости. (Возможно error/cost.)

person Jay Kominek    schedule 20.05.2015

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

Обзор

В основном добавляйте сферы внутри фигуры в положениях, максимально закрывающих поверхность. Мы преобразуем сферу в трехмерный массив байтовых значений со знаком. Эти значения являются точками и будут поглощены сферами. Мы добавляем по одной сфере внутри объекта, а затем увеличиваем/уменьшаем ее в разные стороны, чтобы «съесть» как можно больше точек. Цель состоит в том, чтобы набрать как можно больше очков за каждую сферу. Очки зарабатываются путем суммирования очков в области сферы. С добавлением каждой сферы мы подсчитываем, затем считаем эту область использованной и устанавливаем значения массива равными 0.

  (A)       (B) ZZZZZZ   (C) ZZZZZZ   (D) ZZZZZZ   (E) ZZZZZZ   (F) ZZZZZZ   
     /\         ZX33XZ       ZX33XZ       ZX33XZ       ZX33XZ       ZX33XZ   
    /  \       ZX3223XZ     ZX3223XZ     ZX##23XZ     ZX  ##XZ     ZX    XZ  
   /    \     ZX321123XZ   ZX321123XZ   ZX####23XZ   ZX  ####XZ   ZX      XZ 
  |      |   ZX32111123XZ ZX32111123XZ ZX######23XZ ZX  ######XZ ZX        XZ
  |      |   ZX32111133XZ ZX32111133XZ ZX######23XZ ZX  ######XZ ZX        XZ
  |      |   ZX32222223XZ ZX##222223XZ ZX3####223XZ ZX3  ####3XZ ZX3     ##XZ
  |------|   ZX33333333XZ ZX##333333XZ ZX33##3333XZ ZX33  ##33XZ ZX33    ##XZ
   X= -1     ZXXXXXXXXXXZ ZXXXXXXXXXXZ ZXXXXXXXXXXZ ZXXXXXXXXXXZ ZXXXXXXXXXXZ
   Y= -2     ZZZZZZZZZZZZ ZZZZZZZZZZZZ ZZZZZZZZZZZZ ZZZZZZZZZZZZ ZZZZZZZZZZZZ

(A) Форма, которую мы хотим заполнить. (Здесь используется 2D, но 3D будет похоже)

(B) Преобразуйте фигуру в трехмерную сетку точек. Поверхность получает наибольшее число, и по мере того, как вы работаете в центре, числа устанавливаются на низкие положительные числа (например, 1); Вне формы получаются отрицательные числа; глубокий интерьер получает 1

(C) Добавьте небольшую сферу. (будем выращивать)

(D) Расширяем сферу, пока не сожрем максимальное количество очков

(E) Добавьте следующую сферу и увеличьте ее.

(F) Добавьте еще одну сферу. Этот маленький.

Процесс

5) сначала разбейте форму на разрешение 3D-блока.

10) Затем дайте наибольшее количество «очков» блокам по всей поверхности. Высокие точки с блоком, который фактически касается поверхности, и более низкие точки при движении внутрь или наружу. Когда вы идете наружу, точки должны быстро стать отрицательными, так как это предотвратит выступающие сферы. Когда вы двигаетесь внутрь от поверхности, точки должны установиться на 1, чтобы в центральной области были все единицы. Эти точки можно настроить по-разному, чтобы получить разные результаты.

15) Найдите место на внутреннем крае фигуры, которое находится вне сферы. Хотя находиться рядом с краем не требуется, это минимизирует область поиска. Если местоположение не может быть найдено, перейдите к 80. Если не удается найти местоположение, которое находится рядом

20) Нарисуйте сферу с нулевым радиусом внутри фигуры, которая не покрыта

25) Перемещайте сферу вверх/вниз, пока точки не будут максимальными (имитация отжига)

26) Перемещайте сферу вперед/назад до тех пор, пока точки не будут максимальными.

27) Двигайте сферу влево/вправо, пока точки не будут максимальными.

28) Переместите Вершину сферы вверх/вниз, пока точки не будут максимальными (имитация отжига/восхождения в гору)

29) Перемещайте нижнюю сферу вверх/вниз, пока точки не будут максимальными.

30) Перемещайте левую сторону сферы внутрь/вне, пока точки не будут максимальными.

31) Перемещайте правую сторону сферы внутрь/вне, пока точки не будут максимальными.

32) Переместите переднюю часть сферы внутрь / наружу, пока точки не будут максимальными.

50) Если какие-либо изменения в 25-32 повторите (перейдите к 25)

70) Вычтите очки из последней добавленной сферы. Установите все значения на ноль для внутренних значений (положительные числа) и не корректируйте внешние значения (отрицательные числа). Перейти 15.

80) (необязательно) Заполните внутренние пробелы. В основном посетите каждый элемент, чтобы убедиться, что он меньше или равен 0. Если положительный, перейдите к 20 с этим элементом. В противном случае, если ничего не найдено, перейдите к 85. Примечание: все внешние значения должны быть отрицательными, а все внутренние значения, находящиеся в сфере, должны быть равны 0.

85) Готово

Заметки

  • Так как будет сетка значений, рабочая область 1000x1000x1000 займет до 1 ГБ.
  • Не точное решение
  • Может потребоваться много вычислений для более высоких разрешений.
  • Для повышения эффективности диапазоны пикселей для меньших сфер могут быть предварительно записаны, чтобы не нужно было вычислять сферу для каждой итерации.
  • Версия с более низким разрешением (например, 500x500x500) может быть выполнена сначала, а затем расположение и размер сфер могут быть применены к более крупному 1000x1000x1000. Также для очень больших форм могут быть решены подразделы.
person SunsetQuest    schedule 03.06.2015

Хорошим началом было бы разработать алгоритм для:

1) Найдите наибольший радиус вписанной сферы.

2) Затем рассмотрим вычитаемый объем

3) Аппроксимируйте вычитаемый объем многогранником.

4) Разделите этот многогранник на меньшие (более тонкие) многогранники.

5) Повторить шаг 1.

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

person kensaii    schedule 19.05.2015
comment
Этот алгоритм разумен, за исключением того, что он не позволяет сферам накладываться друг на друга; кажется, что это серьезно ограничит качество производимых решений. - person Sneftel; 21.05.2015
comment
Существует выражение в закрытой форме для вычисления объема пересечения сферы-сферы. Я думаю, у вас может быть некоторая терпимость к тому, чтобы ваши сферы пересекались друг с другом, но это увеличило бы количество сфер, которые вы хотите использовать. Итак, вопрос: до какого предела можно допустить это пересечение сфер-сфер? У вас есть какое-то конкретное значение доли объема, которое вы хотели бы, чтобы сферы покрывали многогранник? 95%? 99%? - person kensaii; 22.05.2015
comment
Эм, возможно, я недостаточно ясно выразился в первоначальном вопросе. Нет проблем с пересекающимися сферами; объем аппроксимации является их объединением. Очевидно, что одна сфера, полностью содержащаяся в другой, была бы пустой тратой сферы, но в целом разрешение пересечения сфер имеет решающее значение для получения качественных результатов, и ваше решение, похоже, не поддерживает это (поскольку рекурсия только на результат вычитание). - person Sneftel; 23.05.2015
comment
Полагаю, что так. Это не дает вам подробного ответа, но вы всегда можете улучшить идею до стадии, достаточной для публикации статьи. Проблема, с которой вы столкнулись, возникает в некоторых областях, например, в CFD, где разрешен только примитив сферы. Вам придется погрузиться в тему, чтобы получить какие-то результаты, но вы абсолютно правы. - person kensaii; 25.05.2015
comment
Я бы изменил это предлагаемое решение, включив ограничение, согласно которому центр любой сферы, созданной после первого шага, должен находиться в одном из сегментов, соединяющих центр любой предыдущей сферы с самыми дальними точками корпуса. Это дало бы набор сфер-кандидатов для заполнения любой области оставшегося объема; из этого набора можно выбрать самые большие сферы, уменьшая количество сфер. Может привести или не привести к чему-то полезному.. - person Alex Mazzariol; 03.06.2015