1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- function M = spm_mesh_inflate(M,T,S)
- % Surface mesh inflation
- % FORMAT M = spm_mesh_inflate(M,T,S)
- %
- % M - surface mesh structure (see patch) or GIfTI object
- % or handle to a patch in a figure
- % T - number of time steps [default: Inf (auto)]
- % S - update display every S time steps [default: 0 (never)]
- %__________________________________________________________________________
- % Copyright (C) 2009-2011 Wellcome Trust Centre for Neuroimaging
- % Guillaume Flandin & Jean Daunizeau
- % $Id: spm_mesh_inflate.m 6535 2015-08-25 11:45:26Z vladimir $
- if nargin < 3, S = 0; end
- if ishandle(M)
- v = double(get(M,'Vertices'));
- f = get(M,'Faces');
- p = M;
- else
- v = double(M.vertices);
- f = double(M.faces);
-
- h = figure('visible','off');
- a = axes('parent',h);
- if isa(M,'gifti')
- p = patch(export(M,'patch'),'parent',a,'visible','off');
- else
- p = patch(M,'parent',a,'visible','off');
- end
- S = 0;
- end
- % Parameters
- %--------------------------------------------------------------------------
- b = 0.5;
- w = 0.05;
- if nargin < 2 || isinf(T)
- T = floor(size(v,1) * 0.003 - 2);
- T = max(T,1);
- end
- % Compute (normalised) adjacency matrix
- %--------------------------------------------------------------------------
- A = spm_mesh_adjacency(f);
- A = sparse(1:size(v,1),1:size(v,1),1./sum(A,2)) * A;
- % Compute bounding box
- %--------------------------------------------------------------------------
- minxyz = min(v);
- maxxyz = max(v);
- % Iteratively apply forces to vertices
- %--------------------------------------------------------------------------
- for i=1:T
-
- % Compute unit normals
- %----------------------------------------------------------------------
- N = spm_mesh_normals(p,1);
- % Compute smoothing force
- %----------------------------------------------------------------------
- mv = A*v - v;
- % Update vertices position
- %----------------------------------------------------------------------
- v = v + b * (w*repmat(sum(mv.*N,2),1,3).*N + (1-w)*mv);
- v = mean((maxxyz - minxyz)./(max(v) - min(v))) * v;
-
- set(p,'Vertices',v);
-
- % Update display
- %----------------------------------------------------------------------
- if ~mod(i,S)
- axis(get(p,'parent'),'image');
- drawnow
- end
-
- end
- % Cleanup
- %--------------------------------------------------------------------------
- if ~ishandle(M)
- M.vertices = v;
- close(h);
- end
|