Я пытаюсь нарисовать многогранники voronoi в 3D вокруг множества точек (которые являются координатами положения датчиков), размещенных на человеческом кадре. Я нашел несколько способов сделать это в MATLAB. За исключением того, что ни один из них не дает мне правильный вид многогранников. Я понимаю, что voronoi в 3D для набора точек должен выглядеть так.Рисунок 3D voronoi polyhedrons над точками человеческого тела в MATLAB
Как я ожидал, что график выглядеть следующим образом:
Для моего набора точек данных, Вороной многогранники не инкапсулировать все точки. Многогранники voronoi, которые сформированы из моих данных, выглядят примерно так:
.
координаты моего набора данных являются:
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
Я пробовал что-то вроде того, что вы предложили. Если вы нарисуете точки, используя plot3 (X (:, 1), X (:, 2), X (:, 3), '*'); и выполнить код, однако, все точки не поглощены этими многогранниками. Кроме того, если вы внимательно присмотритесь, это не похоже на то, что вороньи многогранники образуются вокруг каждой из этих точек. Я также хотел бы отметить, что изменение ближайших соседних точек в центр, большинство точек которого (116,166,15) дает немного больше покрытия, чем (0,0,0). Однако это еще не решило мою проблему. – Swathi