REMOVEINVALIDBORDERFACES Remove faces whose edges are connected to 3, 3, and 1 faces. [V2, F2] = removeInvalidBorderFaces(V, F) Example removeInvalidBorderFaces See also isManifoldMesh, collapseEdgesWithManyFaces
0001 function [vertices, faces] = removeInvalidBorderFaces(varargin) 0002 %REMOVEINVALIDBORDERFACES Remove faces whose edges are connected to 3, 3, and 1 faces. 0003 % 0004 % [V2, F2] = removeInvalidBorderFaces(V, F) 0005 % 0006 % Example 0007 % removeInvalidBorderFaces 0008 % 0009 % See also 0010 % isManifoldMesh, collapseEdgesWithManyFaces 0011 0012 % ------ 0013 % Author: David Legland 0014 % e-mail: david.legland@inra.fr 0015 % Created: 2019-01-31, using Matlab 9.5.0.944444 (R2018b) 0016 % Copyright 2019 INRA - Cepia Software Platform. 0017 0018 vertices = varargin{1}; 0019 faces = varargin{2}; 0020 0021 % compute edge to vertex array 0022 if nargin == 3 0023 edges = faces; 0024 faces = varargin{3}; 0025 else 0026 % compute edge to vertex array 0027 edges = meshEdges(faces); 0028 end 0029 0030 % compute face to edge indices array 0031 % as a nFaces-by-3 array (each face connected to exactly three edges) 0032 faceEdgeInds = meshFaceEdges(vertices, edges, faces); 0033 0034 % compute number of faces incident each edge 0035 edgeFaces = trimeshEdgeFaces(faces); 0036 edgeFaceDegrees = sum(edgeFaces > 0, 2); 0037 0038 % for each face, concatenate the face degree of each edge 0039 faceEdgeDegrees = zeros(size(faces, 1), 3); 0040 for iFace = 1:size(faces, 1) 0041 edgeInds = faceEdgeInds{iFace}; 0042 faceEdgeDegrees(iFace, :) = edgeFaceDegrees(edgeInds); 0043 end 0044 0045 % remove faces containing edges connected to 1 face and edges connected to 0046 % 3 faces 0047 inds = sum(faceEdgeDegrees == 1, 2) > 0 & sum(faceEdgeDegrees == 3, 2); 0048 % inds = sum(ismember(faceEdgeDegrees, [1 3 4]), 2) == 3; 0049 faces(inds, :) = [];