annotate scripts/plot/draw/reducepatch.m @ 27918:b442ec6dda5c

use centralized file for copyright info for individual contributors * COPYRIGHT.md: New file. * In most other files, use "Copyright (C) YYYY-YYYY The Octave Project Developers" instead of tracking individual names in separate source files. The motivation is to reduce the effort required to update the notices each year. Until now, the Octave source files contained copyright notices that list individual contributors. I adopted these file-scope copyright notices because that is what everyone was doing 30 years ago in the days before distributed version control systems. But now, with many contributors and modern version control systems, having these file-scope copyright notices causes trouble when we update copyright years or refactor code. Over time, the file-scope copyright notices may become outdated as new contributions are made or code is moved from one file to another. Sometimes people contribute significant patches but do not add a line claiming copyright. Other times, people add a copyright notice for their contribution but then a later refactoring moves part or all of their contribution to another file and the notice is not moved with the code. As a practical matter, moving such notices is difficult -- determining what parts are due to a particular contributor requires a time-consuming search through the project history. Even managing the yearly update of copyright years is problematic. We have some contributors who are no longer living. Should we update the copyright dates for their contributions when we release new versions? Probably not, but we do still want to claim copyright for the project as a whole. To minimize the difficulty of maintaining the copyright notices, I would like to change Octave's sources to use what is described here: https://softwarefreedom.org/resources/2012/ManagingCopyrightInformation.html in the section "Maintaining centralized copyright notices": The centralized notice approach consolidates all copyright notices in a single location, usually a top-level file. This file should contain all of the copyright notices provided project contributors, unless the contribution was clearly insignificant. It may also credit -- without a copyright notice -- anyone who helped with the project but did not contribute code or other copyrighted material. This approach captures less information about contributions within individual files, recognizing that the DVCS is better equipped to record those details. As we mentioned before, it does have one disadvantage as compared to the file-scope approach: if a single file is separated from the distribution, the recipient won't see the contributors' copyright notices. But this can be easily remedied by including a single copyright notice in each file's header, pointing to the top-level file: Copyright YYYY-YYYY The Octave Project Developers See the COPYRIGHT file at the top-level directory of this distribution or at https://octave.org/COPYRIGHT.html. followed by the usual GPL copyright statement. For more background, see the discussion here: https://lists.gnu.org/archive/html/octave-maintainers/2020-01/msg00009.html Most files in the following directories have been skipped intentinally in this changeset: doc libgui/qterminal liboctave/external m4
author John W. Eaton <jwe@octave.org>
date Mon, 06 Jan 2020 15:38:17 -0500
parents f2bb4f2093b9
children 1891570abac8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27918
b442ec6dda5c use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents: 26691
diff changeset
1 ## Copyright (C) 2016-2019 The Octave Project Developers
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);