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 */ 1101