Home > matGeom > meshes3d > trimMesh.m

trimMesh

PURPOSE ^

TRIMMESH Reduce memory footprint of a polygonal mesh.

SYNOPSIS ^

function varargout = trimMesh(varargin)

DESCRIPTION ^

TRIMMESH Reduce memory footprint of a polygonal mesh.

   [V2, F2] = trimMesh(V, F)
   Unreferenced vertices are removed.
   Following functions are implemented only for numeric faces:
       Duplicate vertices are removed.
       Duplicate faces are removed.

   Example
     [V, F] = createIcosahedron;
     F(13:20, :) = [];
     [V2, F2] = trimMesh(V, F);
     figure; drawMesh(V2, F2)
     view(3); axis equal;
     axis([-1 1 -1 1 0 2])

   See also
     meshes3d, clipMeshVertices

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function varargout = trimMesh(varargin)
0002 %TRIMMESH Reduce memory footprint of a polygonal mesh.
0003 %
0004 %   [V2, F2] = trimMesh(V, F)
0005 %   Unreferenced vertices are removed.
0006 %   Following functions are implemented only for numeric faces:
0007 %       Duplicate vertices are removed.
0008 %       Duplicate faces are removed.
0009 %
0010 %   Example
0011 %     [V, F] = createIcosahedron;
0012 %     F(13:20, :) = [];
0013 %     [V2, F2] = trimMesh(V, F);
0014 %     figure; drawMesh(V2, F2)
0015 %     view(3); axis equal;
0016 %     axis([-1 1 -1 1 0 2])
0017 %
0018 %   See also
0019 %     meshes3d, clipMeshVertices
0020 
0021 % ------
0022 % Author: David Legland, oqilipo
0023 % e-mail: david.legland@inra.fr
0024 % Created: 2014-08-01,    using Matlab 8.3.0.532 (R2014a)
0025 % Copyright 2014 INRA - Cepia Software Platform.
0026 
0027 % parse input data
0028 [vertices, faces] = parseMeshData(varargin{:});
0029 
0030 if isnumeric(faces)
0031     % Delete duplicate vertices
0032     [tempVertices, ~, tempFaceVertexIdx] = unique(vertices, 'rows');
0033     tempFaces = tempFaceVertexIdx(faces);
0034     % Delete unindexed/unreferenced vertices
0035     usedVertexIdx = ismember(1:length(tempVertices),unique(tempFaces(:)));
0036     newVertexIdx = cumsum(usedVertexIdx);
0037     faceVertexIdx = 1:length(tempVertices);
0038     faceVertexIdx(usedVertexIdx) = newVertexIdx(usedVertexIdx);
0039     faceVertexIdx(~usedVertexIdx) = nan;
0040     tempFaces2 = faceVertexIdx(tempFaces);
0041     tempVertices2 = tempVertices(usedVertexIdx,:);
0042     % Delete duplicate faces
0043     [~, uniqueFaceIdx, ~] = unique(tempFaces2, 'rows');
0044     duplicateFaceIdx=~ismember(1:size(tempFaces2,1),uniqueFaceIdx);
0045     [vertices2, faces2] = removeMeshFaces(tempVertices2, tempFaces2, duplicateFaceIdx);
0046 elseif iscell(faces)
0047     % identify vertices referenced by a face
0048     vertexUsed = false(size(vertices, 1), 1);
0049     for iFace = 1:length(faces)
0050         face = faces{iFace};
0051         vertexUsed(face) = true;
0052     end
0053     vertices2 = vertices(vertexUsed, :);
0054     % compute map from old index to new index
0055     inds = find(vertexUsed);
0056     newInds = zeros(size(vertices, 1), 1);
0057     for iIndex = 1:length(inds)
0058         newInds(inds(iIndex)) = iIndex;
0059     end
0060     % change labels of vertices referenced by faces
0061     faces2 = cell(1, length(faces));
0062     for iFace = 1:length(faces)
0063         faces2{iFace} = newInds(faces{iFace});
0064     end
0065 else
0066     error('Unsupported format!')
0067 end
0068 
0069 % format output arguments
0070 varargout = formatMeshOutput(nargout, vertices2, faces2);

Generated on Wed 16-Feb-2022 15:10:47 by m2html © 2003-2019