Mercurial > octave
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 |
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 |