Получение информации о границах из трехмерного массива - PullRequest
1 голос
/ 10 ноября 2010

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

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

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

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

Если у кого-то есть опыт с такого рода проблемами или какой-либо ценный вклад,Не могли бы вы указать мне правильное направление.

PS Я бы предпочел получить закрытое представление оболочки, таким образом, мой более ранний подход к 2d-сетке.Тем не менее, подход, который просто дает мне точки оболочки без какой-либо связи между ними, все равно будет чрезвычайно полезен.

Спасибо, Ze

Ответы [ 3 ]

1 голос
/ 25 января 2011

Думаю, к настоящему моменту уже немного по-настоящему полезно для вас, но для справки я бы сказал, что это идеальный сценарий для объемного моделирования (как вы уже догадались). Пока вы знаете ограничивающую рамку вашего облака точек, вы можете отобразить эти координаты в пространстве вокселей и увеличить плотность (значение) каждого вокселя для каждой точки данных. После того, как вы полностью определили свой объем, вы можете использовать алгоритм Marching cubes , чтобы создать трехмерную сетку поверхности для заданного порогового значения (значения iso). Эта результирующая поверхность не обязательно должна быть непрерывной, но обернет все вокселы значениями> isovalue внутри. Двумерным эквивалентом являются тепловые карты ... Качество поверхности можно улучшить, отрегулировав изо-порог (чем выше, тем плотнее) и разрешение вокселей.

Поскольку вы используете Java, вы можете взглянуть на мою библиотеку toxiclibs volumeutils, которая также поставляется с несколькими примерами (для Обработка ) показывая общий подход ...

1 голос
/ 10 ноября 2010

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

В качестве альтернативы, вы можете затем обратиться к более строгим алгоритмам, таким как лучевое вещание илимарширующие кубики.

0 голосов
/ 10 ноября 2010

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

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

Я не знаю, какую форму ожидать (может быть простой куб ...

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

...