我在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];
如何从网格中删除这些顶点集并相应地更新面列表? 我希望网格的拓扑结构保持不变(即删除的面需要替换为不经过删除顶点的面)。
谢谢!
答案 0 :(得分:1)
最容易做的事情(如果你只想显示网格物体)只是将它们的值设置为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;
答案 1 :(得分:0)
上述解决方案遇到一些问题,但仍想从面部和顶点清除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