~ubuntu-branches/ubuntu/trusty/qhull/trusty-proposed

« back to all changes in this revision

Viewing changes to src/libqhull/libqhull.h

  • Committer: Package Import Robot
  • Author(s): Barak A. Pearlmutter
  • Date: 2014-02-13 11:09:12 UTC
  • mfrom: (8.1.4 sid)
  • Revision ID: package-import@ubuntu.com-20140213110912-ifwyxorlsnnl1ebh
Tags: 2012.1-4
Add convenience link to #include <qhull/qhull.h> to simplify transition.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 preceding 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 */