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