从Matlab的等值面去除顶点

时间:2016-06-02 15:30:01

标签: matlab computer-vision point-clouds

我在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];

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

谢谢!

2 个答案:

答案 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