spm_mesh_distmtx.m 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. function D = spm_mesh_distmtx(M,order)
  2. % Compute the distance matrix of a triangle mesh
  3. % FORMAT D = spm_mesh_distmtx(M,order)
  4. % M - patch structure
  5. % order - 0: adjacency matrix
  6. % 1: first order distance matrix [default]
  7. % 2: second order distance matrix
  8. %
  9. % D - distance matrix
  10. %__________________________________________________________________________
  11. % Copyright (C) 2008 Wellcome Trust Centre for Neuroimaging
  12. % Guillaume Flandin
  13. % $Id: spm_mesh_distmtx.m 4035 2010-08-05 18:54:32Z guillaume $
  14. if nargin < 2, order = 1; end
  15. if order > 2, error('High order distance matrix not handled.'); end
  16. %-Adjacency matrix
  17. %--------------------------------------------------------------------------
  18. if order == 0
  19. D = spm_mesh_adjacency(M);
  20. return;
  21. end
  22. %-First order distance matrix
  23. %--------------------------------------------------------------------------
  24. if isstruct(M) && ~isa(M.faces,'double')
  25. M.faces = double(M.faces);
  26. elseif isa(M,'gifti')
  27. M = export(M,'patch');
  28. M.faces = double(M.faces);
  29. end
  30. d = M.vertices(M.faces(:,[1 2 3]),:) - M.vertices(M.faces(:,[2 3 1]),:);
  31. D = sparse([M.faces(:,1); M.faces(:,2); M.faces(:,3)], ...
  32. [M.faces(:,2); M.faces(:,3); M.faces(:,1)], sqrt(sum(d.^2, 2)));
  33. D = (D + D')/2;
  34. if order == 1, return; end
  35. %-Second order distance matrix
  36. %--------------------------------------------------------------------------
  37. D2 = D;
  38. for i=1:size(M.vertices,1)
  39. a = find(D2(i,:));
  40. [b,c] = find(D2(a,:));
  41. D(i,c) = D(i,a(b)) + diag(D(a(b),c))';
  42. D(c,i) = D(i,c)';
  43. end