rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
remove_duplicate_vertices.m
1 function ngrid = remove_duplicate_vertices(grid , epsilon )
2 %function ngrid = remove_duplicate_vertices(grid [, epsilon])
3 % method to be used, if a vertex list in the grid should be compressed
4 %
5 % This might be required after refinement of a grid, merging of grids, etc.
6 % Duplicate detection is based on l2-error deviation thresholded by 'epsilon'.
7 %
8 % Parameters:
9 % epsilon: l2-error deviation threshold. (Default = '1e-6')
10 %
11 % Return values:
12 % ngrid: the compressed grid
13 
14 % Bernard Haasdonk 15.3.2007
15 
16 % detect duplicates in current vertex list wrt. epsilon derivation
17 
18  if nargin < 2
19  epsilon = 1e-6;
20  end;
21 
22  [un_id, dupl_id, un_id_of_dupl] = ...
23  detect_duplicate_rows(grid.vertex, epsilon);
24  % i.e. vector with index dupl_id(1) is identical to vector un_id_of_dupl(1)
25 
26  ngrid = grid;
27 
28  % only perform compression, if required
29  if ~isempty(dupl_id)
30  % generate compressed vertex list
31  ngrid.vertex = ngrid.vertex(un_id,:);
32 
33  % construct vertex-index-translation map
34  % such that new_id(dupl_id(1)) = un_id_of_dupl(1)
35  % and new_id(un_id(1)) = un_id(1);
36  new_id = -ones(max(max(grid.vertexindex)),1);
37  new_id(un_id) = 1:length(un_id);
38  new_id(dupl_id) = new_id(un_id_of_dupl);
39 
40  % perform vertex-index-translation
41  vertexindex_vector = new_id(grid.vertexindex(:));
42  ngrid.vertexindex = reshape(vertexindex_vector, ...
43  size(grid.vertexindex));
44 
45  if ~isempty(find(vertexindex_vector <= 0,1))
46  error('translation map erroneous');
47  end;
48 
49  ngrid.nvertices = size(ngrid.vertex,1);
50 
51  end;
52 
53 end
54