Mercurial > hg > octave-lyh
annotate src/DLD-FUNCTIONS/convhulln.cc @ 13879:440d7914cf01
fix regression in __voronoi__ and convhulln option processing
* __voronoi__.cc (F__voronoi__): Allow user-supplied options to
completely replace defaults.
* convhulln.cc (F__convhulln__): Likewise.
* __voronoi__.cc (F__voronoi__): New argument, caller.
* voronoi.m, voronoin.m: Pass name of function to __voronoi__.
* voronoin.m: Don't check options here.
* voronoi.m: Don't check nargout.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Thu, 17 Nov 2011 13:47:12 -0500 |
parents | 0d32a681d943 |
children | f913363318e0 |
rev | line source |
---|---|
6823 | 1 /* |
2 | |
11523 | 3 Copyright (C) 2000-2011 Kai Habel |
6823 | 4 |
5 This file is part of Octave. | |
6 | |
7 Octave is free software; you can redistribute it and/or modify it | |
8 under the terms of the GNU General Public License as published by the | |
7016 | 9 Free Software Foundation; either version 3 of the License, or (at your |
10 option) any later version. | |
6823 | 11 |
12 Octave is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
7016 | 18 along with Octave; see the file COPYING. If not, see |
19 <http://www.gnu.org/licenses/>. | |
6823 | 20 |
21 */ | |
22 | |
23 /* | |
24 29. July 2000 - Kai Habel: first release | |
25 2002-04-22 Paul Kienzle | |
26 * Use warning(...) function rather than writing to cerr | |
27 2006-05-01 Tom Holroyd | |
28 * add support for consistent winding in all dimensions; output is | |
29 * guaranteed to be simplicial. | |
30 */ | |
31 | |
32 #ifdef HAVE_CONFIG_H | |
33 #include <config.h> | |
34 #endif | |
9786
2c279308f6ab
fix includes in some src/DLD-FUNCTIONS files
John W. Eaton <jwe@octave.org>
parents:
8920
diff
changeset
|
35 |
2c279308f6ab
fix includes in some src/DLD-FUNCTIONS files
John W. Eaton <jwe@octave.org>
parents:
8920
diff
changeset
|
36 #include <sstream> |
2c279308f6ab
fix includes in some src/DLD-FUNCTIONS files
John W. Eaton <jwe@octave.org>
parents:
8920
diff
changeset
|
37 |
6823 | 38 #include "Cell.h" |
9786
2c279308f6ab
fix includes in some src/DLD-FUNCTIONS files
John W. Eaton <jwe@octave.org>
parents:
8920
diff
changeset
|
39 #include "defun-dld.h" |
2c279308f6ab
fix includes in some src/DLD-FUNCTIONS files
John W. Eaton <jwe@octave.org>
parents:
8920
diff
changeset
|
40 #include "error.h" |
2c279308f6ab
fix includes in some src/DLD-FUNCTIONS files
John W. Eaton <jwe@octave.org>
parents:
8920
diff
changeset
|
41 #include "oct-obj.h" |
2c279308f6ab
fix includes in some src/DLD-FUNCTIONS files
John W. Eaton <jwe@octave.org>
parents:
8920
diff
changeset
|
42 #include "parse.h" |
6823 | 43 |
10474
b2143d97c002
Neither include qhull/qhull_a.h nor run tests unless we HAVE_QHULL.
David Grundberg <davidg@cs.umu.se>
parents:
10257
diff
changeset
|
44 #ifdef HAVE_QHULL |
6823 | 45 extern "C" { |
46 #include <qhull/qhull_a.h> | |
47 } | |
48 | |
10474
b2143d97c002
Neither include qhull/qhull_a.h nor run tests unless we HAVE_QHULL.
David Grundberg <davidg@cs.umu.se>
parents:
10257
diff
changeset
|
49 # ifdef NEED_QHULL_VERSION |
6823 | 50 char qh_version[] = "convhulln.oct 2007-07-24"; |
10474
b2143d97c002
Neither include qhull/qhull_a.h nor run tests unless we HAVE_QHULL.
David Grundberg <davidg@cs.umu.se>
parents:
10257
diff
changeset
|
51 # endif |
b2143d97c002
Neither include qhull/qhull_a.h nor run tests unless we HAVE_QHULL.
David Grundberg <davidg@cs.umu.se>
parents:
10257
diff
changeset
|
52 #endif /* HAVE_QHULL */ |
6823 | 53 |
8786
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
54 DEFUN_DLD (convhulln, args, nargout, |
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
55 "-*- texinfo -*-\n\ |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
56 @deftypefn {Loadable Function} {@var{h} =} convhulln (@var{pts})\n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
57 @deftypefnx {Loadable Function} {@var{h} =} convhulln (@var{pts}, @var{options})\n\ |
8788 | 58 @deftypefnx {Loadable Function} {[@var{h}, @var{v}] =} convhulln (@dots{})\n\ |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
59 Compute the convex hull of the set of points @var{pts} which is a matrix\n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
60 of size [n, dim] containing n points in a space of dimension dim.\n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
61 The hull @var{h} is an index vector into the set of points and specifies\n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
62 which points form the enclosing hull.\n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
63 \n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
64 An optional second argument, which must be a string or cell array of strings,\n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
65 contains options passed to the underlying qhull command.\n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
66 See the documentation for the Qhull library for details\n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
67 @url{http://www.qhull.org/html/qh-quick.htm#options}.\n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
68 The default options depend on the dimension of the input:\n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
69 \n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
70 @itemize\n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
71 @item 2D, 3D, 4D: @var{options} = @code{@{\"Qt\"@}}\n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
72 \n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
73 @item 5D and higher: @var{options} = @code{@{\"Qt\", \"Qx\"@}}\n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
74 @end itemize\n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
75 \n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
76 If @var{options} is not present or @code{[]} then the default arguments are\n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
77 used. Otherwise, @var{options} replaces the default argument list.\n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
78 To append user options to the defaults it is necessary to repeat the\n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
79 default arguments in @var{options}. Use a null string to pass no arguments.\n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
80 \n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
81 If the second output @var{v} is requested the volume of the enclosing\n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
82 convex hull is calculated.\n\n\ |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
83 @seealso{convhull, delaunayn, voronoin}\n\ |
6823 | 84 @end deftypefn") |
85 { | |
86 octave_value_list retval; | |
6959 | 87 |
6823 | 88 #ifdef HAVE_QHULL |
89 | |
6959 | 90 int nargin = args.length (); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
91 if (nargin < 1 || nargin > 2) |
6823 | 92 { |
93 print_usage (); | |
94 return retval; | |
95 } | |
96 | |
13877
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
97 Matrix points (args(0).matrix_value ()); |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
98 const octave_idx_type dim = points.columns (); |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
99 const octave_idx_type num_points = points.rows (); |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
100 |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
101 points = points.transpose (); |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
102 |
13879
440d7914cf01
fix regression in __voronoi__ and convhulln option processing
John W. Eaton <jwe@octave.org>
parents:
13877
diff
changeset
|
103 std::string options; |
13877
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
104 |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
105 if (dim <= 4) |
13879
440d7914cf01
fix regression in __voronoi__ and convhulln option processing
John W. Eaton <jwe@octave.org>
parents:
13877
diff
changeset
|
106 options = " Qt"; |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
107 else |
13879
440d7914cf01
fix regression in __voronoi__ and convhulln option processing
John W. Eaton <jwe@octave.org>
parents:
13877
diff
changeset
|
108 options = " Qt Qx"; |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
109 |
13879
440d7914cf01
fix regression in __voronoi__ and convhulln option processing
John W. Eaton <jwe@octave.org>
parents:
13877
diff
changeset
|
110 if (nargin == 2) |
6823 | 111 { |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
112 if (args(1).is_string ()) |
13879
440d7914cf01
fix regression in __voronoi__ and convhulln option processing
John W. Eaton <jwe@octave.org>
parents:
13877
diff
changeset
|
113 options = " " + args(1).string_value (); |
440d7914cf01
fix regression in __voronoi__ and convhulln option processing
John W. Eaton <jwe@octave.org>
parents:
13877
diff
changeset
|
114 else if (args(1).is_empty ()) |
440d7914cf01
fix regression in __voronoi__ and convhulln option processing
John W. Eaton <jwe@octave.org>
parents:
13877
diff
changeset
|
115 ; // Use default options. |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
116 else if (args(1).is_cellstr ()) |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
117 { |
13879
440d7914cf01
fix regression in __voronoi__ and convhulln option processing
John W. Eaton <jwe@octave.org>
parents:
13877
diff
changeset
|
118 options = ""; |
440d7914cf01
fix regression in __voronoi__ and convhulln option processing
John W. Eaton <jwe@octave.org>
parents:
13877
diff
changeset
|
119 |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
120 Array<std::string> tmp = args(1).cellstr_value (); |
6823 | 121 |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
122 for (octave_idx_type i = 0; i < tmp.numel (); i++) |
13879
440d7914cf01
fix regression in __voronoi__ and convhulln option processing
John W. Eaton <jwe@octave.org>
parents:
13877
diff
changeset
|
123 options += " " + tmp(i); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
124 } |
6823 | 125 else |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
126 { |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
127 error ("convhulln: OPTIONS must be a string, cell array of strings, or empty"); |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
128 return retval; |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
129 } |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
130 } |
6823 | 131 |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
132 boolT ismalloc = false; |
10257
cd550069240e
assume vsnprintf from gnulib; use sstream instead of snprintf
John W. Eaton <jwe@octave.org>
parents:
10154
diff
changeset
|
133 |
13877
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
134 // Replace the 0 pointer with stdout for debugging information. |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
135 FILE *outfile = 0; |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
136 FILE *errfile = stderr; |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
137 |
13879
440d7914cf01
fix regression in __voronoi__ and convhulln option processing
John W. Eaton <jwe@octave.org>
parents:
13877
diff
changeset
|
138 // qh_new_qhull command and points arguments are not const... |
440d7914cf01
fix regression in __voronoi__ and convhulln option processing
John W. Eaton <jwe@octave.org>
parents:
13877
diff
changeset
|
139 |
440d7914cf01
fix regression in __voronoi__ and convhulln option processing
John W. Eaton <jwe@octave.org>
parents:
13877
diff
changeset
|
140 std::string cmd = "qhull" + options; |
13877
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
141 |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
142 OCTAVE_LOCAL_BUFFER (char, cmd_str, cmd.length () + 1); |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
143 |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
144 strcpy (cmd_str, cmd.c_str ()); |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
145 |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
146 int exitcode = qh_new_qhull (dim, num_points, points.fortran_vec (), |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
147 ismalloc, cmd_str, outfile, errfile); |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
148 if (! exitcode) |
6823 | 149 { |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
150 bool nonsimp_seen = false; |
13877
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
151 |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
152 octave_idx_type nf = qh num_facets; |
6823 | 153 |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
154 Matrix idx (nf, dim + 1); |
6823 | 155 |
13877
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
156 facetT *facet; |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
157 |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
158 octave_idx_type i = 0; |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
159 |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
160 FORALLfacets |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
161 { |
13877
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
162 octave_idx_type j = 0; |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
163 |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
164 if (! nonsimp_seen && ! facet->simplicial) |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
165 { |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
166 nonsimp_seen = true; |
6823 | 167 |
13877
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
168 if (cmd.find ("QJ") != std::string::npos) |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
169 { |
13877
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
170 // Should never happen with QJ. |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
171 error ("convhulln: qhull failed: option 'QJ' returned non-simplicial facet"); |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
172 return retval; |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
173 } |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
174 } |
13877
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
175 |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
176 if (dim == 3) |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
177 { |
13877
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
178 setT *vertices = qh_facet3vertex (facet); |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
179 |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
180 vertexT *vertex, **vertexp; |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
181 |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
182 FOREACHvertex_ (vertices) |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
183 idx(i, j++) = 1 + qh_pointid(vertex->point); |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
184 |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
185 qh_settempfree (&vertices); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
186 } |
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
187 else |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
188 { |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
189 if (facet->toporient ^ qh_ORIENTclock) |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
190 { |
13877
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
191 vertexT *vertex, **vertexp; |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
192 |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
193 FOREACHvertex_ (facet->vertices) |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
194 idx(i, j++) = 1 + qh_pointid(vertex->point); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
195 } |
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
196 else |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
197 { |
13877
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
198 vertexT *vertex, **vertexp; |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
199 |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
200 FOREACHvertexreverse12_ (facet->vertices) |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
201 idx(i, j++) = 1 + qh_pointid(vertex->point); |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
202 } |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
203 } |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
204 if (j < dim) |
13877
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
205 warning ("convhulln: facet %d only has %d vertices", i, j); |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
206 |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
207 i++; |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
208 } |
8786
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
209 |
13877
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
210 // Remove extra dimension if all facets were simplicial. |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
211 |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
212 if (! nonsimp_seen) |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
213 idx.resize (nf, dim, 0.0); |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
214 |
8786
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
215 if (nargout == 2) |
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
216 { |
13877
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
217 // Calculate volume of convex hull, taken from qhull src/geom2.c. |
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
218 |
8786
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
219 realT area; |
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
220 realT dist; |
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
221 |
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
222 FORALLfacets |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
223 { |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
224 if (! facet->normal) |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
225 continue; |
8786
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
226 |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
227 if (facet->upperdelaunay && qh ATinfinity) |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
228 continue; |
8786
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
229 |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
230 facet->f.area = area = qh_facetarea (facet); |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
231 facet->isarea = True; |
8786
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
232 |
10154
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
233 if (qh DELAUNAY) |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
234 { |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
235 if (facet->upperdelaunay == qh UPPERdelaunay) |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
236 qh totarea += area; |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
237 } |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
238 else |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
239 { |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
240 qh totarea += area; |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
241 qh_distplane (qh interior_point, facet, &dist); |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
242 qh totvol += -dist * area/ qh hull_dim; |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
243 } |
40dfc0c99116
DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents:
9786
diff
changeset
|
244 } |
8786
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
245 |
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
246 retval(1) = octave_value (qh totvol); |
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
247 } |
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
248 |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
249 retval(0) = idx; |
6823 | 250 } |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
251 else |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
252 error ("convhulln: qhull failed"); |
6959 | 253 |
13877
0d32a681d943
* convhulln.cc: Clean up argument parsing and variable decls.
John W. Eaton <jwe@octave.org>
parents:
13746
diff
changeset
|
254 // Free memory from Qhull |
6959 | 255 qh_freeqhull (! qh_ALL); |
256 | |
6823 | 257 int curlong, totlong; |
258 qh_memfreeshort (&curlong, &totlong); | |
259 | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11553
diff
changeset
|
260 if (curlong || totlong) |
6959 | 261 warning ("convhulln: did not free %d bytes of long memory (%d pieces)", |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
262 totlong, curlong); |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
263 |
6823 | 264 #else |
265 error ("convhulln: not available in this version of Octave"); | |
266 #endif | |
6959 | 267 |
6823 | 268 return retval; |
269 } | |
8786
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
270 |
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
271 /* |
10474
b2143d97c002
Neither include qhull/qhull_a.h nor run tests unless we HAVE_QHULL.
David Grundberg <davidg@cs.umu.se>
parents:
10257
diff
changeset
|
272 %!testif HAVE_QHULL |
8786
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
273 %! cube = [0 0 0;1 0 0;1 1 0;0 1 0;0 0 1;1 0 1;1 1 1;0 1 1]; |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
274 %! [h, v] = convhulln (cube); |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
275 %! assert (size (h), [6 4]); |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
276 %! h = sortrows (sort (h, 2), [1:4]); |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
277 %! assert (h, [1 2 3 4; 1 2 5 6; 1 4 5 8; 2 3 6 7; 3 4 7 8; 5 6 7 8]); |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
278 %! assert (v, 1, 10*eps); |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
279 |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
280 %!testif HAVE_QHULL |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
281 %! cube = [0 0 0;1 0 0;1 1 0;0 1 0;0 0 1;1 0 1;1 1 1;0 1 1]; |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
282 %! [h, v] = convhulln (cube, "QJ"); |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
283 %! assert (size (h), [12 3]); |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
284 %! assert (sortrows (sort (h, 2), [1:3]), [1 2 4; 1 2 5; 1 4 5; 2 3 4; 2 3 6; 2 5 6; 3 4 8; 3 6 7; 3 7 8; 4 5 8; 5 6 8; 6 7 8]); |
8786
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
285 %! assert (v, 1.0, 1e6*eps); |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
286 |
10474
b2143d97c002
Neither include qhull/qhull_a.h nor run tests unless we HAVE_QHULL.
David Grundberg <davidg@cs.umu.se>
parents:
10257
diff
changeset
|
287 %!testif HAVE_QHULL |
8786
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
288 %! tetrahedron = [1 1 1;-1 -1 1;-1 1 -1;1 -1 -1]; |
13746
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
289 %! [h, v] = convhulln (tetrahedron); |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
290 %! h = sortrows (sort (h, 2), [1 2 3]); |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
291 %! assert (h, [1 2 3;1 2 4; 1 3 4; 2 3 4]); |
7ff0bdc3dc4c
Revamp geometry functions dependent on Qhull (Bug #34604, Bug #33346)
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
292 %! assert (v, 8/3, 10*eps); |
8786
dbd428efbf56
Add calculation convex hull volume
Kai Habel <kai.habel@gmx.de>
parents:
7520
diff
changeset
|
293 */ |