从 Matlab 的等值面中删除顶点

Removing a vertex from Matlab's isosurface

我在 MATLAB 中有一个等值面数据。例如:

[x,y,z,v] = flow;
FV = isosurface(x,y,z,v);

FV = 

vertices: [4208x3 double]
   faces: [8192x3 double]

我还有一个要删除的顶点索引列表:

 verticesToRemove = [1183, 1852, 2219, 1925, 3684];

如何从网格中删除这些顶点集并相应地更新面列表? 我希望网格的拓扑结构保持不变(即删除的面需要用不经过删除顶点的面替换)。

谢谢!

最简单的事情(如果你只想显示网格)就是简单地将它们的值设置为 NaN,然后你就不必更新你的 Faces 矩阵和所有使用这些顶点的面将在渲染过程中被忽略。

FV.vertices(verticesToRemove,:) = NaN;

如果您确实想更新要在别处使用的结构,您可以重新计算面。删除顶点后。

% Remove the vertex values at the specified index values
newVertices = FV.vertices;
newVertices(verticesToRemove,:) = [];

% Find the new index for each of the new vertices
[~, newVertexIndex] = ismember(FV.vertices, newVertices, 'rows');

% Find any faces that used the vertices that we removed and remove them
newFaces = FV.faces(all(FV.faces ~= verticesToRemove, 2),:);

% Now update the vertex indices to the new ones
newFaces = newVertexIndex(newFaces);

FV.vertices = newVertices;
FV.faces = newFaces;

我在使用上述解决方案时遇到了一些问题,但仍想从我的面和顶点中清除 nan 值以节省一些内存和时间:

for i = length(FV.vertices):-1:1
    if any(isnan(FV.vertices(i,:)))
        FV.faces(any(FV.faces==i,2), :) = []; % remove faces
        FV.vertices(i,:) = []; % remove vertices
        FV.faces(FV.faces>i) = FV.faces(FV.faces>i)-1; % slide indices
    end
end