Алгоритм инкапсуляции вокселей/данных в поле

У меня есть куб с 8 переменными углами. У меня также есть набор данных вокселей, все измерения которого имеют одинаковый размер набора.

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

Желательно не слишком тяжелый алгоритм.


person RobotRock    schedule 26.06.2014    source источник
comment
Просто для проверки: вы действительно говорите о кубе, то есть о правильном теле с шестью квадратными гранями? В этом случае у нас есть простое масштабирование (размер куба), перемещение (положение куба) и вращение, то есть шесть степеней свободы. Кроме того, вы хотите иметь наименьшую возможную площадь (площадь поверхности) или объем куба? (Не то, чтобы это имело значение в случае куба, но если вы принимаете другие формы, то это может быть важно.)   -  person DrV    schedule 27.06.2014
comment
Думаю, это не совсем куб, скорее геометрия с 8 переменными углами. Кубическая форма тоже может работать и может быть намного быстрее. Однако кубическое решение не входило в мои намерения. Моя цель — получить наименьший возможный объем при инкапсуляции всех вокселей.   -  person RobotRock    schedule 27.06.2014


Ответы (2)


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

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

Один из возможных методов для этого:

  • для каждой линии по оси X найдите элементы с наименьшей и наибольшей координатой X и удалите все элементы между ними
  • повторите то же самое для линий вдоль оси Y и линий вдоль оси Z

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

Если вы хотите создать многогранник, содержащий все точки, вы создаете его из набора плоскостей (6 в случае прямоугольного параллелепипеда). Плоскость довольно проста в том смысле, что для любых оптимальных ограничивающих плоскостей верно следующее:

  • все точки находятся на неотрицательном расстоянии от плоскости (т.е. на одной стороне)
  • на плоскости есть хотя бы одна точка (нулевое расстояние)

Расстояние от точки до плоскости вычисляется очень просто (ax+by+cx+d для каждый пункт). Таким образом, поиск ограничивающей плоскости в каждом направлении является относительно быстрой и простой операцией O(n) (где n — количество оставшихся вокселей).

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

Даже они могут быть полезны, но на самом деле остается вопрос: почему? Могут быть лучшие способы, чем пытаться сделать маленький прямоугольный параллелепипед.

person DrV    schedule 27.06.2014

Если вы имеете в виду кубоид — трехмерную фигуру с 6 прямоугольными гранями — и если эти грани должны быть выровнены с осями ваших воксельных данных, то это просто (3D) ограничивающая рамка. Все, что вам нужно сделать, это вычислить минимальное и максимальное значения координат x, y и z каждого вокселя в вашем наборе данных. Взяв все 8 комбинаций {минимум, максимум} для этих 3 измерений, вы получите координаты 8 углов, хотя обычно вы записываете только две точки (min_x, min_y, min_z) и (max_x, max_y, max_z). , которые полностью описывают форму.

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

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

person j_random_hacker    schedule 27.06.2014