0001 function varargout = concatenateMeshes(varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032 assert(~isempty(varargin))
0033
0034 if isstruct(varargin{1})
0035 VF_fields = {'vertices','faces'};
0036
0037 errorStructFields=['If the first input argument is a struct '...
0038 'with the fields vertices and faces the additonal ' ...
0039 'arguments must have the same format'];
0040
0041 assert(all(cellfun(@isstruct, varargin)), errorStructFields)
0042
0043 assert(all(cellfun(@(x) all(ismember(VF_fields, ...
0044 fieldnames(x))), varargin)), errorStructFields)
0045
0046
0047 for s = 1:length(varargin)
0048 delFields = fieldnames(varargin{s});
0049 delFields(ismember(fieldnames(varargin{s}), VF_fields))=[];
0050 varargin{s} = rmfield(varargin{s}, delFields);
0051 end
0052
0053
0054 if isscalar(varargin)
0055 errorArgAndStructLength = ['If the input is only one struct ' ...
0056 'it has to contain more than one mesh.'];
0057 assert(length(varargin{1})>1, ...
0058 errorArgAndStructLength)
0059 end
0060
0061
0062 varargin = cellfun(@(x) orderfields(x, VF_fields),varargin, 'UniformOutput',0);
0063
0064
0065 varargin = cellfun(@struct2cell, varargin, 'UniformOutput', false);
0066 varargin = cellfun(@squeeze, varargin, 'UniformOutput',0);
0067 varargin = reshape([varargin{:}],[],1)';
0068 end
0069
0070 NoA = length(varargin);
0071 assert(mod(NoA,2)==0);
0072
0073 cellfun(@(x) validateattributes(x, {'numeric'},...
0074 {'size',[NaN,3],'finite'}), varargin(1:2:end))
0075 cellfun(@(x) validateattributes(x, {'numeric'},...
0076 {'integer'}), varargin(2:2:end))
0077
0078 errorFacesRows='The faces of all meshes must have the same number of columns';
0079 assert(isscalar(unique(cellfun(@(x) size(x,2), varargin(2:2:end)))), errorFacesRows)
0080
0081
0082
0083 v = [];
0084 f = [];
0085 for m = 1:NoA/2
0086 vm = varargin{2*m-1};
0087 fm = varargin{2*m};
0088 f = [f; fm+size(v,1)];
0089 v = [v; vm];
0090 end
0091
0092
0093
0094 [v, f] = trimMesh(v, f);
0095
0096 switch nargout
0097 case 1
0098 mesh.vertices = v;
0099 mesh.faces = f;
0100 varargout{1} = mesh;
0101 case 2
0102 varargout{1} = v;
0103 varargout{2} = f;
0104 end