[10207] | 1 | /*<html><pre> -<a href="qh-qhull.htm"
|
---|
| 2 | >-------------------------------</a><a name="TOP">-</a>
|
---|
| 3 |
|
---|
| 4 | libqhull.h
|
---|
| 5 | user-level header file for using qhull.a library
|
---|
| 6 |
|
---|
| 7 | see qh-qhull.htm, qhull_a.h
|
---|
| 8 |
|
---|
| 9 | Copyright (c) 1993-2012 The Geometry Center.
|
---|
| 10 | $Id: //main/2011/qhull/src/libqhull/libqhull.h#7 $$Change: 1464 $
|
---|
| 11 | $DateTime: 2012/01/25 22:58:41 $$Author: bbarber $
|
---|
| 12 |
|
---|
| 13 | NOTE: access to qh_qh is via the 'qh' macro. This allows
|
---|
| 14 | qh_qh to be either a pointer or a structure. An example
|
---|
| 15 | of using qh is "qh DROPdim" which accesses the DROPdim
|
---|
| 16 | field of qh_qh. Similarly, access to qh_qhstat is via
|
---|
| 17 | the 'qhstat' macro.
|
---|
| 18 |
|
---|
| 19 | includes function prototypes for libqhull.c, geom.c, global.c, io.c, user.c
|
---|
| 20 |
|
---|
| 21 | use mem.h for mem.c
|
---|
| 22 | use qset.h for qset.c
|
---|
| 23 |
|
---|
| 24 | see unix.c for an example of using libqhull.h
|
---|
| 25 |
|
---|
| 26 | recompile qhull if you change this file
|
---|
| 27 | */
|
---|
| 28 |
|
---|
| 29 | #ifndef qhDEFlibqhull
|
---|
| 30 | #define qhDEFlibqhull 1
|
---|
| 31 |
|
---|
| 32 | /*=========================== -included files ==============*/
|
---|
| 33 |
|
---|
| 34 | #include "user.h" /* user definable constants (e.g., qh_QHpointer) */
|
---|
| 35 |
|
---|
| 36 | #include <setjmp.h>
|
---|
| 37 | #include <float.h>
|
---|
| 38 | #include <time.h>
|
---|
| 39 | #include <stdio.h>
|
---|
| 40 |
|
---|
| 41 | #if __MWERKS__ && __POWERPC__
|
---|
| 42 | #include <SIOUX.h>
|
---|
| 43 | #include <Files.h>
|
---|
| 44 | #include <Desk.h>
|
---|
| 45 | #endif
|
---|
| 46 |
|
---|
| 47 | #ifndef __STDC__
|
---|
| 48 | #ifndef __cplusplus
|
---|
| 49 | #if !_MSC_VER
|
---|
| 50 | #error Neither __STDC__ nor __cplusplus is defined. Please use strict ANSI C or C++ to compile
|
---|
| 51 | #error Qhull. You may need to turn off compiler extensions in your project configuration. If
|
---|
| 52 | #error your compiler is a standard C compiler, you can delete this warning from libqhull.h
|
---|
| 53 | #endif
|
---|
| 54 | #endif
|
---|
| 55 | #endif
|
---|
| 56 |
|
---|
| 57 | /*============ constants and basic types ====================*/
|
---|
| 58 |
|
---|
| 59 | extern const char *qh_version; /* defined in global.c */
|
---|
| 60 |
|
---|
| 61 | /*-<a href="qh-geom.htm#TOC"
|
---|
| 62 | >--------------------------------</a><a name="coordT">-</a>
|
---|
| 63 |
|
---|
| 64 | coordT
|
---|
| 65 | coordinates and coefficients are stored as realT (i.e., double)
|
---|
| 66 |
|
---|
| 67 | notes:
|
---|
| 68 | Qhull works well if realT is 'float'. If so joggle (QJ) is not effective.
|
---|
| 69 |
|
---|
| 70 | Could use 'float' for data and 'double' for calculations (realT vs. coordT)
|
---|
| 71 | This requires many type casts, and adjusted error bounds.
|
---|
| 72 | Also C compilers may do expressions in double anyway.
|
---|
| 73 | */
|
---|
| 74 | #define coordT realT
|
---|
| 75 |
|
---|
| 76 | /*-<a href="qh-geom.htm#TOC"
|
---|
| 77 | >--------------------------------</a><a name="pointT">-</a>
|
---|
| 78 |
|
---|
| 79 | pointT
|
---|
| 80 | a point is an array of coordinates, usually qh.hull_dim
|
---|
| 81 | */
|
---|
| 82 | #define pointT coordT
|
---|
| 83 |
|
---|
| 84 | /*-<a href="qh-qhull.htm#TOC"
|
---|
| 85 | >--------------------------------</a><a name="flagT">-</a>
|
---|
| 86 |
|
---|
| 87 | flagT
|
---|
| 88 | Boolean flag as a bit
|
---|
| 89 | */
|
---|
| 90 | #define flagT unsigned int
|
---|
| 91 |
|
---|
| 92 | /*-<a href="qh-qhull.htm#TOC"
|
---|
| 93 | >--------------------------------</a><a name="boolT">-</a>
|
---|
| 94 |
|
---|
| 95 | boolT
|
---|
| 96 | boolean value, either True or False
|
---|
| 97 |
|
---|
| 98 | notes:
|
---|
| 99 | needed for portability
|
---|
| 100 | Use qh_False/qh_True as synonyms
|
---|
| 101 | */
|
---|
| 102 | #define boolT unsigned int
|
---|
| 103 | #ifdef False
|
---|
| 104 | #undef False
|
---|
| 105 | #endif
|
---|
| 106 | #ifdef True
|
---|
| 107 | #undef True
|
---|
| 108 | #endif
|
---|
| 109 | #define False 0
|
---|
| 110 | #define True 1
|
---|
| 111 | #define qh_False 0
|
---|
| 112 | #define qh_True 1
|
---|
| 113 |
|
---|
| 114 | /*-<a href="qh-qhull.htm#TOC"
|
---|
| 115 | >--------------------------------</a><a name="CENTERtype">-</a>
|
---|
| 116 |
|
---|
| 117 | qh_CENTER
|
---|
| 118 | to distinguish facet->center
|
---|
| 119 | */
|
---|
| 120 | typedef enum
|
---|
| 121 | {
|
---|
| 122 | qh_ASnone = 0, qh_ASvoronoi, qh_AScentrum
|
---|
| 123 | }
|
---|
| 124 | qh_CENTER;
|
---|
| 125 |
|
---|
| 126 | /*-<a href="qh-qhull.htm#TOC"
|
---|
| 127 | >--------------------------------</a><a name="qh_PRINT">-</a>
|
---|
| 128 |
|
---|
| 129 | qh_PRINT
|
---|
| 130 | output formats for printing (qh.PRINTout).
|
---|
| 131 | 'Fa' 'FV' 'Fc' 'FC'
|
---|
| 132 |
|
---|
| 133 |
|
---|
| 134 | notes:
|
---|
| 135 | some of these names are similar to qh names. The similar names are only
|
---|
| 136 | used in switch statements in qh_printbegin() etc.
|
---|
| 137 | */
|
---|
| 138 | typedef enum {qh_PRINTnone= 0,
|
---|
| 139 | qh_PRINTarea, qh_PRINTaverage, /* 'Fa' 'FV' 'Fc' 'FC' */
|
---|
| 140 | qh_PRINTcoplanars, qh_PRINTcentrums,
|
---|
| 141 | qh_PRINTfacets, qh_PRINTfacets_xridge, /* 'f' 'FF' 'G' 'FI' 'Fi' 'Fn' */
|
---|
| 142 | qh_PRINTgeom, qh_PRINTids, qh_PRINTinner, qh_PRINTneighbors,
|
---|
| 143 | qh_PRINTnormals, qh_PRINTouter, qh_PRINTmaple, /* 'n' 'Fo' 'i' 'm' 'Fm' 'FM', 'o' */
|
---|
| 144 | qh_PRINTincidences, qh_PRINTmathematica, qh_PRINTmerges, qh_PRINToff,
|
---|
| 145 | qh_PRINToptions, qh_PRINTpointintersect, /* 'FO' 'Fp' 'FP' 'p' 'FQ' 'FS' */
|
---|
| 146 | qh_PRINTpointnearest, qh_PRINTpoints, qh_PRINTqhull, qh_PRINTsize,
|
---|
| 147 | qh_PRINTsummary, qh_PRINTtriangles, /* 'Fs' 'Ft' 'Fv' 'FN' 'Fx' */
|
---|
| 148 | qh_PRINTvertices, qh_PRINTvneighbors, qh_PRINTextremes,
|
---|
| 149 | qh_PRINTEND} qh_PRINT;
|
---|
| 150 |
|
---|
| 151 | /*-<a href="qh-qhull.htm#TOC"
|
---|
| 152 | >--------------------------------</a><a name="qh_ALL">-</a>
|
---|
| 153 |
|
---|
| 154 | qh_ALL
|
---|
| 155 | argument flag for selecting everything
|
---|
| 156 | */
|
---|
| 157 | #define qh_ALL True
|
---|
| 158 | #define qh_NOupper True /* argument for qh_findbest */
|
---|
| 159 | #define qh_IScheckmax True /* argument for qh_findbesthorizon */
|
---|
| 160 | #define qh_ISnewfacets True /* argument for qh_findbest */
|
---|
| 161 | #define qh_RESETvisible True /* argument for qh_resetlists */
|
---|
| 162 |
|
---|
| 163 | /*-<a href="qh-qhull.htm#TOC"
|
---|
| 164 | >--------------------------------</a><a name="qh_ERR">-</a>
|
---|
| 165 |
|
---|
| 166 | qh_ERR
|
---|
| 167 | Qhull exit codes, for indicating errors
|
---|
| 168 | See: MSG_ERROR and MSG_WARNING [user.h]
|
---|
| 169 | */
|
---|
| 170 | #define qh_ERRnone 0 /* no error occurred during qhull */
|
---|
| 171 | #define qh_ERRinput 1 /* input inconsistency */
|
---|
| 172 | #define qh_ERRsingular 2 /* singular input data */
|
---|
| 173 | #define qh_ERRprec 3 /* precision error */
|
---|
| 174 | #define qh_ERRmem 4 /* insufficient memory, matches mem.h */
|
---|
| 175 | #define qh_ERRqhull 5 /* internal error detected, matches mem.h */
|
---|
| 176 |
|
---|
| 177 | /*-<a href="qh-qhull.htm#TOC"
|
---|
| 178 | >--------------------------------</a><a name="qh_FILEstderr">-</a>
|
---|
| 179 |
|
---|
| 180 | qh_FILEstderr
|
---|
| 181 | Fake stderr to distinguish error output from normal output
|
---|
| 182 | For C++ interface. Must redefine qh_fprintf_qhull
|
---|
| 183 | */
|
---|
| 184 | #define qh_FILEstderr (FILE*)1
|
---|
| 185 |
|
---|
| 186 | /* ============ -structures- ====================
|
---|
| 187 | each of the following structures is defined by a typedef
|
---|
| 188 | all realT and coordT fields occur at the beginning of a structure
|
---|
| 189 | (otherwise space may be wasted due to alignment)
|
---|
| 190 | define all flags together and pack into 32-bit number
|
---|
| 191 | */
|
---|
| 192 |
|
---|
| 193 | typedef struct vertexT vertexT;
|
---|
| 194 | typedef struct ridgeT ridgeT;
|
---|
| 195 | typedef struct facetT facetT;
|
---|
| 196 | #ifndef DEFsetT
|
---|
| 197 | #define DEFsetT 1
|
---|
| 198 | typedef struct setT setT; /* defined in qset.h */
|
---|
| 199 | #endif
|
---|
| 200 |
|
---|
| 201 | #ifndef DEFqhstatT
|
---|
| 202 | #define DEFqhstatT 1
|
---|
| 203 | typedef struct qhstatT qhstatT; /* defined in stat.h */
|
---|
| 204 | #endif
|
---|
| 205 |
|
---|
| 206 | /*-<a href="qh-poly.htm#TOC"
|
---|
| 207 | >--------------------------------</a><a name="facetT">-</a>
|
---|
| 208 |
|
---|
| 209 | facetT
|
---|
| 210 | defines a facet
|
---|
| 211 |
|
---|
| 212 | notes:
|
---|
| 213 | qhull() generates the hull as a list of facets.
|
---|
| 214 |
|
---|
| 215 | topological information:
|
---|
| 216 | f.previous,next doubly-linked list of facets
|
---|
| 217 | f.vertices set of vertices
|
---|
| 218 | f.ridges set of ridges
|
---|
| 219 | f.neighbors set of neighbors
|
---|
| 220 | f.toporient True if facet has top-orientation (else bottom)
|
---|
| 221 |
|
---|
| 222 | geometric information:
|
---|
| 223 | f.offset,normal hyperplane equation
|
---|
| 224 | f.maxoutside offset to outer plane -- all points inside
|
---|
| 225 | f.center centrum for testing convexity
|
---|
| 226 | f.simplicial True if facet is simplicial
|
---|
| 227 | f.flipped True if facet does not include qh.interior_point
|
---|
| 228 |
|
---|
| 229 | for constructing hull:
|
---|
| 230 | f.visible True if facet on list of visible facets (will be deleted)
|
---|
| 231 | f.newfacet True if facet on list of newly created facets
|
---|
| 232 | f.coplanarset set of points coplanar with this facet
|
---|
| 233 | (includes near-inside points for later testing)
|
---|
| 234 | f.outsideset set of points outside of this facet
|
---|
| 235 | f.furthestdist distance to furthest point of outside set
|
---|
| 236 | f.visitid marks visited facets during a loop
|
---|
| 237 | f.replace replacement facet for to-be-deleted, visible facets
|
---|
| 238 | f.samecycle,newcycle cycle of facets for merging into horizon facet
|
---|
| 239 |
|
---|
| 240 | see below for other flags and fields
|
---|
| 241 | */
|
---|
| 242 | struct facetT {
|
---|
| 243 | #if !qh_COMPUTEfurthest
|
---|
| 244 | coordT furthestdist;/* distance to furthest point of outsideset */
|
---|
| 245 | #endif
|
---|
| 246 | #if qh_MAXoutside
|
---|
| 247 | coordT maxoutside; /* max computed distance of point to facet
|
---|
| 248 | Before QHULLfinished this is an approximation
|
---|
| 249 | since maxdist not always set for mergefacet
|
---|
| 250 | Actual outer plane is +DISTround and
|
---|
| 251 | computed outer plane is +2*DISTround */
|
---|
| 252 | #endif
|
---|
| 253 | coordT offset; /* exact offset of hyperplane from origin */
|
---|
| 254 | coordT *normal; /* normal of hyperplane, hull_dim coefficients */
|
---|
| 255 | /* if tricoplanar, shared with a neighbor */
|
---|
| 256 | union { /* in order of testing */
|
---|
| 257 | realT area; /* area of facet, only in io.c if ->isarea */
|
---|
| 258 | facetT *replace; /* replacement facet if ->visible and NEWfacets
|
---|
| 259 | is NULL only if qh_mergedegen_redundant or interior */
|
---|
| 260 | facetT *samecycle; /* cycle of facets from the same visible/horizon intersection,
|
---|
| 261 | if ->newfacet */
|
---|
| 262 | facetT *newcycle; /* in horizon facet, current samecycle of new facets */
|
---|
| 263 | facetT *trivisible; /* visible facet for ->tricoplanar facets during qh_triangulate() */
|
---|
| 264 | facetT *triowner; /* owner facet for ->tricoplanar, !isarea facets w/ ->keepcentrum */
|
---|
| 265 | }f;
|
---|
| 266 | coordT *center; /* centrum for convexity, qh CENTERtype == qh_AScentrum */
|
---|
| 267 | /* Voronoi center, qh CENTERtype == qh_ASvoronoi */
|
---|
| 268 | /* if tricoplanar, shared with a neighbor */
|
---|
| 269 | facetT *previous; /* previous facet in the facet_list */
|
---|
| 270 | facetT *next; /* next facet in the facet_list */
|
---|
| 271 | setT *vertices; /* vertices for this facet, inverse sorted by ID
|
---|
| 272 | if simplicial, 1st vertex was apex/furthest */
|
---|
| 273 | setT *ridges; /* explicit ridges for nonsimplicial facets.
|
---|
| 274 | for simplicial facets, neighbors define the ridges */
|
---|
| 275 | setT *neighbors; /* neighbors of the facet. If simplicial, the kth
|
---|
| 276 | neighbor is opposite the kth vertex, and the first
|
---|
| 277 | neighbor is the horizon facet for the first vertex*/
|
---|
| 278 | setT *outsideset; /* set of points outside this facet
|
---|
| 279 | if non-empty, last point is furthest
|
---|
| 280 | if NARROWhull, includes coplanars for partitioning*/
|
---|
| 281 | setT *coplanarset; /* set of points coplanar with this facet
|
---|
| 282 | > qh.min_vertex and <= facet->max_outside
|
---|
| 283 | a point is assigned to the furthest facet
|
---|
| 284 | if non-empty, last point is furthest away */
|
---|
| 285 | unsigned visitid; /* visit_id, for visiting all neighbors,
|
---|
| 286 | all uses are independent */
|
---|
| 287 | unsigned id; /* unique identifier from qh facet_id */
|
---|
| 288 | unsigned nummerge:9; /* number of merges */
|
---|
| 289 | #define qh_MAXnummerge 511 /* 2^9-1, 32 flags total, see "flags:" in io.c */
|
---|
| 290 | flagT tricoplanar:1; /* True if TRIangulate and simplicial and coplanar with a neighbor */
|
---|
| 291 | /* all tricoplanars share the same ->center, ->normal, ->offset, ->maxoutside */
|
---|
| 292 | /* all tricoplanars share the same apex */
|
---|
| 293 | /* if ->degenerate, does not span facet (one logical ridge) */
|
---|
| 294 | /* one tricoplanar has ->keepcentrum and ->coplanarset */
|
---|
| 295 | /* during qh_triangulate, f.trivisible points to original facet */
|
---|
| 296 | flagT newfacet:1; /* True if facet on qh newfacet_list (new or merged) */
|
---|
| 297 | flagT visible:1; /* True if visible facet (will be deleted) */
|
---|
| 298 | flagT toporient:1; /* True if created with top orientation
|
---|
| 299 | after merging, use ridge orientation */
|
---|
| 300 | flagT simplicial:1;/* True if simplicial facet, ->ridges may be implicit */
|
---|
| 301 | flagT seen:1; /* used to perform operations only once, like visitid */
|
---|
| 302 | flagT seen2:1; /* used to perform operations only once, like visitid */
|
---|
| 303 | flagT flipped:1; /* True if facet is flipped */
|
---|
| 304 | flagT upperdelaunay:1; /* True if facet is upper envelope of Delaunay triangulation */
|
---|
| 305 | flagT notfurthest:1; /* True if last point of outsideset is not furthest*/
|
---|
| 306 |
|
---|
| 307 | /*-------- flags primarily for output ---------*/
|
---|
| 308 | flagT good:1; /* True if a facet marked good for output */
|
---|
| 309 | flagT isarea:1; /* True if facet->f.area is defined */
|
---|
| 310 |
|
---|
| 311 | /*-------- flags for merging ------------------*/
|
---|
| 312 | flagT dupridge:1; /* True if duplicate ridge in facet */
|
---|
| 313 | flagT mergeridge:1; /* True if facet or neighbor contains a qh_MERGEridge
|
---|
| 314 | ->normal defined (also defined for mergeridge2) */
|
---|
| 315 | flagT mergeridge2:1; /* True if neighbor contains a qh_MERGEridge (mark_dupridges */
|
---|
| 316 | flagT coplanar:1; /* True if horizon facet is coplanar at last use */
|
---|
| 317 | flagT mergehorizon:1; /* True if will merge into horizon (->coplanar) */
|
---|
| 318 | flagT cycledone:1;/* True if mergecycle_all already done */
|
---|
| 319 | flagT tested:1; /* True if facet convexity has been tested (false after merge */
|
---|
| 320 | flagT keepcentrum:1; /* True if keep old centrum after a merge, or marks owner for ->tricoplanar */
|
---|
| 321 | flagT newmerge:1; /* True if facet is newly merged for reducevertices */
|
---|
| 322 | flagT degenerate:1; /* True if facet is degenerate (degen_mergeset or ->tricoplanar) */
|
---|
| 323 | flagT redundant:1; /* True if facet is redundant (degen_mergeset) */
|
---|
| 324 | };
|
---|
| 325 |
|
---|
| 326 |
|
---|
| 327 | /*-<a href="qh-poly.htm#TOC"
|
---|
| 328 | >--------------------------------</a><a name="ridgeT">-</a>
|
---|
| 329 |
|
---|
| 330 | ridgeT
|
---|
| 331 | defines a ridge
|
---|
| 332 |
|
---|
| 333 | notes:
|
---|
| 334 | a ridge is hull_dim-1 simplex between two neighboring facets. If the
|
---|
| 335 | facets are non-simplicial, there may be more than one ridge between
|
---|
| 336 | two facets. E.G. a 4-d hypercube has two triangles between each pair
|
---|
| 337 | of neighboring facets.
|
---|
| 338 |
|
---|
| 339 | topological information:
|
---|
| 340 | vertices a set of vertices
|
---|
| 341 | top,bottom neighboring facets with orientation
|
---|
| 342 |
|
---|
| 343 | geometric information:
|
---|
| 344 | tested True if ridge is clearly convex
|
---|
| 345 | nonconvex True if ridge is non-convex
|
---|
| 346 | */
|
---|
| 347 | struct ridgeT {
|
---|
| 348 | setT *vertices; /* vertices belonging to this ridge, inverse sorted by ID
|
---|
| 349 | NULL if a degen ridge (matchsame) */
|
---|
| 350 | facetT *top; /* top facet this ridge is part of */
|
---|
| 351 | facetT *bottom; /* bottom facet this ridge is part of */
|
---|
| 352 | unsigned id:24; /* unique identifier, =>room for 8 flags, bit field matches qh.ridge_id */
|
---|
| 353 | flagT seen:1; /* used to perform operations only once */
|
---|
| 354 | flagT tested:1; /* True when ridge is tested for convexity */
|
---|
| 355 | flagT nonconvex:1; /* True if getmergeset detected a non-convex neighbor
|
---|
| 356 | only one ridge between neighbors may have nonconvex */
|
---|
| 357 | };
|
---|
| 358 |
|
---|
| 359 | /*-<a href="qh-poly.htm#TOC"
|
---|
| 360 | >--------------------------------</a><a name="vertexT">-</a>
|
---|
| 361 |
|
---|
| 362 | vertexT
|
---|
| 363 | defines a vertex
|
---|
| 364 |
|
---|
| 365 | topological information:
|
---|
| 366 | next,previous doubly-linked list of all vertices
|
---|
| 367 | neighbors set of adjacent facets (only if qh.VERTEXneighbors)
|
---|
| 368 |
|
---|
| 369 | geometric information:
|
---|
| 370 | point array of DIM3 coordinates
|
---|
| 371 | */
|
---|
| 372 | struct vertexT {
|
---|
| 373 | vertexT *next; /* next vertex in vertex_list */
|
---|
| 374 | vertexT *previous; /* previous vertex in vertex_list */
|
---|
| 375 | pointT *point; /* hull_dim coordinates (coordT) */
|
---|
| 376 | setT *neighbors; /* neighboring facets of vertex, qh_vertexneighbors()
|
---|
| 377 | inits in io.c or after first merge */
|
---|
| 378 | unsigned visitid:31; /* for use with qh vertex_visit, size must match */
|
---|
| 379 | flagT seen2:1; /* another seen flag */
|
---|
| 380 | unsigned id:24; /* unique identifier, bit field matches qh.vertex_id */
|
---|
| 381 | unsigned dim:4; /* dimension of point if non-zero, used by cpp */
|
---|
| 382 | /* =>room for 4 flags */
|
---|
| 383 | flagT seen:1; /* used to perform operations only once */
|
---|
| 384 | flagT delridge:1; /* vertex was part of a deleted ridge */
|
---|
| 385 | flagT deleted:1; /* true if vertex on qh del_vertices */
|
---|
| 386 | flagT newlist:1; /* true if vertex on qh newvertex_list */
|
---|
| 387 | };
|
---|
| 388 |
|
---|
| 389 | #define MAX_vdim 15 /* Maximum size of vertex->dim */
|
---|
| 390 |
|
---|
| 391 | /*======= -global variables -qh ============================*/
|
---|
| 392 |
|
---|
| 393 | /*-<a href="qh-globa.htm#TOC"
|
---|
| 394 | >--------------------------------</a><a name="qh">-</a>
|
---|
| 395 |
|
---|
| 396 | qh
|
---|
| 397 | all global variables for qhull are in qh, qhmem, and qhstat
|
---|
| 398 |
|
---|
| 399 | notes:
|
---|
| 400 | qhmem is defined in mem.h, qhstat is defined in stat.h, qhrbox is defined in rboxpoints.h
|
---|
| 401 | Access to qh_qh is via the "qh" macro. See qh_QHpointer in user.h
|
---|
| 402 |
|
---|
| 403 | All global variables for qhull are in qh, qhmem, and qhstat
|
---|
| 404 | qh must be unique for each instance of qhull
|
---|
| 405 | qhstat may be shared between qhull instances.
|
---|
| 406 | qhmem may be shared across multiple instances of Qhull.
|
---|
| 407 | Rbox uses global variables rbox_inuse and rbox, but does not persist data across calls.
|
---|
| 408 |
|
---|
| 409 | Qhull is not multithreaded. Global state could be stored in thread-local storage.
|
---|
| 410 | */
|
---|
| 411 |
|
---|
| 412 | extern int qhull_inuse;
|
---|
| 413 |
|
---|
| 414 | typedef struct qhT qhT;
|
---|
| 415 | #if qh_QHpointer_dllimport
|
---|
| 416 | #define qh qh_qh->
|
---|
| 417 | __declspec(dllimport) extern qhT *qh_qh; /* allocated in global.c */
|
---|
| 418 | #elif qh_QHpointer
|
---|
| 419 | #define qh qh_qh->
|
---|
| 420 | extern qhT *qh_qh; /* allocated in global.c */
|
---|
| 421 | #elif qh_dllimport
|
---|
| 422 | #define qh qh_qh.
|
---|
| 423 | __declspec(dllimport) extern qhT qh_qh; /* allocated in global.c */
|
---|
| 424 | #else
|
---|
| 425 | #define qh qh_qh.
|
---|
| 426 | extern qhT qh_qh;
|
---|
| 427 | #endif
|
---|
| 428 |
|
---|
| 429 | struct qhT {
|
---|
| 430 |
|
---|
| 431 | /*-<a href="qh-globa.htm#TOC"
|
---|
| 432 | >--------------------------------</a><a name="qh-const">-</a>
|
---|
| 433 |
|
---|
| 434 | qh constants
|
---|
| 435 | configuration flags and constants for Qhull
|
---|
| 436 |
|
---|
| 437 | notes:
|
---|
| 438 | The user configures Qhull by defining flags. They are
|
---|
| 439 | copied into qh by qh_setflags(). qh-quick.htm#options defines the flags.
|
---|
| 440 | */
|
---|
| 441 | boolT ALLpoints; /* true 'Qs' if search all points for initial simplex */
|
---|
| 442 | boolT ANGLEmerge; /* true 'Qa' if sort potential merges by angle */
|
---|
| 443 | boolT APPROXhull; /* true 'Wn' if MINoutside set */
|
---|
| 444 | realT MINoutside; /* 'Wn' min. distance for an outside point */
|
---|
| 445 | boolT ANNOTATEoutput; /* true 'Ta' if annotate output with message codes */
|
---|
| 446 | boolT ATinfinity; /* true 'Qz' if point num_points-1 is "at-infinity"
|
---|
| 447 | for improving precision in Delaunay triangulations */
|
---|
| 448 | boolT AVOIDold; /* true 'Q4' if avoid old->new merges */
|
---|
| 449 | boolT BESToutside; /* true 'Qf' if partition points into best outsideset */
|
---|
| 450 | boolT CDDinput; /* true 'Pc' if input uses CDD format (1.0/offset first) */
|
---|
| 451 | boolT CDDoutput; /* true 'PC' if print normals in CDD format (offset first) */
|
---|
| 452 | boolT CHECKfrequently; /* true 'Tc' if checking frequently */
|
---|
| 453 | realT premerge_cos; /* 'A-n' cos_max when pre merging */
|
---|
| 454 | realT postmerge_cos; /* 'An' cos_max when post merging */
|
---|
| 455 | boolT DELAUNAY; /* true 'd' if computing DELAUNAY triangulation */
|
---|
| 456 | boolT DOintersections; /* true 'Gh' if print hyperplane intersections */
|
---|
| 457 | int DROPdim; /* drops dim 'GDn' for 4-d -> 3-d output */
|
---|
| 458 | boolT FORCEoutput; /* true 'Po' if forcing output despite degeneracies */
|
---|
| 459 | int GOODpoint; /* 1+n for 'QGn', good facet if visible/not(-) from point n*/
|
---|
| 460 | pointT *GOODpointp; /* the actual point */
|
---|
| 461 | boolT GOODthreshold; /* true if qh lower_threshold/upper_threshold defined
|
---|
| 462 | false if qh SPLITthreshold */
|
---|
| 463 | int GOODvertex; /* 1+n, good facet if vertex for point n */
|
---|
| 464 | pointT *GOODvertexp; /* the actual point */
|
---|
| 465 | boolT HALFspace; /* true 'Hn,n,n' if halfspace intersection */
|
---|
| 466 | int IStracing; /* trace execution, 0=none, 1=least, 4=most, -1=events */
|
---|
| 467 | int KEEParea; /* 'PAn' number of largest facets to keep */
|
---|
| 468 | boolT KEEPcoplanar; /* true 'Qc' if keeping nearest facet for coplanar points */
|
---|
| 469 | boolT KEEPinside; /* true 'Qi' if keeping nearest facet for inside points
|
---|
| 470 | set automatically if 'd Qc' */
|
---|
| 471 | int KEEPmerge; /* 'PMn' number of facets to keep with most merges */
|
---|
| 472 | realT KEEPminArea; /* 'PFn' minimum facet area to keep */
|
---|
| 473 | realT MAXcoplanar; /* 'Un' max distance below a facet to be coplanar*/
|
---|
| 474 | boolT MERGEexact; /* true 'Qx' if exact merges (coplanar, degen, dupridge, flipped) */
|
---|
| 475 | boolT MERGEindependent; /* true 'Q2' if merging independent sets */
|
---|
| 476 | boolT MERGING; /* true if exact-, pre- or post-merging, with angle and centrum tests */
|
---|
| 477 | realT premerge_centrum; /* 'C-n' centrum_radius when pre merging. Default is round-off */
|
---|
| 478 | realT postmerge_centrum; /* 'Cn' centrum_radius when post merging. Default is round-off */
|
---|
| 479 | boolT MERGEvertices; /* true 'Q3' if merging redundant vertices */
|
---|
| 480 | realT MINvisible; /* 'Vn' min. distance for a facet to be visible */
|
---|
| 481 | boolT NOnarrow; /* true 'Q10' if no special processing for narrow distributions */
|
---|
| 482 | boolT NOnearinside; /* true 'Q8' if ignore near-inside points when partitioning */
|
---|
| 483 | boolT NOpremerge; /* true 'Q0' if no defaults for C-0 or Qx */
|
---|
| 484 | boolT ONLYgood; /* true 'Qg' if process points with good visible or horizon facets */
|
---|
| 485 | boolT ONLYmax; /* true 'Qm' if only process points that increase max_outside */
|
---|
| 486 | boolT PICKfurthest; /* true 'Q9' if process furthest of furthest points*/
|
---|
| 487 | boolT POSTmerge; /* true if merging after buildhull (Cn or An) */
|
---|
| 488 | boolT PREmerge; /* true if merging during buildhull (C-n or A-n) */
|
---|
| 489 | /* NOTE: some of these names are similar to qh_PRINT names */
|
---|
| 490 | boolT PRINTcentrums; /* true 'Gc' if printing centrums */
|
---|
| 491 | boolT PRINTcoplanar; /* true 'Gp' if printing coplanar points */
|
---|
| 492 | int PRINTdim; /* print dimension for Geomview output */
|
---|
| 493 | boolT PRINTdots; /* true 'Ga' if printing all points as dots */
|
---|
| 494 | boolT PRINTgood; /* true 'Pg' if printing good facets */
|
---|
| 495 | boolT PRINTinner; /* true 'Gi' if printing inner planes */
|
---|
| 496 | boolT PRINTneighbors; /* true 'PG' if printing neighbors of good facets */
|
---|
| 497 | boolT PRINTnoplanes; /* true 'Gn' if printing no planes */
|
---|
| 498 | boolT PRINToptions1st; /* true 'FO' if printing options to stderr */
|
---|
| 499 | boolT PRINTouter; /* true 'Go' if printing outer planes */
|
---|
| 500 | boolT PRINTprecision; /* false 'Pp' if not reporting precision problems */
|
---|
| 501 | qh_PRINT PRINTout[qh_PRINTEND]; /* list of output formats to print */
|
---|
| 502 | boolT PRINTridges; /* true 'Gr' if print ridges */
|
---|
| 503 | boolT PRINTspheres; /* true 'Gv' if print vertices as spheres */
|
---|
| 504 | boolT PRINTstatistics; /* true 'Ts' if printing statistics to stderr */
|
---|
| 505 | boolT PRINTsummary; /* true 's' if printing summary to stderr */
|
---|
| 506 | boolT PRINTtransparent; /* true 'Gt' if print transparent outer ridges */
|
---|
| 507 | boolT PROJECTdelaunay; /* true if DELAUNAY, no readpoints() and
|
---|
| 508 | need projectinput() for Delaunay in qh_init_B */
|
---|
| 509 | int PROJECTinput; /* number of projected dimensions 'bn:0Bn:0' */
|
---|
| 510 | boolT QUICKhelp; /* true if quick help message for degen input */
|
---|
| 511 | boolT RANDOMdist; /* true if randomly change distplane and setfacetplane */
|
---|
| 512 | realT RANDOMfactor; /* maximum random perturbation */
|
---|
| 513 | realT RANDOMa; /* qh_randomfactor is randr * RANDOMa + RANDOMb */
|
---|
| 514 | realT RANDOMb;
|
---|
| 515 | boolT RANDOMoutside; /* true if select a random outside point */
|
---|
| 516 | int REPORTfreq; /* buildtracing reports every n facets */
|
---|
| 517 | int REPORTfreq2; /* tracemerging reports every REPORTfreq/2 facets */
|
---|
| 518 | int RERUN; /* 'TRn' rerun qhull n times (qh.build_cnt) */
|
---|
| 519 | int ROTATErandom; /* 'QRn' seed, 0 time, >= rotate input */
|
---|
| 520 | boolT SCALEinput; /* true 'Qbk' if scaling input */
|
---|
| 521 | boolT SCALElast; /* true 'Qbb' if scale last coord to max prev coord */
|
---|
| 522 | boolT SETroundoff; /* true 'E' if qh DISTround is predefined */
|
---|
| 523 | boolT SKIPcheckmax; /* true 'Q5' if skip qh_check_maxout */
|
---|
| 524 | boolT SKIPconvex; /* true 'Q6' if skip convexity testing during pre-merge */
|
---|
| 525 | boolT SPLITthresholds; /* true if upper_/lower_threshold defines a region
|
---|
| 526 | used only for printing (!for qh ONLYgood) */
|
---|
| 527 | int STOPcone; /* 'TCn' 1+n for stopping after cone for point n */
|
---|
| 528 | /* also used by qh_build_withresart for err exit*/
|
---|
| 529 | int STOPpoint; /* 'TVn' 'TV-n' 1+n for stopping after/before(-)
|
---|
| 530 | adding point n */
|
---|
| 531 | int TESTpoints; /* 'QTn' num of test points after qh.num_points. Test points always coplanar. */
|
---|
| 532 | boolT TESTvneighbors; /* true 'Qv' if test vertex neighbors at end */
|
---|
| 533 | int TRACElevel; /* 'Tn' conditional IStracing level */
|
---|
| 534 | int TRACElastrun; /* qh.TRACElevel applies to last qh.RERUN */
|
---|
| 535 | int TRACEpoint; /* 'TPn' start tracing when point n is a vertex */
|
---|
| 536 | realT TRACEdist; /* 'TWn' start tracing when merge distance too big */
|
---|
| 537 | int TRACEmerge; /* 'TMn' start tracing before this merge */
|
---|
| 538 | boolT TRIangulate; /* true 'Qt' if triangulate non-simplicial facets */
|
---|
| 539 | boolT TRInormals; /* true 'Q11' if triangulate duplicates normals (sets Qt) */
|
---|
| 540 | boolT UPPERdelaunay; /* true 'Qu' if computing furthest-site Delaunay */
|
---|
| 541 | boolT USEstdout; /* true 'Tz' if using stdout instead of stderr */
|
---|
| 542 | boolT VERIFYoutput; /* true 'Tv' if verify output at end of qhull */
|
---|
| 543 | boolT VIRTUALmemory; /* true 'Q7' if depth-first processing in buildhull */
|
---|
| 544 | boolT VORONOI; /* true 'v' if computing Voronoi diagram */
|
---|
| 545 |
|
---|
| 546 | /*--------input constants ---------*/
|
---|
| 547 | realT AREAfactor; /* 1/(hull_dim-1)! for converting det's to area */
|
---|
| 548 | boolT DOcheckmax; /* true if calling qh_check_maxout (qh_initqhull_globals) */
|
---|
| 549 | char *feasible_string; /* feasible point 'Hn,n,n' for halfspace intersection */
|
---|
| 550 | coordT *feasible_point; /* as coordinates, both malloc'd */
|
---|
| 551 | boolT GETarea; /* true 'Fa', 'FA', 'FS', 'PAn', 'PFn' if compute facet area/Voronoi volume in io.c */
|
---|
| 552 | boolT KEEPnearinside; /* true if near-inside points in coplanarset */
|
---|
| 553 | int hull_dim; /* dimension of hull, set by initbuffers */
|
---|
| 554 | int input_dim; /* dimension of input, set by initbuffers */
|
---|
| 555 | int num_points; /* number of input points */
|
---|
| 556 | pointT *first_point; /* array of input points, see POINTSmalloc */
|
---|
| 557 | boolT POINTSmalloc; /* true if qh first_point/num_points allocated */
|
---|
| 558 | pointT *input_points; /* copy of original qh.first_point for input points for qh_joggleinput */
|
---|
| 559 | boolT input_malloc; /* true if qh input_points malloc'd */
|
---|
| 560 | char qhull_command[256];/* command line that invoked this program */
|
---|
| 561 | int qhull_commandsiz2; /* size of qhull_command at qh_clear_outputflags */
|
---|
| 562 | char rbox_command[256]; /* command line that produced the input points */
|
---|
| 563 | char qhull_options[512];/* descriptive list of options */
|
---|
| 564 | int qhull_optionlen; /* length of last line */
|
---|
| 565 | int qhull_optionsiz; /* size of qhull_options at qh_build_withrestart */
|
---|
| 566 | int qhull_optionsiz2; /* size of qhull_options at qh_clear_outputflags */
|
---|
| 567 | int run_id; /* non-zero, random identifier for this instance of qhull */
|
---|
| 568 | boolT VERTEXneighbors; /* true if maintaining vertex neighbors */
|
---|
| 569 | boolT ZEROcentrum; /* true if 'C-0' or 'C-0 Qx'. sets ZEROall_ok */
|
---|
| 570 | realT *upper_threshold; /* don't print if facet->normal[k]>=upper_threshold[k]
|
---|
| 571 | must set either GOODthreshold or SPLITthreshold
|
---|
| 572 | if Delaunay, default is 0.0 for upper envelope */
|
---|
| 573 | realT *lower_threshold; /* don't print if facet->normal[k] <=lower_threshold[k] */
|
---|
| 574 | realT *upper_bound; /* scale point[k] to new upper bound */
|
---|
| 575 | realT *lower_bound; /* scale point[k] to new lower bound
|
---|
| 576 | project if both upper_ and lower_bound == 0 */
|
---|
| 577 |
|
---|
| 578 | /*-<a href="qh-globa.htm#TOC"
|
---|
| 579 | >--------------------------------</a><a name="qh-prec">-</a>
|
---|
| 580 |
|
---|
| 581 | qh precision constants
|
---|
| 582 | precision constants for Qhull
|
---|
| 583 |
|
---|
| 584 | notes:
|
---|
| 585 | qh_detroundoff() computes the maximum roundoff error for distance
|
---|
| 586 | and other computations. It also sets default values for the
|
---|
| 587 | qh constants above.
|
---|
| 588 | */
|
---|
| 589 | realT ANGLEround; /* max round off error for angles */
|
---|
| 590 | realT centrum_radius; /* max centrum radius for convexity (roundoff added) */
|
---|
| 591 | realT cos_max; /* max cosine for convexity (roundoff added) */
|
---|
| 592 | realT DISTround; /* max round off error for distances, 'E' overrides */
|
---|
| 593 | realT MAXabs_coord; /* max absolute coordinate */
|
---|
| 594 | realT MAXlastcoord; /* max last coordinate for qh_scalelast */
|
---|
| 595 | realT MAXsumcoord; /* max sum of coordinates */
|
---|
| 596 | realT MAXwidth; /* max rectilinear width of point coordinates */
|
---|
| 597 | realT MINdenom_1; /* min. abs. value for 1/x */
|
---|
| 598 | realT MINdenom; /* use divzero if denominator < MINdenom */
|
---|
| 599 | realT MINdenom_1_2; /* min. abs. val for 1/x that allows normalization */
|
---|
| 600 | realT MINdenom_2; /* use divzero if denominator < MINdenom_2 */
|
---|
| 601 | realT MINlastcoord; /* min. last coordinate for qh_scalelast */
|
---|
| 602 | boolT NARROWhull; /* set in qh_initialhull if angle < qh_MAXnarrow */
|
---|
| 603 | realT *NEARzero; /* hull_dim array for near zero in gausselim */
|
---|
| 604 | realT NEARinside; /* keep points for qh_check_maxout if close to facet */
|
---|
| 605 | realT ONEmerge; /* max distance for merging simplicial facets */
|
---|
| 606 | realT outside_err; /* application's epsilon for coplanar points
|
---|
| 607 | qh_check_bestdist() qh_check_points() reports error if point outside */
|
---|
| 608 | realT WIDEfacet; /* size of wide facet for skipping ridge in
|
---|
| 609 | area computation and locking centrum */
|
---|
| 610 |
|
---|
| 611 | /*-<a href="qh-globa.htm#TOC"
|
---|
| 612 | >--------------------------------</a><a name="qh-codetern">-</a>
|
---|
| 613 |
|
---|
| 614 | qh internal constants
|
---|
| 615 | internal constants for Qhull
|
---|
| 616 | */
|
---|
| 617 | char qhull[sizeof("qhull")]; /* "qhull" for checking ownership while debugging */
|
---|
| 618 | jmp_buf errexit; /* exit label for qh_errexit, defined by setjmp() */
|
---|
| 619 | char jmpXtra[40]; /* extra bytes in case jmp_buf is defined wrong by compiler */
|
---|
| 620 | jmp_buf restartexit; /* restart label for qh_errexit, defined by setjmp() */
|
---|
| 621 | char jmpXtra2[40]; /* extra bytes in case jmp_buf is defined wrong by compiler*/
|
---|
| 622 | FILE *fin; /* pointer to input file, init by qh_meminit */
|
---|
| 623 | FILE *fout; /* pointer to output file */
|
---|
| 624 | FILE *ferr; /* pointer to error file */
|
---|
| 625 | pointT *interior_point; /* center point of the initial simplex*/
|
---|
| 626 | int normal_size; /* size in bytes for facet normals and point coords*/
|
---|
| 627 | int center_size; /* size in bytes for Voronoi centers */
|
---|
| 628 | int TEMPsize; /* size for small, temporary sets (in quick mem) */
|
---|
| 629 |
|
---|
| 630 | /*-<a href="qh-globa.htm#TOC"
|
---|
| 631 | >--------------------------------</a><a name="qh-lists">-</a>
|
---|
| 632 |
|
---|
| 633 | qh facet and vertex lists
|
---|
| 634 | defines lists of facets, new facets, visible facets, vertices, and
|
---|
| 635 | new vertices. Includes counts, next ids, and trace ids.
|
---|
| 636 | see:
|
---|
| 637 | qh_resetlists()
|
---|
| 638 | */
|
---|
| 639 | facetT *facet_list; /* first facet */
|
---|
| 640 | facetT *facet_tail; /* end of facet_list (dummy facet) */
|
---|
| 641 | facetT *facet_next; /* next facet for buildhull()
|
---|
| 642 | previous facets do not have outside sets
|
---|
| 643 | NARROWhull: previous facets may have coplanar outside sets for qh_outcoplanar */
|
---|
| 644 | facetT *newfacet_list; /* list of new facets to end of facet_list */
|
---|
| 645 | facetT *visible_list; /* list of visible facets preceeding newfacet_list,
|
---|
| 646 | facet->visible set */
|
---|
| 647 | int num_visible; /* current number of visible facets */
|
---|
| 648 | unsigned tracefacet_id; /* set at init, then can print whenever */
|
---|
| 649 | facetT *tracefacet; /* set in newfacet/mergefacet, undone in delfacet*/
|
---|
| 650 | unsigned tracevertex_id; /* set at buildtracing, can print whenever */
|
---|
| 651 | vertexT *tracevertex; /* set in newvertex, undone in delvertex*/
|
---|
| 652 | vertexT *vertex_list; /* list of all vertices, to vertex_tail */
|
---|
| 653 | vertexT *vertex_tail; /* end of vertex_list (dummy vertex) */
|
---|
| 654 | vertexT *newvertex_list; /* list of vertices in newfacet_list, to vertex_tail
|
---|
| 655 | all vertices have 'newlist' set */
|
---|
| 656 | int num_facets; /* number of facets in facet_list
|
---|
| 657 | includes visble faces (num_visible) */
|
---|
| 658 | int num_vertices; /* number of vertices in facet_list */
|
---|
| 659 | int num_outside; /* number of points in outsidesets (for tracing and RANDOMoutside)
|
---|
| 660 | includes coplanar outsideset points for NARROWhull/qh_outcoplanar() */
|
---|
| 661 | int num_good; /* number of good facets (after findgood_all) */
|
---|
| 662 | unsigned facet_id; /* ID of next, new facet from newfacet() */
|
---|
| 663 | unsigned ridge_id:24; /* ID of next, new ridge from newridge() */
|
---|
| 664 | unsigned vertex_id:24; /* ID of next, new vertex from newvertex() */
|
---|
| 665 |
|
---|
| 666 | /*-<a href="qh-globa.htm#TOC"
|
---|
| 667 | >--------------------------------</a><a name="qh-var">-</a>
|
---|
| 668 |
|
---|
| 669 | qh global variables
|
---|
| 670 | defines minimum and maximum distances, next visit ids, several flags,
|
---|
| 671 | and other global variables.
|
---|
| 672 | initialize in qh_initbuild or qh_maxmin if used in qh_buildhull
|
---|
| 673 | */
|
---|
| 674 | unsigned long hulltime; /* ignore time to set up input and randomize */
|
---|
| 675 | /* use unsigned to avoid wrap-around errors */
|
---|
| 676 | boolT ALLOWrestart; /* true if qh_precision can use qh.restartexit */
|
---|
| 677 | int build_cnt; /* number of calls to qh_initbuild */
|
---|
| 678 | qh_CENTER CENTERtype; /* current type of facet->center, qh_CENTER */
|
---|
| 679 | int furthest_id; /* pointid of furthest point, for tracing */
|
---|
| 680 | facetT *GOODclosest; /* closest facet to GOODthreshold in qh_findgood */
|
---|
| 681 | boolT hasAreaVolume; /* true if totarea, totvol was defined by qh_getarea */
|
---|
| 682 | boolT hasTriangulation; /* true if triangulation created by qh_triangulate */
|
---|
| 683 | realT JOGGLEmax; /* set 'QJn' if randomly joggle input */
|
---|
| 684 | boolT maxoutdone; /* set qh_check_maxout(), cleared by qh_addpoint() */
|
---|
| 685 | realT max_outside; /* maximum distance from a point to a facet,
|
---|
| 686 | before roundoff, not simplicial vertices
|
---|
| 687 | actual outer plane is +DISTround and
|
---|
| 688 | computed outer plane is +2*DISTround */
|
---|
| 689 | realT max_vertex; /* maximum distance (>0) from vertex to a facet,
|
---|
| 690 | before roundoff, due to a merge */
|
---|
| 691 | realT min_vertex; /* minimum distance (<0) from vertex to a facet,
|
---|
| 692 | before roundoff, due to a merge
|
---|
| 693 | if qh.JOGGLEmax, qh_makenewplanes sets it
|
---|
| 694 | recomputed if qh.DOcheckmax, default -qh.DISTround */
|
---|
| 695 | boolT NEWfacets; /* true while visible facets invalid due to new or merge
|
---|
| 696 | from makecone/attachnewfacets to deletevisible */
|
---|
| 697 | boolT findbestnew; /* true if partitioning calls qh_findbestnew */
|
---|
| 698 | boolT findbest_notsharp; /* true if new facets are at least 90 degrees */
|
---|
| 699 | boolT NOerrexit; /* true if qh.errexit is not available */
|
---|
| 700 | realT PRINTcradius; /* radius for printing centrums */
|
---|
| 701 | realT PRINTradius; /* radius for printing vertex spheres and points */
|
---|
| 702 | boolT POSTmerging; /* true when post merging */
|
---|
| 703 | int printoutvar; /* temporary variable for qh_printbegin, etc. */
|
---|
| 704 | int printoutnum; /* number of facets printed */
|
---|
| 705 | boolT QHULLfinished; /* True after qhull() is finished */
|
---|
| 706 | realT totarea; /* 'FA': total facet area computed by qh_getarea, hasAreaVolume */
|
---|
| 707 | realT totvol; /* 'FA': total volume computed by qh_getarea, hasAreaVolume */
|
---|
| 708 | unsigned int visit_id; /* unique ID for searching neighborhoods, */
|
---|
| 709 | unsigned int vertex_visit:31; /* unique ID for searching vertices, reset with qh_buildtracing */
|
---|
| 710 | boolT ZEROall_ok; /* True if qh_checkzero always succeeds */
|
---|
| 711 | boolT WAScoplanar; /* True if qh_partitioncoplanar (qh_check_maxout) */
|
---|
| 712 |
|
---|
| 713 | /*-<a href="qh-globa.htm#TOC"
|
---|
| 714 | >--------------------------------</a><a name="qh-set">-</a>
|
---|
| 715 |
|
---|
| 716 | qh global sets
|
---|
| 717 | defines sets for merging, initial simplex, hashing, extra input points,
|
---|
| 718 | and deleted vertices
|
---|
| 719 | */
|
---|
| 720 | setT *facet_mergeset; /* temporary set of merges to be done */
|
---|
| 721 | setT *degen_mergeset; /* temporary set of degenerate and redundant merges */
|
---|
| 722 | setT *hash_table; /* hash table for matching ridges in qh_matchfacets
|
---|
| 723 | size is setsize() */
|
---|
| 724 | setT *other_points; /* additional points */
|
---|
| 725 | setT *del_vertices; /* vertices to partition and delete with visible
|
---|
| 726 | facets. Have deleted set for checkfacet */
|
---|
| 727 |
|
---|
| 728 | /*-<a href="qh-globa.htm#TOC"
|
---|
| 729 | >--------------------------------</a><a name="qh-buf">-</a>
|
---|
| 730 |
|
---|
| 731 | qh global buffers
|
---|
| 732 | defines buffers for maxtrix operations, input, and error messages
|
---|
| 733 | */
|
---|
| 734 | coordT *gm_matrix; /* (dim+1)Xdim matrix for geom.c */
|
---|
| 735 | coordT **gm_row; /* array of gm_matrix rows */
|
---|
| 736 | char* line; /* malloc'd input line of maxline+1 chars */
|
---|
| 737 | int maxline;
|
---|
| 738 | coordT *half_space; /* malloc'd input array for halfspace (qh normal_size+coordT) */
|
---|
| 739 | coordT *temp_malloc; /* malloc'd input array for points */
|
---|
| 740 |
|
---|
| 741 | /*-<a href="qh-globa.htm#TOC"
|
---|
| 742 | >--------------------------------</a><a name="qh-static">-</a>
|
---|
| 743 |
|
---|
| 744 | qh static variables
|
---|
| 745 | defines static variables for individual functions
|
---|
| 746 |
|
---|
| 747 | notes:
|
---|
| 748 | do not use 'static' within a function. Multiple instances of qhull
|
---|
| 749 | may exist.
|
---|
| 750 |
|
---|
| 751 | do not assume zero initialization, 'QPn' may cause a restart
|
---|
| 752 | */
|
---|
| 753 | boolT ERREXITcalled; /* true during qh_errexit (prevents duplicate calls */
|
---|
| 754 | boolT firstcentrum; /* for qh_printcentrum */
|
---|
| 755 | boolT old_randomdist; /* save RANDOMdist flag during io, tracing, or statistics */
|
---|
| 756 | setT *coplanarfacetset; /* set of coplanar facets for searching qh_findbesthorizon() */
|
---|
| 757 | realT last_low; /* qh_scalelast parameters for qh_setdelaunay */
|
---|
| 758 | realT last_high;
|
---|
| 759 | realT last_newhigh;
|
---|
| 760 | unsigned lastreport; /* for qh_buildtracing */
|
---|
| 761 | int mergereport; /* for qh_tracemerging */
|
---|
| 762 | qhstatT *old_qhstat; /* for saving qh_qhstat in save_qhull() and UsingLibQhull. Free with qh_free() */
|
---|
| 763 | setT *old_tempstack; /* for saving qhmem.tempstack in save_qhull */
|
---|
| 764 | int ridgeoutnum; /* number of ridges for 4OFF output (qh_printbegin,etc) */
|
---|
| 765 | };
|
---|
| 766 |
|
---|
| 767 | /*=========== -macros- =========================*/
|
---|
| 768 |
|
---|
| 769 | /*-<a href="qh-poly.htm#TOC"
|
---|
| 770 | >--------------------------------</a><a name="otherfacet_">-</a>
|
---|
| 771 |
|
---|
| 772 | otherfacet_(ridge, facet)
|
---|
| 773 | return neighboring facet for a ridge in facet
|
---|
| 774 | */
|
---|
| 775 | #define otherfacet_(ridge, facet) \
|
---|
| 776 | (((ridge)->top == (facet)) ? (ridge)->bottom : (ridge)->top)
|
---|
| 777 |
|
---|
| 778 | /*-<a href="qh-poly.htm#TOC"
|
---|
| 779 | >--------------------------------</a><a name="getid_">-</a>
|
---|
| 780 |
|
---|
| 781 | getid_(p)
|
---|
| 782 | return int ID for facet, ridge, or vertex
|
---|
| 783 | return -1 if NULL
|
---|
| 784 | */
|
---|
| 785 | #define getid_(p) ((p) ? (int)((p)->id) : -1)
|
---|
| 786 |
|
---|
| 787 | /*============== FORALL macros ===================*/
|
---|
| 788 |
|
---|
| 789 | /*-<a href="qh-poly.htm#TOC"
|
---|
| 790 | >--------------------------------</a><a name="FORALLfacets">-</a>
|
---|
| 791 |
|
---|
| 792 | FORALLfacets { ... }
|
---|
| 793 | assign 'facet' to each facet in qh.facet_list
|
---|
| 794 |
|
---|
| 795 | notes:
|
---|
| 796 | uses 'facetT *facet;'
|
---|
| 797 | assumes last facet is a sentinel
|
---|
| 798 |
|
---|
| 799 | see:
|
---|
| 800 | FORALLfacet_( facetlist )
|
---|
| 801 | */
|
---|
| 802 | #define FORALLfacets for (facet=qh facet_list;facet && facet->next;facet=facet->next)
|
---|
| 803 |
|
---|
| 804 | /*-<a href="qh-poly.htm#TOC"
|
---|
| 805 | >--------------------------------</a><a name="FORALLpoints">-</a>
|
---|
| 806 |
|
---|
| 807 | FORALLpoints { ... }
|
---|
| 808 | assign 'point' to each point in qh.first_point, qh.num_points
|
---|
| 809 |
|
---|
| 810 | declare:
|
---|
| 811 | coordT *point, *pointtemp;
|
---|
| 812 | */
|
---|
| 813 | #define FORALLpoints FORALLpoint_(qh first_point, qh num_points)
|
---|
| 814 |
|
---|
| 815 | /*-<a href="qh-poly.htm#TOC"
|
---|
| 816 | >--------------------------------</a><a name="FORALLpoint_">-</a>
|
---|
| 817 |
|
---|
| 818 | FORALLpoint_( points, num) { ... }
|
---|
| 819 | assign 'point' to each point in points array of num points
|
---|
| 820 |
|
---|
| 821 | declare:
|
---|
| 822 | coordT *point, *pointtemp;
|
---|
| 823 | */
|
---|
| 824 | #define FORALLpoint_(points, num) for (point= (points), \
|
---|
| 825 | pointtemp= (points)+qh hull_dim*(num); point < pointtemp; point += qh hull_dim)
|
---|
| 826 |
|
---|
| 827 | /*-<a href="qh-poly.htm#TOC"
|
---|
| 828 | >--------------------------------</a><a name="FORALLvertices">-</a>
|
---|
| 829 |
|
---|
| 830 | FORALLvertices { ... }
|
---|
| 831 | assign 'vertex' to each vertex in qh.vertex_list
|
---|
| 832 |
|
---|
| 833 | declare:
|
---|
| 834 | vertexT *vertex;
|
---|
| 835 |
|
---|
| 836 | notes:
|
---|
| 837 | assumes qh.vertex_list terminated with a sentinel
|
---|
| 838 | */
|
---|
| 839 | #define FORALLvertices for (vertex=qh vertex_list;vertex && vertex->next;vertex= vertex->next)
|
---|
| 840 |
|
---|
| 841 | /*-<a href="qh-poly.htm#TOC"
|
---|
| 842 | >--------------------------------</a><a name="FOREACHfacet_">-</a>
|
---|
| 843 |
|
---|
| 844 | FOREACHfacet_( facets ) { ... }
|
---|
| 845 | assign 'facet' to each facet in facets
|
---|
| 846 |
|
---|
| 847 | declare:
|
---|
| 848 | facetT *facet, **facetp;
|
---|
| 849 |
|
---|
| 850 | see:
|
---|
| 851 | <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a>
|
---|
| 852 | */
|
---|
| 853 | #define FOREACHfacet_(facets) FOREACHsetelement_(facetT, facets, facet)
|
---|
| 854 |
|
---|
| 855 | /*-<a href="qh-poly.htm#TOC"
|
---|
| 856 | >--------------------------------</a><a name="FOREACHneighbor_">-</a>
|
---|
| 857 |
|
---|
| 858 | FOREACHneighbor_( facet ) { ... }
|
---|
| 859 | assign 'neighbor' to each neighbor in facet->neighbors
|
---|
| 860 |
|
---|
| 861 | FOREACHneighbor_( vertex ) { ... }
|
---|
| 862 | assign 'neighbor' to each neighbor in vertex->neighbors
|
---|
| 863 |
|
---|
| 864 | declare:
|
---|
| 865 | facetT *neighbor, **neighborp;
|
---|
| 866 |
|
---|
| 867 | see:
|
---|
| 868 | <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a>
|
---|
| 869 | */
|
---|
| 870 | #define FOREACHneighbor_(facet) FOREACHsetelement_(facetT, facet->neighbors, neighbor)
|
---|
| 871 |
|
---|
| 872 | /*-<a href="qh-poly.htm#TOC"
|
---|
| 873 | >--------------------------------</a><a name="FOREACHpoint_">-</a>
|
---|
| 874 |
|
---|
| 875 | FOREACHpoint_( points ) { ... }
|
---|
| 876 | assign 'point' to each point in points set
|
---|
| 877 |
|
---|
| 878 | declare:
|
---|
| 879 | pointT *point, **pointp;
|
---|
| 880 |
|
---|
| 881 | see:
|
---|
| 882 | <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a>
|
---|
| 883 | */
|
---|
| 884 | #define FOREACHpoint_(points) FOREACHsetelement_(pointT, points, point)
|
---|
| 885 |
|
---|
| 886 | /*-<a href="qh-poly.htm#TOC"
|
---|
| 887 | >--------------------------------</a><a name="FOREACHridge_">-</a>
|
---|
| 888 |
|
---|
| 889 | FOREACHridge_( ridges ) { ... }
|
---|
| 890 | assign 'ridge' to each ridge in ridges set
|
---|
| 891 |
|
---|
| 892 | declare:
|
---|
| 893 | ridgeT *ridge, **ridgep;
|
---|
| 894 |
|
---|
| 895 | see:
|
---|
| 896 | <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a>
|
---|
| 897 | */
|
---|
| 898 | #define FOREACHridge_(ridges) FOREACHsetelement_(ridgeT, ridges, ridge)
|
---|
| 899 |
|
---|
| 900 | /*-<a href="qh-poly.htm#TOC"
|
---|
| 901 | >--------------------------------</a><a name="FOREACHvertex_">-</a>
|
---|
| 902 |
|
---|
| 903 | FOREACHvertex_( vertices ) { ... }
|
---|
| 904 | assign 'vertex' to each vertex in vertices set
|
---|
| 905 |
|
---|
| 906 | declare:
|
---|
| 907 | vertexT *vertex, **vertexp;
|
---|
| 908 |
|
---|
| 909 | see:
|
---|
| 910 | <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a>
|
---|
| 911 | */
|
---|
| 912 | #define FOREACHvertex_(vertices) FOREACHsetelement_(vertexT, vertices,vertex)
|
---|
| 913 |
|
---|
| 914 | /*-<a href="qh-poly.htm#TOC"
|
---|
| 915 | >--------------------------------</a><a name="FOREACHfacet_i_">-</a>
|
---|
| 916 |
|
---|
| 917 | FOREACHfacet_i_( facets ) { ... }
|
---|
| 918 | assign 'facet' and 'facet_i' for each facet in facets set
|
---|
| 919 |
|
---|
| 920 | declare:
|
---|
| 921 | facetT *facet;
|
---|
| 922 | int facet_n, facet_i;
|
---|
| 923 |
|
---|
| 924 | see:
|
---|
| 925 | <a href="qset.h#FOREACHsetelement_i_">FOREACHsetelement_i_</a>
|
---|
| 926 | */
|
---|
| 927 | #define FOREACHfacet_i_(facets) FOREACHsetelement_i_(facetT, facets, facet)
|
---|
| 928 |
|
---|
| 929 | /*-<a href="qh-poly.htm#TOC"
|
---|
| 930 | >--------------------------------</a><a name="FOREACHneighbor_i_">-</a>
|
---|
| 931 |
|
---|
| 932 | FOREACHneighbor_i_( facet ) { ... }
|
---|
| 933 | assign 'neighbor' and 'neighbor_i' for each neighbor in facet->neighbors
|
---|
| 934 |
|
---|
| 935 | FOREACHneighbor_i_( vertex ) { ... }
|
---|
| 936 | assign 'neighbor' and 'neighbor_i' for each neighbor in vertex->neighbors
|
---|
| 937 |
|
---|
| 938 | declare:
|
---|
| 939 | facetT *neighbor;
|
---|
| 940 | int neighbor_n, neighbor_i;
|
---|
| 941 |
|
---|
| 942 | see:
|
---|
| 943 | <a href="qset.h#FOREACHsetelement_i_">FOREACHsetelement_i_</a>
|
---|
| 944 | */
|
---|
| 945 | #define FOREACHneighbor_i_(facet) FOREACHsetelement_i_(facetT, facet->neighbors, neighbor)
|
---|
| 946 |
|
---|
| 947 | /*-<a href="qh-poly.htm#TOC"
|
---|
| 948 | >--------------------------------</a><a name="FOREACHpoint_i_">-</a>
|
---|
| 949 |
|
---|
| 950 | FOREACHpoint_i_( points ) { ... }
|
---|
| 951 | assign 'point' and 'point_i' for each point in points set
|
---|
| 952 |
|
---|
| 953 | declare:
|
---|
| 954 | pointT *point;
|
---|
| 955 | int point_n, point_i;
|
---|
| 956 |
|
---|
| 957 | see:
|
---|
| 958 | <a href="qset.h#FOREACHsetelement_i_">FOREACHsetelement_i_</a>
|
---|
| 959 | */
|
---|
| 960 | #define FOREACHpoint_i_(points) FOREACHsetelement_i_(pointT, points, point)
|
---|
| 961 |
|
---|
| 962 | /*-<a href="qh-poly.htm#TOC"
|
---|
| 963 | >--------------------------------</a><a name="FOREACHridge_i_">-</a>
|
---|
| 964 |
|
---|
| 965 | FOREACHridge_i_( ridges ) { ... }
|
---|
| 966 | assign 'ridge' and 'ridge_i' for each ridge in ridges set
|
---|
| 967 |
|
---|
| 968 | declare:
|
---|
| 969 | ridgeT *ridge;
|
---|
| 970 | int ridge_n, ridge_i;
|
---|
| 971 |
|
---|
| 972 | see:
|
---|
| 973 | <a href="qset.h#FOREACHsetelement_i_">FOREACHsetelement_i_</a>
|
---|
| 974 | */
|
---|
| 975 | #define FOREACHridge_i_(ridges) FOREACHsetelement_i_(ridgeT, ridges, ridge)
|
---|
| 976 |
|
---|
| 977 | /*-<a href="qh-poly.htm#TOC"
|
---|
| 978 | >--------------------------------</a><a name="FOREACHvertex_i_">-</a>
|
---|
| 979 |
|
---|
| 980 | FOREACHvertex_i_( vertices ) { ... }
|
---|
| 981 | assign 'vertex' and 'vertex_i' for each vertex in vertices set
|
---|
| 982 |
|
---|
| 983 | declare:
|
---|
| 984 | vertexT *vertex;
|
---|
| 985 | int vertex_n, vertex_i;
|
---|
| 986 |
|
---|
| 987 | see:
|
---|
| 988 | <a href="qset.h#FOREACHsetelement_i_">FOREACHsetelement_i_</a>
|
---|
| 989 | */
|
---|
| 990 | #define FOREACHvertex_i_(vertices) FOREACHsetelement_i_(vertexT, vertices,vertex)
|
---|
| 991 |
|
---|
| 992 | /********* -libqhull.c prototypes (duplicated from qhull_a.h) **********************/
|
---|
| 993 |
|
---|
| 994 | void qh_qhull(void);
|
---|
| 995 | boolT qh_addpoint(pointT *furthest, facetT *facet, boolT checkdist);
|
---|
| 996 | void qh_printsummary(FILE *fp);
|
---|
| 997 |
|
---|
| 998 | /********* -user.c prototypes (alphabetical) **********************/
|
---|
| 999 |
|
---|
| 1000 | void qh_errexit(int exitcode, facetT *facet, ridgeT *ridge);
|
---|
| 1001 | void qh_errprint(const char* string, facetT *atfacet, facetT *otherfacet, ridgeT *atridge, vertexT *atvertex);
|
---|
| 1002 | int qh_new_qhull(int dim, int numpoints, coordT *points, boolT ismalloc,
|
---|
| 1003 | char *qhull_cmd, FILE *outfile, FILE *errfile);
|
---|
| 1004 | void qh_printfacetlist(facetT *facetlist, setT *facets, boolT printall);
|
---|
| 1005 | void qh_printhelp_degenerate(FILE *fp);
|
---|
| 1006 | void qh_printhelp_narrowhull(FILE *fp, realT minangle);
|
---|
| 1007 | void qh_printhelp_singular(FILE *fp);
|
---|
| 1008 | void qh_user_memsizes(void);
|
---|
| 1009 |
|
---|
| 1010 | /********* -usermem.c prototypes (alphabetical) **********************/
|
---|
| 1011 | void qh_exit(int exitcode);
|
---|
| 1012 | void qh_free(void *mem);
|
---|
| 1013 | void *qh_malloc(size_t size);
|
---|
| 1014 |
|
---|
| 1015 | /********* -userprintf.c and userprintf_rbox.c prototypes **********************/
|
---|
| 1016 | void qh_fprintf(FILE *fp, int msgcode, const char *fmt, ... );
|
---|
| 1017 | void qh_fprintf_rbox(FILE *fp, int msgcode, const char *fmt, ... );
|
---|
| 1018 |
|
---|
| 1019 | /***** -geom.c/geom2.c/random.c prototypes (duplicated from geom.h, random.h) ****************/
|
---|
| 1020 |
|
---|
| 1021 | facetT *qh_findbest(pointT *point, facetT *startfacet,
|
---|
| 1022 | boolT bestoutside, boolT newfacets, boolT noupper,
|
---|
| 1023 | realT *dist, boolT *isoutside, int *numpart);
|
---|
| 1024 | facetT *qh_findbestnew(pointT *point, facetT *startfacet,
|
---|
| 1025 | realT *dist, boolT bestoutside, boolT *isoutside, int *numpart);
|
---|
| 1026 | boolT qh_gram_schmidt(int dim, realT **rows);
|
---|
| 1027 | void qh_outerinner(facetT *facet, realT *outerplane, realT *innerplane);
|
---|
| 1028 | void qh_printsummary(FILE *fp);
|
---|
| 1029 | void qh_projectinput(void);
|
---|
| 1030 | void qh_randommatrix(realT *buffer, int dim, realT **row);
|
---|
| 1031 | void qh_rotateinput(realT **rows);
|
---|
| 1032 | void qh_scaleinput(void);
|
---|
| 1033 | void qh_setdelaunay(int dim, int count, pointT *points);
|
---|
| 1034 | coordT *qh_sethalfspace_all(int dim, int count, coordT *halfspaces, pointT *feasible);
|
---|
| 1035 |
|
---|
| 1036 | /***** -global.c prototypes (alphabetical) ***********************/
|
---|
| 1037 |
|
---|
| 1038 | unsigned long qh_clock(void);
|
---|
| 1039 | void qh_checkflags(char *command, char *hiddenflags);
|
---|
| 1040 | void qh_clear_outputflags(void);
|
---|
| 1041 | void qh_freebuffers(void);
|
---|
| 1042 | void qh_freeqhull(boolT allmem);
|
---|
| 1043 | void qh_freeqhull2(boolT allmem);
|
---|
| 1044 | void qh_init_A(FILE *infile, FILE *outfile, FILE *errfile, int argc, char *argv[]);
|
---|
| 1045 | void qh_init_B(coordT *points, int numpoints, int dim, boolT ismalloc);
|
---|
| 1046 | void qh_init_qhull_command(int argc, char *argv[]);
|
---|
| 1047 | void qh_initbuffers(coordT *points, int numpoints, int dim, boolT ismalloc);
|
---|
| 1048 | void qh_initflags(char *command);
|
---|
| 1049 | void qh_initqhull_buffers(void);
|
---|
| 1050 | void qh_initqhull_globals(coordT *points, int numpoints, int dim, boolT ismalloc);
|
---|
| 1051 | void qh_initqhull_mem(void);
|
---|
| 1052 | void qh_initqhull_outputflags(void);
|
---|
| 1053 | void qh_initqhull_start(FILE *infile, FILE *outfile, FILE *errfile);
|
---|
| 1054 | void qh_initqhull_start2(FILE *infile, FILE *outfile, FILE *errfile);
|
---|
| 1055 | void qh_initthresholds(char *command);
|
---|
| 1056 | void qh_option(const char *option, int *i, realT *r);
|
---|
| 1057 | #if qh_QHpointer
|
---|
| 1058 | void qh_restore_qhull(qhT **oldqh);
|
---|
| 1059 | qhT *qh_save_qhull(void);
|
---|
| 1060 | #endif
|
---|
| 1061 |
|
---|
| 1062 | /***** -io.c prototypes (duplicated from io.h) ***********************/
|
---|
| 1063 |
|
---|
| 1064 | void dfacet( unsigned id);
|
---|
| 1065 | void dvertex( unsigned id);
|
---|
| 1066 | void qh_printneighborhood(FILE *fp, qh_PRINT format, facetT *facetA, facetT *facetB, boolT printall);
|
---|
| 1067 | void qh_produce_output(void);
|
---|
| 1068 | coordT *qh_readpoints(int *numpoints, int *dimension, boolT *ismalloc);
|
---|
| 1069 |
|
---|
| 1070 |
|
---|
| 1071 | /********* -mem.c prototypes (duplicated from mem.h) **********************/
|
---|
| 1072 |
|
---|
| 1073 | void qh_meminit(FILE *ferr);
|
---|
| 1074 | void qh_memfreeshort(int *curlong, int *totlong);
|
---|
| 1075 |
|
---|
| 1076 | /********* -poly.c/poly2.c prototypes (duplicated from poly.h) **********************/
|
---|
| 1077 |
|
---|
| 1078 | void qh_check_output(void);
|
---|
| 1079 | void qh_check_points(void);
|
---|
| 1080 | setT *qh_facetvertices(facetT *facetlist, setT *facets, boolT allfacets);
|
---|
| 1081 | facetT *qh_findbestfacet(pointT *point, boolT bestoutside,
|
---|
| 1082 | realT *bestdist, boolT *isoutside);
|
---|
| 1083 | vertexT *qh_nearvertex(facetT *facet, pointT *point, realT *bestdistp);
|
---|
| 1084 | pointT *qh_point(int id);
|
---|
| 1085 | setT *qh_pointfacet(void /*qh.facet_list*/);
|
---|
| 1086 | int qh_pointid(pointT *point);
|
---|
| 1087 | setT *qh_pointvertex(void /*qh.facet_list*/);
|
---|
| 1088 | void qh_setvoronoi_all(void);
|
---|
| 1089 | void qh_triangulate(void /*qh facet_list*/);
|
---|
| 1090 |
|
---|
| 1091 | /********* -rboxpoints.c prototypes **********************/
|
---|
| 1092 | int qh_rboxpoints(FILE* fout, FILE* ferr, char* rbox_command);
|
---|
| 1093 | void qh_errexit_rbox(int exitcode);
|
---|
| 1094 |
|
---|
| 1095 | /********* -stat.c prototypes (duplicated from stat.h) **********************/
|
---|
| 1096 |
|
---|
| 1097 | void qh_collectstatistics(void);
|
---|
| 1098 | void qh_printallstatistics(FILE *fp, const char *string);
|
---|
| 1099 |
|
---|
| 1100 | #endif /* qhDEFlibqhull */
|
---|