annotate scripts/plot/draw/reducepatch.m @ 27919:1891570abac8

update Octave Project Developers copyright for the new year In files that have the "Octave Project Developers" copyright notice, update for 2020.
author John W. Eaton <jwe@octave.org>
date Mon, 06 Jan 2020 22:29:51 -0500
parents b442ec6dda5c
children bd51beb6205e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27919
1891570abac8 update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents: 27918
diff changeset
1 ## Copyright (C) 2016-2020 The Octave Project Developers
27918
b442ec6dda5c use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents: 26691
diff changeset
2 ##
b442ec6dda5c use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents: 26691
diff changeset
3 ## See the file COPYRIGHT.md in the top-level directory of this distribution
b442ec6dda5c use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents: 26691
diff changeset
4 ## or <https://octave.org/COPYRIGHT.html/>.
b442ec6dda5c use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents: 26691
diff changeset
5 ##
22243
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
6 ##
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
7 ## This file is part of Octave.
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
8 ##
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 24423
diff changeset
9 ## Octave is free software: you can redistribute it and/or modify it
22243
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
10 ## under the terms of the GNU General Public License as published by
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 24423
diff changeset
11 ## the Free Software Foundation, either version 3 of the License, or
22755
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22295
diff changeset
12 ## (at your option) any later version.
22243
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
13 ##
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
14 ## Octave is distributed in the hope that it will be useful, but
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
15 ## WITHOUT ANY WARRANTY; without even the implied warranty of
22755
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22295
diff changeset
16 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22295
diff changeset
17 ## GNU General Public License for more details.
22243
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
18 ##
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
19 ## You should have received a copy of the GNU General Public License
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
20 ## along with Octave; see the file COPYING. If not, see
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 24423
diff changeset
21 ## <https://www.gnu.org/licenses/>.
22243
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
22
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
23 ## -*- texinfo -*-
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
24 ## @deftypefn {} {@var{reduced_fv} =} reducepatch (@var{fv})
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
25 ## @deftypefnx {} {@var{reduced_fv} =} reducepatch (@var{faces}, @var{vertices})
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
26 ## @deftypefnx {} {@var{reduced_fv} =} reducepatch (@var{patch_handle})
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
27 ## @deftypefnx {} {} reducepatch (@var{patch_handle})
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
28 ## @deftypefnx {} {@var{reduced_fv} =} reducepatch (@dots{}, @var{reduction_factor})
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
29 ## @deftypefnx {} {@var{reduced_fv} =} reducepatch (@dots{}, "fast")
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
30 ## @deftypefnx {} {@var{reduced_fv} =} reducepatch (@dots{}, "verbose")
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
31 ## @deftypefnx {} {[@var{reduced_faces}, @var{reduces_vertices}] =} reducepatch (@dots{})
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
32 ##
22245
3d287a11ea18 doc: Clarify that reducepatch only works on patches, not surfaces.
Rik <rik@octave.org>
parents: 22243
diff changeset
33 ## Reduce the number of faces and vertices in a patch object while retaining
3d287a11ea18 doc: Clarify that reducepatch only works on patches, not surfaces.
Rik <rik@octave.org>
parents: 22243
diff changeset
34 ## the overall shape of the patch.
22243
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
35 ##
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
36 ## The input patch can be represented by a structure @var{fv} with the
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
37 ## fields @code{faces} and @code{vertices}, by two matrices @var{faces} and
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
38 ## @var{vertices} (see, e.g., the result of @code{isosurface}), or by a
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
39 ## handle to a patch object @var{patch_handle} (@pxref{XREFpatch,,patch}).
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
40 ##
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
41 ## The number of faces and vertices in the patch is reduced by iteratively
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
42 ## collapsing the shortest edge of the patch to its midpoint (as discussed,
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
43 ## e.g., here:
25143
13fd0610480f doc: Use https whenever possible in @url entries.
Rik <rik@octave.org>
parents: 25054
diff changeset
44 ## @url{https://libigl.github.io/libigl/tutorial/tutorial.html#meshdecimation}).
22243
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
45 ##
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
46 ## Currently, only patches consisting of triangles are supported. The
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
47 ## resulting patch also consists only of triangles.
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
48 ##
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
49 ## If @code{reducepatch} is called with a handle to a valid patch
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
50 ## @var{patch_handle}, and without any output arguments, then the given
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
51 ## patch is updated immediately.
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
52 ##
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
53 ## If the @var{reduction_factor} is omitted, the resulting structure
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
54 ## @var{reduced_fv} includes approximately 50% of the faces of the original
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
55 ## patch. If @var{reduction_factor} is a fraction between 0 (excluded) and 1
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
56 ## (excluded), a patch with approximately the corresponding fraction of faces
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
57 ## is determined.
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
58 ## If @var{reduction_factor} is an integer greater than or equal to 1, the
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
59 ## resulting patch has approximately @var{reduction_factor} faces. Depending
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
60 ## on the geometry of the patch, the resulting number of faces can differ from
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
61 ## the given value of @var{reduction_factor}. This is especially true when
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
62 ## many shared vertices are detected.
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
63 ##
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
64 ## For the reduction, it is necessary that vertices of touching faces are
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
65 ## shared. Shared vertices are detected automatically. This detection can be
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
66 ## skipped by passing the optional string argument @qcode{"fast"}.
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
67 ##
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
68 ## With the optional string arguments @qcode{"verbose"}, additional status
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
69 ## messages are printed to the command window.
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
70 ##
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
71 ## Any string input arguments must be passed after all other arguments.
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
72 ##
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
73 ## If called with one output argument, the reduced faces and vertices are
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
74 ## returned in a structure @var{reduced_fv} with the fields @code{faces} and
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
75 ## @code{vertices} (see the one output option of @code{isosurface}).
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
76 ##
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
77 ## If called with two output arguments, the reduced faces and vertices are
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
78 ## returned in two separate matrices @var{reduced_faces} and
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
79 ## @var{reduced_vertices}.
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
80 ##
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
81 ## @seealso{isosurface, isonormals, reducevolume, patch}
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
82 ## @end deftypefn
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
83
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
84 ## Author: mmuetzel
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
85
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
86 ## FIXME: Convert faces to only triangles if necessary
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
87
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
88 function varargout = reducepatch (varargin)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
89
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
90 if (nargin < 1 || nargin > 5)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
91 print_usage ();
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
92 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
93
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
94 [faces, vertices, max_faces, patch_handle, fast, verbose] = ...
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
95 __get_check_reducepatch_args__ (varargin{:});
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
96
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
97 if (verbose)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
98 printf (["reducepatch: before reduction of faces: ", ...
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
99 "%5d faces, %5d vertices\n"], rows (faces), rows (vertices));
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
100 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
101
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
102 if (max_faces >= rows (faces))
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
103 faces_reduced = faces;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
104 vertices_reduced = vertices;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
105 else
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
106 if (! fast)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
107 [faces, vertices] = __unite_shared_vertices__ (faces, vertices);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
108
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
109 if (verbose)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
110 printf (["reducepatch: after detection of shared vertices: ", ...
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
111 "%5d faces, %5d vertices\n"], rows (faces), rows (vertices));
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
112 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
113 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
114
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
115 [faces_reduced, vertices_reduced] = ...
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
116 __reducepatch__ (vertices, faces, max_faces, verbose);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
117 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
118
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
119 if (verbose)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
120 printf (["reducepatch: after reduction of faces: ", ...
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
121 "%5d faces, %5d vertices\n"], ...
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
122 rows (faces_reduced), rows (vertices_reduced));
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
123 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
124
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
125 ## output
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
126 if (! isempty (patch_handle) && nargout == 0)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
127 ## update patch object
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
128 set (patch_handle, "Faces", faces_reduced, "Vertices", vertices_reduced);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
129 elseif (nargout == 2) # faces, vertices
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
130 varargout{1} = faces_reduced;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
131 varargout{2} = vertices_reduced;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
132 else # fv structure
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
133 varargout{1}.faces = faces_reduced;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
134 varargout{1}.vertices = vertices_reduced;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
135 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
136
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
137 endfunction
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
138
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
139 ## assign input parameters and check their validity
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
140 function [faces, vertices, max_faces, patch_handle, fast, verbose] = ...
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
141 __get_check_reducepatch_args__ (varargin)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
142
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
143 ## default values
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
144 faces = vertices = max_faces = patch_handle = [];
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
145 reduction_factor = 0.5;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
146 fast = verbose = false;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
147
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
148 num_string_inputs = 0;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
149 ## check whether last 2 input arguments are strings and assign parameters
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
150 valid_vals = nargin:-1:nargin-1;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
151 valid_vals(valid_vals < 1) = [];
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
152 for arg = varargin(valid_vals)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
153 if (! ischar (arg{1}))
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
154 break; # no string arguments at end, exit checking
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
155 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
156 switch (tolower (arg{1}))
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
157 case {"f", "fast"}
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
158 fast = true;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
159 num_string_inputs += 1;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
160
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
161 case {"v", "verbose"}
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
162 verbose = true;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
163 num_string_inputs += 1;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
164
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
165 case ""
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
166 num_string_inputs++;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
167 ## silently ignore empty strings
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
168
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
169 otherwise
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
170 error ("reducepatch: parameter '%s' not supported", arg{1});
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
171
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
172 endswitch
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
173 endfor
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
174
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
175 ## get faces and vertices
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
176 i_fv = 1;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
177 arg1 = varargin{1};
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
178 if (isstruct (arg1))
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
179 if (all (isfield (arg1, {"vertices", "faces"})))
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
180 vertices = arg1.vertices;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
181 faces = arg1.faces;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
182 else
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
183 error (["reducepatch: struct FV must contain the fields ", ...
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
184 "'vertices' and 'faces'."]);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
185 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
186 elseif (isscalar (arg1))
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
187 patch_handle = arg1;
24423
1d52db450db4 Change ishandle to return true for Java objects for Matlab compatibility.
Rik <rik@octave.org>
parents: 24188
diff changeset
188 if (isgraphics (patch_handle, "patch"))
22243
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
189 vertices = get (patch_handle, "Vertices");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
190 faces = get (patch_handle, "Faces");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
191 else
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
192 error ("reducepatch: PATCH_HANDLE must be a valid handle to a patch");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
193 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
194 elseif (ismatrix (arg1))
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
195 faces = arg1;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
196 if (nargin - num_string_inputs > 1 && ismatrix (varargin{2}))
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
197 vertices = varargin{2};
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
198 i_fv = 2;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
199 else
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
200 error (["reducepatch: If first argument is a matrix containing ", ...
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
201 "FACES, second argument must be a matrix containing VERTICES"]);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
202 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
203 else
26691
f2bb4f2093b9 Fix print_usage() messages in subfunctions (bug #55599).
Rik <rik@octave.org>
parents: 26376
diff changeset
204 print_usage ("reducepatch");
22243
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
205 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
206
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
207 ## get reduction_factor
22295
12f1d273d22a maint: Remove trailing spaces from code.
Rik <rik@octave.org>
parents: 22245
diff changeset
208 if (nargin - num_string_inputs > i_fv)
22243
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
209 reduction_factor = varargin{i_fv + 1};
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
210 if (! isscalar (reduction_factor) || reduction_factor <= 0)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
211 error ("reducepatch: REDUCTION_FACTOR must be a positive scalar");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
212 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
213 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
214
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
215 ## check faces and vertices
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
216 if (columns (vertices) != 3)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
217 error ("reducepatch: VERTICES must be an Mx3 matrix");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
218 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
219 if (columns (faces) != 3)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
220 ## FIXME: Convert faces to only triangles if necessary
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
221 error ("reducepatch: Currently patches must consist of triangles only");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
222 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
223 if (any (mod (faces(:), 1)) || any (faces(:) < 1))
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
224 error ("reducepatch: FACES must consist of positive integer indices only");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
225 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
226 if (max (faces(:)) > rows (vertices))
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
227 error ("reducepatch: not enough VERTICES for given FACES");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
228 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
229
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
230 ## get max_faces
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
231 num_faces = rows (faces);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
232 if (reduction_factor < 1)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
233 max_faces = floor (num_faces * reduction_factor);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
234 else
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
235 max_faces = reduction_factor;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
236 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
237
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
238 endfunction
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
239
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
240 ## actual function to reduce number of faces
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
241 function [faces_reduced, vertices_reduced] = ...
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
242 __reducepatch__ (vertices, faces, max_faces, verbose)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
243
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
244 num_faces = rows (faces);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
245 faces = sort (faces, 2);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
246
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
247 ## get all unique edges
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
248 all_edges = sort ([faces(:,1) faces(:,2);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
249 faces(:,2) faces(:,3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
250 faces(:,3) faces(:,1)], 2);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
251 edges = unique (all_edges, "rows");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
252 num_edges = rows (edges);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
253
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
254 ## calculate length of edges
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
255 edge_length = norm (vertices(edges(:,1),:) - vertices(edges(:,2),:), ...
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
256 2, "rows");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
257
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
258 if (verbose)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
259 printf ("reducepatch: reducing number of faces");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
260 ## do not spam the command window with dots if many faces are collapsed
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
261 verbose_stepwidth = (num_faces - max_faces) / 100; # max. 100 dots
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
262 verbose_counter = 0;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
263 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
264
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
265 ## reduce number of faces
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
266 clean_finish = true;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
267 do
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
268 ## find shortest edge
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
269 i_shortest_edge = find (edge_length == min (edge_length), 1, "first");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
270 if (any (isinf (vertices(edges(i_shortest_edge,:),:))))
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
271 warning (["reducepatch: shortest edge is marked as deleted. ", ...
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
272 "This should never happen."])
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
273 clean_finish = false;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
274 break;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
275 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
276
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
277 start_point_idx = edges(i_shortest_edge,1);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
278 end_point_idx = edges(i_shortest_edge,2);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
279
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
280 ## collapse the edge to its midpoint
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
281 vertices(start_point_idx,:) = 0.5 * ...
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
282 (vertices(start_point_idx,:) + vertices(end_point_idx,:));
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
283 ## endpoint will be deleted later
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
284
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
285 ## remove collapsed edge info
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
286 edges(i_shortest_edge,:) = [];
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
287 edge_length(i_shortest_edge) = [];
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
288
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
289 ## unite collapsed edges of neighboring faces to one edge
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
290 faces_with_collapsed_edge = any (faces == start_point_idx, 2) & ...
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
291 any (faces == end_point_idx, 2);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
292 edges_of_collapsed_faces = faces(faces_with_collapsed_edge,:);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
293 ## get other vertex of collapsed faces
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
294 third_vertices = ...
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
295 edges_of_collapsed_faces(...
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
296 faces(faces_with_collapsed_edge,:) != start_point_idx & ...
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
297 faces(faces_with_collapsed_edge,:) != end_point_idx);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
298 if (! isempty (third_vertices))
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
299 ## delete edge of the collapsed faces which also has end_point
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
300 ## (keep the one with start_point)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
301 edges_to_delete = any (edges == end_point_idx, 2) & ...
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
302 any (any (bsxfun (@eq, edges, ...
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
303 reshape (third_vertices, 1, 1, [])), 3), 2);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
304 edges(edges_to_delete,:) = [];
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
305 edge_length(edges_to_delete) = [];
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
306 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
307
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
308 ## mark the faces that collapsed for later removal
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
309 faces(faces_with_collapsed_edge,:) = Inf;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
310
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
311 ## update the lengths of the moved edges
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
312 edges_with_moved_point = any (edges == start_point_idx, 2);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
313 edge_length(edges_with_moved_point) = ...
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
314 norm (vertices(edges(edges_with_moved_point,1),:) - ...
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
315 vertices(edges(edges_with_moved_point,2),:), 2, "rows");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
316
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
317 ## replace all vertices that use end_point to use start_point
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
318 if (start_point_idx != end_point_idx)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
319 edges(edges == end_point_idx) = start_point_idx;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
320 faces(faces == end_point_idx) = start_point_idx;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
321 vertices(end_point_idx,:) = Inf; # mark vertex for later removal
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
322 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
323
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
324 ## Pretty print a row of dots while performing calulation
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
325 if (verbose && ++verbose_counter > verbose_stepwidth)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
326 printf (".");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
327 verbose_counter = 0;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
328 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
329
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
330 until (max_faces > num_faces - sum (isinf (faces(:,1))))
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
331
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
332 if (verbose)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
333 printf ("\n");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
334 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
335
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
336 if (! clean_finish)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
337 ## FIXME: What should be done in this case?
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
338 ## continue anyway?
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
339 endif
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
340
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
341 ## finally, remove vertices and faces
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
342 removed_vertices = isinf (vertices(:,1));
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
343 vertices_reduced = vertices(! removed_vertices,:);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
344
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
345 faces_reduced = faces(! isinf (faces(:,1)),:);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
346
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
347 ## renumber vertices in faces with subsequent numbers
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
348 vertex_renum = ones (rows (vertices), 1);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
349 vertex_renum(removed_vertices) = 0;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
350 vertex_renum = cumsum (vertex_renum);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
351 faces_reduced = vertex_renum(faces_reduced);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
352
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
353 endfunction
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
354
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
355
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
356 %!demo
24188
1253132e2173 Use "clf;" at beginning of all plot demos.
Rik <rik@octave.org>
parents: 23220
diff changeset
357 %! clf;
22243
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
358 %! [x,y,z] = meshgrid (-2:0.5:2, -2:0.5:2, -2:0.5:2);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
359 %! val = x.^2 + y.^2 + z.^2;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
360 %! fv = isosurface (x, y, z, val, 1);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
361 %! ax1 = subplot (1, 2, 1);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
362 %! patch (fv, "FaceColor", "g");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
363 %! view (3); axis equal;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
364 %! title ("Sphere with all faces");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
365 %! ax2 = subplot(1, 2, 2);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
366 %! patch (reducepatch (fv, 72), "FaceColor", "g");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
367 %! view (3); axis equal;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
368 %! title ("Sphere with reduced number of faces");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
369 %! linkprop ([ax1, ax2], {"CameraPosition", "CameraUpVector"});
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
370
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
371 %!shared faces, vertices, fv, num_faces
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
372 %! [x,y,z] = meshgrid (-2:0.5:2, -2:0.5:2, -2:0.5:2);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
373 %! val = x.^2 + y.^2 + z.^2;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
374 %! [faces, vertices] = isosurface (x, y, z, val, 1);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
375 %! fv.faces = faces; fv.vertices = vertices;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
376 %! num_faces = rows (faces);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
377
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
378 ## one input (structure), one output
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
379 %!test
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
380 %! fv_reduced = reducepatch (fv);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
381 %! assert (size (fv_reduced.faces, 1), num_faces * .5, 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
382 %! assert (size (fv_reduced.faces, 2), 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
383 %! assert (size (fv_reduced.vertices, 2), 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
384
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
385 ## two inputs (faces, vertices), one output
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
386 %!test
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
387 %! fv_reduced = reducepatch (faces, vertices);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
388 %! assert (size (fv_reduced.faces, 1), num_faces * .5, 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
389 %! assert (size (fv_reduced.faces, 2), 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
390 %! assert (size (fv_reduced.vertices, 2), 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
391
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
392 ## two inputs (structure, reduction_factor > 1), two outputs
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
393 %!test
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
394 %! [faces_reduced, vertices_reduced] = reducepatch (fv, 20);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
395 %! assert (size (faces_reduced, 1), 20, 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
396 %! assert (size (faces_reduced, 2), 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
397 %! assert (size (vertices_reduced, 2), 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
398
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
399 ## three inputs (faces, vertices, reduction_factor < 1), two outputs
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
400 %!test
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
401 %! [faces_reduced, vertices_reduced] = reducepatch (faces, vertices, .5);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
402 %! assert (size (faces_reduced, 1), num_faces * .5, 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
403 %! assert (size (faces_reduced, 2), 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
404 %! assert (size (vertices_reduced, 2), 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
405
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
406 ## two inputs (structure, reduction_factor < 1) + one string, no outputs
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
407 ## (update patch object in figure)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
408 %!test
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
409 %! h_fig = figure ("visible", "off");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
410 %! p = patch (fv);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
411 %! reducepatch (p, .35, "f");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
412 %! assert (size (get (p, "Faces"), 1), num_faces * .35, 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
413 %! assert (size (get (p, "Faces"), 2), 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
414 %! assert (size (get (p, "Vertices"), 2), 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
415 %! close (h_fig);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
416
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
417 ## three inputs (faces, vertices, reduction_factor > 1) + one empty
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
418 ## string, one output
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
419 %!test
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
420 %! fv_reduced = reducepatch (faces, vertices, 52, "");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
421 %! assert (size (fv_reduced.faces, 1), 52, 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
422 %! assert (size (fv_reduced.faces, 2), 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
423 %! assert (size (fv_reduced.vertices, 2), 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
424
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
425 ## two inputs (structure, reduction_factor < 1) + one string, two outputs
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
426 %!test
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
427 %! [faces_reduced, vertices_reduced] = reducepatch (fv, .4, "fast");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
428 %! assert (size (faces_reduced, 1), num_faces * .4, 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
429 %! assert (size (faces_reduced, 2), 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
430 %! assert (size (vertices_reduced, 2), 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
431
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
432 ## one input (structure) + two (empty) strings, two outputs
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
433 %!test
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
434 %! [faces_reduced, vertices_reduced] = reducepatch (fv, "f", "");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
435 %! assert (size (faces_reduced, 1), num_faces * .5, 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
436 %! assert (size (faces_reduced, 2), 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
437 %! assert (size (vertices_reduced, 2), 3);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
438
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
439 ## test for each error
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
440 %!error reducepatch ()
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
441 %!error reducepatch (fv, faces, vertices, .5, "f", "v")
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
442 %!error <reducepatch: parameter 'foo' not supported>
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
443 %! fv_reduced = reducepatch (faces, vertices, .7, "foo");
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
444 %!error <struct FV must contain the fields 'vertices' and 'faces'>
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
445 %! fv_incomplete.faces = faces;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
446 %! reducepatch (fv_incomplete, .7);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
447 %!error <PATCH_HANDLE must be a valid handle to a patch> reducepatch (pi, .7)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
448 %!error <If first argument is a matrix containing FACES, second argument must be a matrix containing VERTICES> reducepatch (faces)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
449 %!error <REDUCTION_FACTOR must be a positive scalar> reducepatch (fv, [.7 .5])
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
450 %!error <REDUCTION_FACTOR must be a positive scalar> reducepatch (fv, -5)
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
451 %!error <VERTICES must be an Mx3 matrix> reducepatch (faces, .7, "v")
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
452 %!error <reducepatch: Currently patches must consist of triangles only>
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
453 %! faces_new = NaN (size (faces, 1), 4);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
454 %! faces_new(:,1:3) = faces;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
455 %! faces_new(1,4) = 5;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
456 %! reducepatch (faces_new, vertices);
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
457 %!error <reducepatch: not enough VERTICES for given FACES>
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
458 %! faces_new = faces;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
459 %! faces_new(1,3) = size (vertices, 1) + 1;
654de580bdb3 Add function "reducepatch" (patch #8912)
Markus Muetzel <markus.muetzel@gmx.de>
parents:
diff changeset
460 %! reducepatch (faces_new, vertices);