annotate scripts/plot/draw/private/__unite_shared_vertices__.m @ 22232:a8fd02bc895b

Overhaul isosurface.m and associated functions. * isosurface.m: Rewrite docstring and examples. Don't validate nargout. Wrap long lines to < 80 characters. Use names from docstring in code. Use "EdgeColor", "none" for Matlab compatibility, but preserve exception for gnuplot. Use blank lines between case statements for readability. Update demo #2 to properly show annotation textbox. Rewrite %!error tests. * __calc_isovalue_from_data__.m: Give private function a docstring. Use '_' in numbers as thousands separator for readability. Wrap long lines to < 80 characters. * __unite_shared_vertices__.m: Reformat docstring. Use rows() rather than size (XXX, 1). Wrap long lines to < 80 characters. Use space after function name and before parenthesis.
author Rik <rik@octave.org>
date Tue, 09 Aug 2016 11:09:38 -0700
parents 7680225527ef
children 3a2b891d0b33 e9a0469dedd9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22035
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
1 ## Copyright (C) 2016 Markus Muetzel
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
2 ##
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
3 ## This file is part of Octave.
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
4 ##
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
5 ## Octave is free software; you can redistribute it and/or modify it
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
6 ## under the terms of the GNU General Public License as published by
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
7 ## the Free Software Foundation; either version 3 of the License, or (at
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
8 ## your option) any later version.
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
9 ##
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
10 ## Octave is distributed in the hope that it will be useful, but
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
13 ## General Public License for more details.
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
14 ##
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
15 ## You should have received a copy of the GNU General Public License
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
16 ## along with Octave; see the file COPYING. If not, see
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
17 ## <http://www.gnu.org/licenses/>.
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
18
22072
7680225527ef maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents: 22035
diff changeset
19 ## -*- texinfo -*-
22035
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
20 ## @deftypefn {} {[@var{faces}, @var{vertices}, @var{J}] =} __unite_shared_vertices__ (@var{faces}, @var{vertices})
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
21 ##
22232
a8fd02bc895b Overhaul isosurface.m and associated functions.
Rik <rik@octave.org>
parents: 22072
diff changeset
22 ## Detect and unite shared vertices in patches.
22035
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
23 ##
22232
a8fd02bc895b Overhaul isosurface.m and associated functions.
Rik <rik@octave.org>
parents: 22072
diff changeset
24 ## Vertices of neighboring faces are detected and united to shared vertices.
a8fd02bc895b Overhaul isosurface.m and associated functions.
Rik <rik@octave.org>
parents: 22072
diff changeset
25 ## For this, the mutual squared distances between all vertices are
a8fd02bc895b Overhaul isosurface.m and associated functions.
Rik <rik@octave.org>
parents: 22072
diff changeset
26 ## calculated. If all coordinates are closer than
a8fd02bc895b Overhaul isosurface.m and associated functions.
Rik <rik@octave.org>
parents: 22072
diff changeset
27 ## @code{2 * eps (max (abs (vertices(:))))}, the vertices are united to one.
22035
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
28 ##
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
29 ## @var{J} holds the indices of the deleted vertices.
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
30 ##
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
31 ## @seealso{isosurface, reducepatch}
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
32 ## @end deftypefn
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
33
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
34 ## Author: mmuetzel
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
35
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
36 function [faces, vertices, J] = __unite_shared_vertices__ (faces, vertices)
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
37
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
38 J = [];
22232
a8fd02bc895b Overhaul isosurface.m and associated functions.
Rik <rik@octave.org>
parents: 22072
diff changeset
39
22035
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
40 ## Calculate the mutual differences of all vertex coordinates
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
41 close_points = zeros (0, 2);
22232
a8fd02bc895b Overhaul isosurface.m and associated functions.
Rik <rik@octave.org>
parents: 22072
diff changeset
42 num_vertices = rows (vertices);
22035
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
43 skip_point = false (num_vertices, 1);
22232
a8fd02bc895b Overhaul isosurface.m and associated functions.
Rik <rik@octave.org>
parents: 22072
diff changeset
44 ## FIXME: Can this be vectorized in some way to increase performance?
a8fd02bc895b Overhaul isosurface.m and associated functions.
Rik <rik@octave.org>
parents: 22072
diff changeset
45 ## Regardless, should probably allocate close_points to be the
a8fd02bc895b Overhaul isosurface.m and associated functions.
Rik <rik@octave.org>
parents: 22072
diff changeset
46 ## same size as the number of vertices and then truncate the
a8fd02bc895b Overhaul isosurface.m and associated functions.
Rik <rik@octave.org>
parents: 22072
diff changeset
47 ## array at the end of the calculation. Extending an array
a8fd02bc895b Overhaul isosurface.m and associated functions.
Rik <rik@octave.org>
parents: 22072
diff changeset
48 ## involves a copy operation every time.
22035
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
49 for (i_point1 = 1:num_vertices - 1)
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
50 if (skip_point(i_point1))
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
51 ## points already detected as duplicates can be skipped
22232
a8fd02bc895b Overhaul isosurface.m and associated functions.
Rik <rik@octave.org>
parents: 22072
diff changeset
52 continue;
22035
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
53 endif
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
54
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
55 diff = vertices(i_point1,:) - vertices(i_point1 + 1:end,:);
22232
a8fd02bc895b Overhaul isosurface.m and associated functions.
Rik <rik@octave.org>
parents: 22072
diff changeset
56 is_close_point = all (abs (diff) <= sqrt (3) * eps * ...
22035
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
57 (max (abs (vertices(i_point1,:)), abs (vertices(i_point1 + 1:end,:)))), 2);
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
58
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
59 if (any (is_close_point))
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
60 close_points_idx = find (is_close_point) + i_point1;
22232
a8fd02bc895b Overhaul isosurface.m and associated functions.
Rik <rik@octave.org>
parents: 22072
diff changeset
61 new_close_points_num = rows (close_points_idx);
22035
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
62 close_points(end + 1:end + new_close_points_num,1) = i_point1;
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
63 close_points(end - new_close_points_num + 1:end,2) = close_points_idx;
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
64 skip_point(close_points_idx) = true;
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
65 endif
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
66 endfor
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
67
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
68 if (! isempty (close_points))
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
69 vertices(close_points(:,2),:) = []; # delete multiple shared vertices
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
70 ## renumber deleted vertices in faces to the one it is replaced by
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
71 vertex_renum = 1:num_vertices;
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
72 vertex_renum(close_points(:,2)) = close_points(:,1);
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
73 faces = vertex_renum(faces);
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
74 ## renumber vertices in faces with subsequent numbers
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
75 vertex_renum2 = ones (1, num_vertices);
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
76 vertex_renum2(close_points(:,2)) = 0;
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
77 vertex_renum2 = cumsum (vertex_renum2);
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
78 faces = vertex_renum2(faces);
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
79
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
80 ## eliminate identical faces
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
81 faces = sort (faces, 2);
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
82 faces = unique (faces, "rows");
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
83
22232
a8fd02bc895b Overhaul isosurface.m and associated functions.
Rik <rik@octave.org>
parents: 22072
diff changeset
84 ## eliminate faces with zero area. Vertices in faces are sorted.
a8fd02bc895b Overhaul isosurface.m and associated functions.
Rik <rik@octave.org>
parents: 22072
diff changeset
85 is_zero_area = (faces(:,1) == faces(:,2)) | (faces(:,2) == faces(:,3));
a8fd02bc895b Overhaul isosurface.m and associated functions.
Rik <rik@octave.org>
parents: 22072
diff changeset
86 faces = faces(! is_zero_area, :);
22035
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
87
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
88 J = close_points(:,2);
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
89 endif
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
90
634fbedbfb5b Additional functionality for isosurface.m (bug #46946)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
91 endfunction
22232
a8fd02bc895b Overhaul isosurface.m and associated functions.
Rik <rik@octave.org>
parents: 22072
diff changeset
92