j_random_hacker уже дал хороший ответ с кубами, выровненными по осям, кубами, выровненными по осям, и сферами. Однако, если вы действительно хотите найти оптимальный параллелепипед, алгоритм значительно усложняется.
Я предполагаю, что у вас есть набор вокселей в сетке. Если ваши воксели представляют собой твердое тело или образуют плотное облако, вы можете создать набор вокселей, представляющих внешнюю оболочку фигуры. Внутренние воксели не важны при создании выпуклой оболочки (будь то сфера или любой выпуклый многогранник).
Один из возможных методов для этого:
- для каждой линии по оси X найдите элементы с наименьшей и наибольшей координатой X и удалите все элементы между ними
- повторите то же самое для линий вдоль оси Y и линий вдоль оси Z
Если это звучит странно, подумайте о геометрии. Если вы попытаетесь нарисовать плоскость за пределами твердого тела (или), плоскость никогда не сможет достичь ни одного из средних положений вдоль линии, поэтому никакие точки, находящиеся на линейном сегменте между двумя другими точками, не помогут создать более плотную подгонку. (Это не оптимальный алгоритм в том смысле, что он не оставляет ненужных точек в наборе, но он прост и быстр.)
Если вы хотите создать многогранник, содержащий все точки, вы создаете его из набора плоскостей (6 в случае прямоугольного параллелепипеда). Плоскость довольно проста в том смысле, что для любых оптимальных ограничивающих плоскостей верно следующее:
- все точки находятся на неотрицательном расстоянии от плоскости (т.е. на одной стороне)
- на плоскости есть хотя бы одна точка (нулевое расстояние)
Расстояние от точки до плоскости вычисляется очень просто (ax+by+cx+d для каждый пункт). Таким образом, поиск ограничивающей плоскости в каждом направлении является относительно быстрой и простой операцией O(n) (где n — количество оставшихся вокселей).
Хуже того, выбрать правильное направление для самолетов непросто. Я не знаю, существует ли для этого оптимальный алгоритм, но я могу думать только о неуклюжих или медленных алгоритмах либо с большим количеством вычислений грубой силы (плоские расстояния во многих направлениях), либо с итеративным угадыванием.
Даже они могут быть полезны, но на самом деле остается вопрос: почему? Могут быть лучшие способы, чем пытаться сделать маленький прямоугольный параллелепипед.
person
DrV
schedule
27.06.2014