annotate scripts/plot/draw/reducepatch.m @ 22245:3d287a11ea18

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