Построение поверхности из набора внутренних трехмерных точек рассеяния в MATLAB - PullRequest
9 голосов
/ 31 марта 2011

У меня есть большой (~ 60 000) набор триплетных точек данных, представляющих координаты x, y и z, которые разбросаны по декартовому объему.

Я ищу способ использовать Matlab для визуализации невыпуклой формы / объема, описываемой максимальной протяженностью точек.

Конечно, я могу визуализировать отдельные точки, используя scatter3, но, учитывая большое количество точек, детали формы затенены шумом точек.

В качестве аналогии, представьте, что вы заполнили песочные часы сферами случайных размеров, такими как BB, шарики для пинг-понга и kix, а затем получили координаты центра каждого объекта.Как бы вы взяли эти координаты и визуализировали форму содержащих их песочных часов?

В моем примере используются объекты разных размеров, потому что интервал между точками данных неоднороден и фактически случайный;он использует песочные часы, потому что форма не выпуклая.

Ответы [ 2 ]

12 голосов
/ 31 марта 2011

Если ваша поверхность, окружающая точки, может быть описана как выпуклый многогранник (то есть как поверхность куба или додекаэдра , без вогнутых ямок или зубчатых заостренных частей ), тогда я бы начал с создания 3-D триангуляции Делоне точек. Это заполнит объем вокруг точек серией тетраэдрических элементов с точками в качестве их вершин, и затем вы можете найти набор треугольных граней, которые образуют внешнюю оболочку объема, используя convexHull метод класса DelaunayTri.

Вот пример, который генерирует 200 случайных точек, равномерно распределенных в единичном кубе, создает тетраэдрическую сетку для этих точек, а затем находит трехмерную выпуклую оболочку для объема:

interiorPoints = rand(200,3);      %# Generate 200 3-D points
DT = DelaunayTri(interiorPoints);  %# Create the tetrahedral mesh
hullFacets = convexHull(DT);       %# Find the facets of the convex hull

%# Plot the scattered points:
subplot(2,2,1);
scatter3(interiorPoints(:,1),interiorPoints(:,2),interiorPoints(:,3),'.');
axis equal;
title('Interior points');

%# Plot the tetrahedral mesh:
subplot(2,2,2);
tetramesh(DT);
axis equal;
title('Tetrahedral mesh');

%# Plot the 3-D convex hull:
subplot(2,2,3);
trisurf(hullFacets,DT.X(:,1),DT.X(:,2),DT.X(:,3),'FaceColor','c')
axis equal;
title('Convex hull');

enter image description here

1 голос
/ 11 августа 2014

Вы можете рассматривать ваши данные как выборку из трехмерной плотности вероятности и оценивать эту плотность на сетке, например, с помощью 3D-гистограммы или, лучше, с оценкой плотности ядра 3d . Затем примените порог и извлеките поверхность, используя isosurface.

К сожалению, hist3, включенный в набор инструментов статистики, (несмотря на его название) представляет собой всего лишь 2-мерную гистограмму, а ksdensity работает только с 1-мерными данными, поэтому вам придется реализовать 3d-версии самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...