Определите грани неправильного почти выпуклого многогранника по координатам вершин и постройте твердое тело в 3D

У меня есть вершины неправильного почти выпуклого многогранника, например что-то похожее на икосаэдр:

xyz = [0.8198   -0.1474 -0.5534;
   0.3944   0.4688  0.7904;
   0.6851   0.6826  -0.2545;
  -0.6855   0.4451  0.5762;
   0.2117   -0.8247 -0.5245;
   0.8263   -0.3318 0.455;
  -0.8393   -0.502  -0.2086;
  -0.0868   -0.9484 0.305;
  -0.1256   0.9915  -0.0353;
  -0.304    -0.3252 0.8954;
  -0.7964   0.4053  -0.4489;
  -0.0817   0.1043  -0.9912];

Я хочу идентифицировать ребра и грани многоугольника и построить твердое тело в 3D. Это то, что я пробовал, но, хотя и достаточно близко, это выглядит неправильно:

x = xyz(:, 1);
y = xyz(:, 2);
z = xyz(:, 3);
tri = delaunay(x, y, z);
tetramesh(tri, xyz)

РЕДАКТИРОВАТЬ --> Следуя ответу Криса Тейлора, я понял, что должен также указать, что желаемые выходные «лица» должны быть массивом ячеек, где каждый элемент представляет собой вектор из k индексов, представляющих вершины этого лица; и аналогичным образом «ребра» должны быть матрицей, где каждая строка представляет собой вектор из 2 индексов, представляющих вершины, которые соединяет ребро

Есть идеи?

P.S. Я пытался добавить теги: многогранник, твердое тело, делоне и тетрамеш, но система не позволила мне это сделать - возможно, кто-то, у кого есть право создавать новые теги, мог бы сделать это за меня? Может быть, удалить менее точные теги, такие как «участок», «ребра», «вершины», «многоугольники»?


person Community    schedule 27.10.2013    source источник


Ответы (2)


Это делает то, что вы хотите?

>> tri = delaunay3(x, y, z); // coordinates of *tetrahedrons* not triangles
>> tetramesh(tri, xyz);

введите здесь описание изображения

person Chris Taylor    schedule 27.10.2013
comment
Это еще не то, что я хотел, но delauney3, кажется, работает намного лучше, чем delauney - конечно! Спасибо! Я хочу найти грани и ребра многогранника: каждую грань можно хранить в ячейке с индексами k вершин и каждое ребро в матрице с индексами двух вершин. - person ; 27.10.2013
comment
Не должно быть слишком сложно получить грани и края. Для каждого тетраэдра, возвращаемого delaunay3, будет одна вершина внутри выпуклой оболочки многогранника и три вершины на выпуклой оболочке. Грань определяется тремя вершинами на выпуклой оболочке, и каждая пара вершин определяет ребро (вы можете легко удалить повторяющиеся ребра). - person Chris Taylor; 28.10.2013

После комментария Криса Тейлора я попробовал это:

x = xyz(:, 1);
y = xyz(:, 2);
z = xyz(:, 3);
dt = DelaunayTri(xyz);
[ch v] = convexHull(dt);
h_tri = trisurf(ch, dt.X(:,1), dt.X(:,2), dt.X(:,3), 'FaceColor', 'cyan');
hold on
h_plot = scatter3(x, y, z, 'filled', 'MarkerFaceColor', 'r');
axis square
axis off

Это больше похоже на то, что я имел в виду, и переменная «ch» хранит вершины каждой треугольной грани, чего я и хотел.

Единственное, что меня разочаровывает — но это, вероятно, потребует гораздо большего анализа с моей стороны, — это то, что я знаю, что этот многогранник должен выглядеть как неправильный икосаэдр (возможно, не выпуклый, а «почти» выпуклый). ), а приведенный выше код находит только внешний слабовыпуклый многогранник, в который вписан мой неправильный икосаэдр. Как я уже сказал, я думаю, что мне придется работать над этим гораздо больше.

person Community    schedule 27.10.2013