2015-10-15 10 views
0

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

Как я ожидал, что график выглядеть следующим образом: How I expected the graph to look like.

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

The voronoi polyhedrons that are formed out of my data points.

координаты моего набора данных являются:

X= [116,191,0; 
    108,183,0; 
    120,175,0; 
    100,162,12; 
    116,166,8; 
    133,158,14; 
    100,150,0; 
    116,166,15; 
    125,144,8; 
    90,133,5; 
    108,133,2.5; 
    144,133,5; 
    116,116,15; 
    144,116,6.5; 
    108,100,-5; 
    150,100,15; 
    83,100,15; 
    108,83,14; 
    100,58,13; 
    133,50,13; 
    100,25,11; 
    133,30,12; 
    100,8.3,14; 
    133,8.3,14]; 

Я использовал код в ссылке (http://www.mathworks.com/help/matlab/math/voronoi-diagrams.html) для рисования Вороного на этих точках, и я получаю сообщение об ошибке, как это:

Error using convhull 
The coordinates of the input points must be finite values; Inf and NaN are not permitted. 

Error in best3D_original (line 38) 
K = convhull(XR10); 

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

dt = delaunayTriangulation(X); 
figure 
[V,R] = voronoiDiagram(dt); 
tid = nearestNeighbor(dt,0,0,0); 
XR10 = V(R{tid},:); 
K = convhull(XR10); 
K 
defaultFaceColor = [0.6875 0.8750 0.8984]; 
trisurf(K, XR10(:,1) ,XR10(:,2) ,XR10(:,3) , ... 
     'FaceColor', defaultFaceColor, 'FaceAlpha',0.9) 
title('3-D Voronoi Region') 

Я также попытался включения функции патч отдельно в другом сценарии для того же набора точек данных. Код выглядит примерно так:

X=[x y z]; 
[V,C]=voronoin(X); 
for k=1:length(C) 
    disp(C{k}) 
end 
for k=2:length(C) 
    if all(C{k}~=1) 
     VertCell = V(C{k},:); 
       KVert = convhulln(VertCell); 
       patch('Vertices',VertCell,'Faces',KVert,'FaceColor','g','FaceAlpha',0.5); 
    end 
end 

ответ

0

я не уверен, что случилось, но первая строка V содержит только Inf значения, это то, что вызывает ошибки в дальнейшем.

dt = delaunayTriangulation(X); 
figure 
[V,R] = voronoiDiagram(dt); 
V(1,:) = []; %// INTERESTING LINE, removes the Inf values 
tid = nearestNeighbor(dt,0,0,0); 
XR10 = V(R{tid},:); 
K = convhull(XR10); 
defaultFaceColor = [0.6875 0.8750 0.8984]; 
trisurf(K, XR10(:,1) ,XR10(:,2) ,XR10(:,3) , ... 
     'FaceColor', defaultFaceColor, 'FaceAlpha',0.9) 
title('3-D Voronoi Region') 

я получаю следующий сюжет:

enter image description here

+0

Я пробовал что-то вроде того, что вы предложили. Если вы нарисуете точки, используя plot3 (X (:, 1), X (:, 2), X (:, 3), '*'); и выполнить код, однако, все точки не поглощены этими многогранниками. Кроме того, если вы внимательно присмотритесь, это не похоже на то, что вороньи многогранники образуются вокруг каждой из этих точек. Я также хотел бы отметить, что изменение ближайших соседних точек в центр, большинство точек которого (116,166,15) дает немного больше покрытия, чем (0,0,0). Однако это еще не решило мою проблему. – Swathi

0

Из referenced documentation page:

Заметим, что регионы Вороного, связанные с точками на выпуклой оболочки не ограничены.

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

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

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

Это сложная геометрическая проблема, которую я не буду пытаться решить. Вы можете видеть, что метод MATLAB, основанный на триангуляции, использует для вычисления направления 2D-линий к бесконечности с использованием edit voronoi –, это может дать подсказки относительно того, как генерировать то же самое в 3D.