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