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