1 /*<html><pre>  -<a                             href="qh-user.htm"
2   >-------------------------------</a><a name="TOP">-</a>
3 
4    user.h
5    user redefinable constants
6 
7    see qh-user.htm.  see COPYING for copyright information.
8 
9    before reading any code, review qhull.h for data structure definitions and
10    the "qh" macro.
11 */
12 
13 #ifndef qhDEFuser
14 #define qhDEFuser 1
15 
16 /*============= data types and configuration macros ==========*/
17 
18 /*-<a                             href="qh-user.htm#TOC"
19   >--------------------------------</a><a name="realT">-</a>
20 
21   realT
22     set the size of floating point numbers
23 
24   qh_REALdigits
25     maximimum number of significant digits
26 
27   qh_REAL_1, qh_REAL_2n, qh_REAL_3n
28     format strings for printf
29 
30   qh_REALmax, qh_REALmin
31     maximum and minimum (near zero) values
32 
33   qh_REALepsilon
34     machine roundoff.  Maximum roundoff error for addition and multiplication.
35 
36   notes:
37    Select whether to store floating point numbers in single precision (float)
38    or double precision (double).
39 
40    Use 'float' to save about 8% in time and 25% in space.  This is particularly
41    help if high-d where convex hulls are space limited.  Using 'float' also
42    reduces the printed size of Qhull's output since numbers have 8 digits of
43    precision.
44 
45    Use 'double' when greater arithmetic precision is needed.  This is needed
46    for Delaunay triangulations and Voronoi diagrams when you are not merging
47    facets.
48 
49    If 'double' gives insufficient precision, your data probably includes
50    degeneracies.  If so you should use facet merging (done by default)
51    or exact arithmetic (see imprecision section of manual, qh-impre.htm).
52    You may also use option 'Po' to force output despite precision errors.
53 
54    You may use 'long double', but many format statements need to be changed
55    and you may need a 'long double' square root routine.  S. Grundmann
56    (sg@eeiwzb.et.tu-dresden.de) has done this.  He reports that the code runs
57    much slower with little gain in precision.
58 
59    WARNING: on some machines,    int f(){realT a= REALmax;return (a == REALmax);}
60       returns False.  Use (a > REALmax/2) instead of (a == REALmax).
61 
62    REALfloat =   1      all numbers are 'float' type
63              =   0      all numbers are 'double' type
64 */
65 #define REALfloat 0
66 
67 #if (REALfloat == 1)
68 #define realT float
69 #define REALmax FLT_MAX
70 #define REALmin FLT_MIN
71 #define REALepsilon FLT_EPSILON
72 #define qh_REALdigits 8   /* maximum number of significant digits */
73 #define qh_REAL_1 "%6.8g "
74 #define qh_REAL_2n "%6.8g %6.8g\n"
75 #define qh_REAL_3n "%6.8g %6.8g %6.8g\n"
76 
77 #elif (REALfloat == 0)
78 #define realT double
79 #define REALmax DBL_MAX
80 #define REALmin DBL_MIN
81 #define REALepsilon DBL_EPSILON
82 #define qh_REALdigits 16    /* maximum number of significant digits */
83 #define qh_REAL_1 "%6.16g "
84 #define qh_REAL_2n "%6.16g %6.16g\n"
85 #define qh_REAL_3n "%6.16g %6.16g %6.16g\n"
86 
87 #else
88 #error unknown float option
89 #endif
90 
91 /*-<a                             href="qh-user.htm#TOC"
92   >--------------------------------</a><a name="CPUclock">-</a>
93 
94   qh_CPUclock
95     define the clock() function for reporting the total time spent by Qhull
96     returns CPU ticks as a 'long int'
97     qh_CPUclock is only used for reporting the total time spent by Qhull
98 
99   qh_SECticks
100     the number of clock ticks per second
101 
102   notes:
103     looks for CLOCKS_PER_SEC, CLOCKS_PER_SECOND, or assumes microseconds
104     to define a custom clock, set qh_CLOCKtype to 0
105 
106     if your system does not use clock() to return CPU ticks, replace
107     qh_CPUclock with the corresponding function.  It is converted
108     to unsigned long to prevent wrap-around during long runs.
109 
110 
111    Set qh_CLOCKtype to
112 
113      1	   	for CLOCKS_PER_SEC, CLOCKS_PER_SECOND, or microsecond
114                 Note:  may fail if more than 1 hour elapsed time
115 
116      2	   	use qh_clock() with POSIX times() (see global.c)
117 */
118 #define qh_CLOCKtype 1  /* change to the desired number */
119 
120 #if (qh_CLOCKtype == 1)
121 
122 #if defined (CLOCKS_PER_SECOND)
123 #define qh_CPUclock    ((unsigned long)clock())  /* return CPU clock */
124 #define qh_SECticks CLOCKS_PER_SECOND
125 
126 #elif defined (CLOCKS_PER_SEC)
127 #define qh_CPUclock    ((unsigned long)clock())  /* return CPU clock */
128 #define qh_SECticks CLOCKS_PER_SEC
129 
130 #elif defined (CLK_TCK)
131 #define qh_CPUclock    ((unsigned long)clock())  /* return CPU clock */
132 #define qh_SECticks CLK_TCK
133 
134 #else
135 #define qh_CPUclock    ((unsigned long)clock())  /* return CPU clock */
136 #define qh_SECticks 1E6
137 #endif
138 
139 #elif (qh_CLOCKtype == 2)
140 #define qh_CPUclock    qh_clock()  /* return CPU clock */
141 #define qh_SECticks 100
142 
143 #else /* qh_CLOCKtype == ? */
144 #error unknown clock option
145 #endif
146 
147 /*-<a                             href="qh-user.htm#TOC"
148   >--------------------------------</a><a name="RANDOM">-</a>
149 
150   qh_RANDOMtype, qh_RANDOMmax, qh_RANDOMseed
151     define random number generator
152 
153     qh_RANDOMint generates a random integer between 0 and qh_RANDOMmax.
154     qh_RANDOMseed sets the random number seed for qh_RANDOMint
155 
156   Set qh_RANDOMtype (default 5) to:
157     1       for random() with 31 bits (UCB)
158     2       for rand() with RAND_MAX or 15 bits (system 5)
159     3       for rand() with 31 bits (Sun)
160     4       for lrand48() with 31 bits (Solaris)
161     5       for qh_rand() with 31 bits (included with Qhull)
162 
163   notes:
164     Random numbers are used by rbox to generate point sets.  Random
165     numbers are used by Qhull to rotate the input ('QRn' option),
166     simulate a randomized algorithm ('Qr' option), and to simulate
167     roundoff errors ('Rn' option).
168 
169     Random number generators differ between systems.  Most systems provide
170     rand() but the period varies.  The period of rand() is not critical
171     since qhull does not normally use random numbers.
172 
173     The default generator is Park & Miller's minimal standard random
174     number generator [CACM 31:1195 '88].  It is included with Qhull.
175 
176     If qh_RANDOMmax is wrong, qhull will report a warning and Geomview
177     output will likely be invisible.
178 */
179 #define qh_RANDOMtype 5   /* *** change to the desired number *** */
180 
181 #if (qh_RANDOMtype == 1)
182 #define qh_RANDOMmax ((realT)0x7fffffffUL)  /* 31 bits, random()/MAX */
183 #define qh_RANDOMint random()
184 #define qh_RANDOMseed_(seed) srandom(seed);
185 
186 #elif (qh_RANDOMtype == 2)
187 #ifdef RAND_MAX
188 #define qh_RANDOMmax ((realT)RAND_MAX)
189 #else
190 #define qh_RANDOMmax ((realT)32767)   /* 15 bits (System 5) */
191 #endif
192 #define qh_RANDOMint  rand()
193 #define qh_RANDOMseed_(seed) srand((unsigned)seed);
194 
195 #elif (qh_RANDOMtype == 3)
196 #define qh_RANDOMmax ((realT)0x7fffffffUL)  /* 31 bits, Sun */
197 #define qh_RANDOMint  rand()
198 #define qh_RANDOMseed_(seed) srand((unsigned)seed);
199 
200 #elif (qh_RANDOMtype == 4)
201 #define qh_RANDOMmax ((realT)0x7fffffffUL)  /* 31 bits, lrand38()/MAX */
202 #define qh_RANDOMint lrand48()
203 #define qh_RANDOMseed_(seed) srand48(seed);
204 
205 #elif (qh_RANDOMtype == 5)
206 #define qh_RANDOMmax ((realT)2147483646UL)  /* 31 bits, qh_rand/MAX */
207 #define qh_RANDOMint qh_rand()
208 #define qh_RANDOMseed_(seed) qh_srand(seed);
209 /* unlike rand(), never returns 0 */
210 
211 #else
212 #error: unknown random option
213 #endif
214 
215 /*-<a                             href="qh-user.htm#TOC"
216   >--------------------------------</a><a name="ORIENTclock">-</a>
217 
218   qh_ORIENTclock
219     0 for inward pointing normals by Geomview convention
220 */
221 #define qh_ORIENTclock 0
222 
223 
224 /*========= performance related constants =========*/
225 
226 /*-<a                             href="qh-user.htm#TOC"
227   >--------------------------------</a><a name="HASHfactor">-</a>
228 
229   qh_HASHfactor
230     total hash slots / used hash slots.  Must be at least 1.1.
231 
232   notes:
233     =2 for at worst 50% occupancy for qh hash_table and normally 25% occupancy
234 */
235 #define qh_HASHfactor 2
236 
237 /*-<a                             href="qh-user.htm#TOC"
238   >--------------------------------</a><a name="VERIFYdirect">-</a>
239 
240   qh_VERIFYdirect
241     with 'Tv' verify all points against all facets if op count is smaller
242 
243   notes:
244     if greater, calls qh_check_bestdist() instead
245 */
246 #define qh_VERIFYdirect 1000000
247 
248 /*-<a                             href="qh-user.htm#TOC"
249   >--------------------------------</a><a name="INITIALsearch">-</a>
250 
251   qh_INITIALsearch
252      if qh_INITIALmax, search points up to this dimension
253 */
254 #define qh_INITIALsearch 6
255 
256 /*-<a                             href="qh-user.htm#TOC"
257   >--------------------------------</a><a name="INITIALmax">-</a>
258 
259   qh_INITIALmax
260     if dim >= qh_INITIALmax, use min/max coordinate points for initial simplex
261 
262   notes:
263     from points with non-zero determinants
264     use option 'Qs' to override (much slower)
265 */
266 #define qh_INITIALmax 8
267 
268 /*-<a                             href="qh-user.htm#TOC"
269   >--------------------------------</a><a name="JOGGLEdefault">-</a>
270 
271   qh_JOGGLEdefault
272     default qh.JOGGLEmax is qh.DISTround * qh_JOGGLEdefault
273 
274   notes:
275     rbox s r 100 | qhull QJ1e-15 QR0 generates 90% faults at distround 7e-16
276     rbox s r 100 | qhull QJ1e-14 QR0 generates 70% faults
277     rbox s r 100 | qhull QJ1e-13 QR0 generates 35% faults
278     rbox s r 100 | qhull QJ1e-12 QR0 generates 8% faults
279     rbox s r 100 | qhull QJ1e-11 QR0 generates 1% faults
280     rbox s r 100 | qhull QJ1e-10 QR0 generates 0% faults
281     rbox 1000 W0 | qhull QJ1e-12 QR0 generates 86% faults
282     rbox 1000 W0 | qhull QJ1e-11 QR0 generates 20% faults
283     rbox 1000 W0 | qhull QJ1e-10 QR0 generates 2% faults
284     the later have about 20 points per facet, each of which may interfere
285 
286     pick a value large enough to avoid retries on most inputs
287 */
288 #define qh_JOGGLEdefault 30000.0
289 
290 /*-<a                             href="qh-user.htm#TOC"
291   >--------------------------------</a><a name="JOGGLEincrease">-</a>
292 
293   qh_JOGGLEincrease
294     factor to increase qh.JOGGLEmax on qh_JOGGLEretry or qh_JOGGLEagain
295 */
296 #define qh_JOGGLEincrease 10.0
297 
298 /*-<a                             href="qh-user.htm#TOC"
299   >--------------------------------</a><a name="JOGGLEretry">-</a>
300 
301   qh_JOGGLEretry
302     if ZZretry = qh_JOGGLEretry, increase qh.JOGGLEmax
303 
304   notes:
305     try twice at the original value in case of bad luck the first time
306 */
307 #define qh_JOGGLEretry 2
308 
309 /*-<a                             href="qh-user.htm#TOC"
310   >--------------------------------</a><a name="JOGGLEagain">-</a>
311 
312   qh_JOGGLEagain
313     every following qh_JOGGLEagain, increase qh.JOGGLEmax
314 
315   notes:
316     1 is OK since it's already failed qh_JOGGLEretry times
317 */
318 #define qh_JOGGLEagain 1
319 
320 /*-<a                             href="qh-user.htm#TOC"
321   >--------------------------------</a><a name="JOGGLEmaxincrease">-</a>
322 
323   qh_JOGGLEmaxincrease
324     maximum qh.JOGGLEmax due to qh_JOGGLEincrease
325     relative to qh.MAXwidth
326 
327   notes:
328     qh.joggleinput will retry at this value until qh_JOGGLEmaxretry
329 */
330 #define qh_JOGGLEmaxincrease 1e-2
331 
332 /*-<a                             href="qh-user.htm#TOC"
333   >--------------------------------</a><a name="JOGGLEmaxretry">-</a>
334 
335   qh_JOGGLEmaxretry
336     stop after qh_JOGGLEmaxretry attempts
337 */
338 #define qh_JOGGLEmaxretry 100
339 
340 /*========= memory constants =========*/
341 
342 /*-<a                             href="qh-user.htm#TOC"
343   >--------------------------------</a><a name="MEMalign">-</a>
344 
345   qh_MEMalign
346     memory alignment for qh_meminitbuffers() in global.c
347 
348   notes:
349     to avoid bus errors, memory allocation must consider alignment requirements.
350     malloc() automatically takes care of alignment.   Since mem.c manages
351     its own memory, we need to explicitly specify alignment in
352     qh_meminitbuffers().
353 
354     A safe choice is sizeof(double).  sizeof(float) may be used if doubles
355     do not occur in data structures and pointers are the same size.  Be careful
356     of machines (e.g., DEC Alpha) with large pointers.
357 
358     If using gcc, best alignment is
359               #define qh_MEMalign fmax_(__alignof__(realT),__alignof__(void *))
360 */
361 #define qh_MEMalign fmax_(sizeof(realT), sizeof(void *))
362 
363 /*-<a                             href="qh-user.htm#TOC"
364   >--------------------------------</a><a name="MEMbufsize">-</a>
365 
366   qh_MEMbufsize
367     size of additional memory buffers
368 
369   notes:
370     used for qh_meminitbuffers() in global.c
371 */
372 #define qh_MEMbufsize 0x10000       /* allocate 64K memory buffers */
373 
374 /*-<a                             href="qh-user.htm#TOC"
375   >--------------------------------</a><a name="MEMinitbuf">-</a>
376 
377   qh_MEMinitbuf
378     size of initial memory buffer
379 
380   notes:
381     use for qh_meminitbuffers() in global.c
382 */
383 #define qh_MEMinitbuf 0x20000      /* initially allocate 128K buffer */
384 
385 /*-<a                             href="qh-user.htm#TOC"
386   >--------------------------------</a><a name="INFINITE">-</a>
387 
388   qh_INFINITE
389     on output, indicates Voronoi center at infinity
390 */
391 #define qh_INFINITE  -10.101
392 
393 /*-<a                             href="qh-user.htm#TOC"
394   >--------------------------------</a><a name="DEFAULTbox">-</a>
395 
396   qh_DEFAULTbox
397     default box size (Geomview expects 0.5)
398 */
399 #define qh_DEFAULTbox 0.5
400 
401 /*======= conditional compilation ============================*/
402 
403 /*-<a                             href="qh-user.htm#TOC"
404   >--------------------------------</a><a name="compiler">-</a>
405 
406   __cplusplus
407     defined by C++ compilers
408 
409   __MSC_VER
410     defined by Microsoft Visual C++
411 
412   __MWERKS__ && __POWERPC__
413     defined by Metrowerks when compiling for the Power Macintosh
414 
415   __STDC__
416     defined for strict ANSI C
417 */
418 
419 /*-<a                             href="qh-user.htm#TOC"
420   >--------------------------------</a><a name="COMPUTEfurthest">-</a>
421 
422   qh_COMPUTEfurthest
423     compute furthest distance to an outside point instead of storing it with the facet
424     =1 to compute furthest
425 
426   notes:
427     computing furthest saves memory but costs time
428       about 40% more distance tests for partitioning
429       removes facet->furthestdist
430 */
431 #define qh_COMPUTEfurthest 0
432 
433 /*-<a                             href="qh-user.htm#TOC"
434   >--------------------------------</a><a name="KEEPstatistics">-</a>
435 
436   qh_KEEPstatistics
437     =0 removes most of statistic gathering and reporting
438 
439   notes:
440     if 0, code size is reduced by about 4%.
441 */
442 #define qh_KEEPstatistics 1
443 
444 /*-<a                             href="qh-user.htm#TOC"
445   >--------------------------------</a><a name="MAXoutside">-</a>
446 
447   qh_MAXoutside
448     record outer plane for each facet
449     =1 to record facet->maxoutside
450 
451   notes:
452     this takes a realT per facet and slightly slows down qhull
453     it produces better outer planes for geomview output
454 */
455 #define qh_MAXoutside 1
456 
457 /*-<a                             href="qh-user.htm#TOC"
458   >--------------------------------</a><a name="NOmerge">-</a>
459 
460   qh_NOmerge
461     disables facet merging if defined
462 
463   notes:
464     This saves about 10% space.
465 
466     Unless 'Q0'
467       qh_NOmerge sets 'QJ' to avoid precision errors
468 
469     #define qh_NOmerge
470 
471   see:
472     <a href="mem.h#NOmem">qh_NOmem</a> in mem.c
473 
474     see user.c/user_eg.c for removing io.o
475 */
476 
477 /*-<a                             href="qh-user.htm#TOC"
478   >--------------------------------</a><a name="NOtrace">-</a>
479 
480   qh_NOtrace
481     no tracing if defined
482 
483   notes:
484     This saves about 5% space.
485 
486     #define qh_NOtrace
487 */
488 
489 /*-<a                             href="qh-user.htm#TOC"
490   >--------------------------------</a><a name="QHpointer">-</a>
491 
492   qh_QHpointer
493     access global data with pointer or static structure
494 
495   qh_QHpointer  = 1     access globals via a pointer to allocated memory
496                         enables qh_saveqhull() and qh_restoreqhull()
497 			costs about 8% in time and 2% in space
498 
499 		= 0     qh_qh and qh_qhstat are static data structures
500 		        only one instance of qhull() can be active at a time
501 			default value
502 
503   notes:
504     all global variables for qhull are in qh, qhmem, and qhstat
505     qh is defined in qhull.h
506     qhmem is defined in mem.h
507     qhstat is defined in stat.h
508 
509   see:
510     user_eg.c for an example
511 */
512 #define qh_QHpointer 0
513 #if 0  /* sample code */
514     qhT *oldqhA, *oldqhB;
515 
516     exitcode= qh_new_qhull (dim, numpoints, points, ismalloc,
517                       flags, outfile, errfile);
518     /* use results from first call to qh_new_qhull */
519     oldqhA= qh_save_qhull();
520     exitcode= qh_new_qhull (dimB, numpointsB, pointsB, ismalloc,
521                       flags, outfile, errfile);
522     /* use results from second call to qh_new_qhull */
523     oldqhB= qh_save_qhull();
524     qh_restore_qhull (&oldqhA);
525     /* use results from first call to qh_new_qhull */
526     qh_freeqhull (qh_ALL);  /* frees all memory used by first call */
527     qh_restore_qhull (&oldqhB);
528     /* use results from second call to qh_new_qhull */
529     qh_freeqhull (!qh_ALL); /* frees long memory used by second call */
530     qh_memfreeshort (&curlong, &totlong);  /* frees short memory and memory allocator */
531 #endif
532 
533 /*-<a                             href="qh-user.htm#TOC"
534   >--------------------------------</a><a name="QUICKhelp">-</a>
535 
536   qh_QUICKhelp
537     =1 to use abbreviated help messages, e.g., for degenerate inputs
538 */
539 #define qh_QUICKhelp    0
540 
541 /* ============ -merge constants- ====================
542 
543    These constants effect facet merging.  You probably will not need
544    to modify these.  They effect the performance of facet merging.
545 */
546 
547 /*-<a                             href="qh-user.htm#TOC"
548   >--------------------------------</a><a name="DIMmergeVertex">-</a>
549 
550   qh_DIMmergeVertex
551     max dimension for vertex merging (it is not effective in high-d)
552 */
553 #define qh_DIMmergeVertex 6
554 
555 /*-<a                             href="qh-user.htm#TOC"
556   >--------------------------------</a><a name="DIMreduceBuild">-</a>
557 
558   qh_DIMreduceBuild
559      max dimension for vertex reduction during build (slow in high-d)
560 */
561 #define qh_DIMreduceBuild 5
562 
563 /*-<a                             href="qh-user.htm#TOC"
564   >--------------------------------</a><a name="BESTcentrum">-</a>
565 
566   qh_BESTcentrum
567      if > 2*dim+n vertices, qh_findbestneighbor() tests centrums (faster)
568      else, qh_findbestneighbor() tests all vertices (much better merges)
569 
570   qh_BESTcentrum2
571      if qh_BESTcentrum2 * DIM3 + BESTcentrum < #vertices tests centrums
572 */
573 #define qh_BESTcentrum 20
574 #define qh_BESTcentrum2 2
575 
576 /*-<a                             href="qh-user.htm#TOC"
577   >--------------------------------</a><a name="BESTnonconvex">-</a>
578 
579   qh_BESTnonconvex
580     if > dim+n neighbors, qh_findbestneighbor() tests nonconvex ridges.
581 
582   notes:
583     It is needed because qh_findbestneighbor is slow for large facets
584 */
585 #define qh_BESTnonconvex 15
586 
587 /*-<a                             href="qh-user.htm#TOC"
588   >--------------------------------</a><a name="MAXnewmerges">-</a>
589 
590   qh_MAXnewmerges
591     if >n newmerges, qh_merge_nonconvex() calls qh_reducevertices_centrums.
592 
593   notes:
594     It is needed because postmerge can merge many facets at once
595 */
596 #define qh_MAXnewmerges 2
597 
598 /*-<a                             href="qh-user.htm#TOC"
599   >--------------------------------</a><a name="MAXnewcentrum">-</a>
600 
601   qh_MAXnewcentrum
602     if <= dim+n vertices (n approximates the number of merges),
603       reset the centrum in qh_updatetested() and qh_mergecycle_facets()
604 
605   notes:
606     needed to reduce cost and because centrums may move too much if
607     many vertices in high-d
608 */
609 #define qh_MAXnewcentrum 5
610 
611 /*-<a                             href="qh-user.htm#TOC"
612   >--------------------------------</a><a name="COPLANARratio">-</a>
613 
614   qh_COPLANARratio
615     for 3-d+ merging, qh.MINvisible is n*premerge_centrum
616 
617   notes:
618     for non-merging, it's DISTround
619 */
620 #define qh_COPLANARratio 3
621 
622 /*-<a                             href="qh-user.htm#TOC"
623   >--------------------------------</a><a name="DISToutside">-</a>
624 
625   qh_DISToutside
626     When is a point clearly outside of a facet?
627     Stops search in qh_findbestnew or qh_partitionall
628     qh_findbest uses qh.MINoutside since since it is only called if no merges.
629 
630   notes:
631     'Qf' always searches for best facet
632     if !qh.MERGING, same as qh.MINoutside.
633     if qh_USEfindbestnew, increase value since neighboring facets may be ill-behaved
634       [Note: Zdelvertextot occurs normally with interior points]
635             RBOX 1000 s Z1 G1e-13 t1001188774 | QHULL Tv
636     When there is a sharp edge, need to move points to a
637     clearly good facet; otherwise may be lost in another partitioning.
638     if too big then O(n^2) behavior for partitioning in cone
639     if very small then important points not processed
640     Needed in qh_partitionall for
641       RBOX 1000 s Z1 G1e-13 t1001032651 | QHULL Tv
642     Needed in qh_findbestnew for many instances of
643       RBOX 1000 s Z1 G1e-13 t | QHULL Tv
644 
645   See:
646     qh_DISToutside -- when is a point clearly outside of a facet
647     qh_SEARCHdist -- when is facet coplanar with the best facet?
648     qh_USEfindbestnew -- when to use qh_findbestnew for qh_partitionpoint()
649 */
650 #define qh_DISToutside ((qh_USEfindbestnew ? 2 : 1) * \
651      fmax_((qh MERGING ? 2 : 1)*qh MINoutside, qh max_outside))
652 
653 /*-<a                             href="qh-user.htm#TOC"
654   >--------------------------------</a><a name="RATIOnearinside">-</a>
655 
656   qh_RATIOnearinside
657     ratio of qh.NEARinside to qh.ONEmerge for retaining inside points for
658     qh_check_maxout().
659 
660   notes:
661     This is overkill since do not know the correct value.
662     It effects whether 'Qc' reports all coplanar points
663     Not used for 'd' since non-extreme points are coplanar
664 */
665 #define qh_RATIOnearinside 5
666 
667 /*-<a                             href="qh-user.htm#TOC"
668   >--------------------------------</a><a name="SEARCHdist">-</a>
669 
670   qh_SEARCHdist
671     When is a facet coplanar with the best facet?
672     qh_findbesthorizon: all coplanar facets of the best facet need to be searched.
673 
674   See:
675     qh_DISToutside -- when is a point clearly outside of a facet
676     qh_SEARCHdist -- when is facet coplanar with the best facet?
677     qh_USEfindbestnew -- when to use qh_findbestnew for qh_partitionpoint()
678 */
679 #define qh_SEARCHdist ((qh_USEfindbestnew ? 2 : 1) * \
680       (qh max_outside + 2 * qh DISTround + fmax_( qh MINvisible, qh MAXcoplanar)));
681 
682 /*-<a                             href="qh-user.htm#TOC"
683   >--------------------------------</a><a name="USEfindbestnew">-</a>
684 
685   qh_USEfindbestnew
686      Always use qh_findbestnew for qh_partitionpoint, otherwise use
687      qh_findbestnew if merged new facet or sharpnewfacets.
688 
689   See:
690     qh_DISToutside -- when is a point clearly outside of a facet
691     qh_SEARCHdist -- when is facet coplanar with the best facet?
692     qh_USEfindbestnew -- when to use qh_findbestnew for qh_partitionpoint()
693 */
694 #define qh_USEfindbestnew (zzval_(Ztotmerge) > 50)
695 
696 /*-<a                             href="qh-user.htm#TOC"
697   >--------------------------------</a><a name="WIDEcoplanar">-</a>
698 
699   qh_WIDEcoplanar
700     n*MAXcoplanar or n*MINvisible for a WIDEfacet
701 
702     if vertex is further than qh.WIDEfacet from the hyperplane
703     then its ridges are not counted in computing the area, and
704     the facet's centrum is frozen.
705 
706   notes:
707    qh.WIDEfacet= max(qh.MAXoutside,qh_WIDEcoplanar*qh.MAXcoplanar,
708       qh_WIDEcoplanar * qh.MINvisible);
709 */
710 #define qh_WIDEcoplanar 6
711 
712 /*-<a                             href="qh-user.htm#TOC"
713   >--------------------------------</a><a name="MAXnarrow">-</a>
714 
715   qh_MAXnarrow
716     max. cosine in initial hull that sets qh.NARROWhull
717 
718   notes:
719     If qh.NARROWhull, the initial partition does not make
720     coplanar points.  If narrow, a coplanar point can be
721     coplanar to two facets of opposite orientations and
722     distant from the exact convex hull.
723 
724     Conservative estimate.  Don't actually see problems until it is -1.0
725 */
726 #define qh_MAXnarrow -0.99999999
727 
728 /*-<a                             href="qh-user.htm#TOC"
729   >--------------------------------</a><a name="WARNnarrow">-</a>
730 
731   qh_WARNnarrow
732     max. cosine in initial hull to warn about qh.NARROWhull
733 
734   notes:
735     this is a conservative estimate.
736     Don't actually see problems until it is -1.0.  See qh-impre.htm
737 */
738 #define qh_WARNnarrow -0.999999999999999
739 
740 /*-<a                             href="qh-user.htm#TOC"
741   >--------------------------------</a><a name="ZEROdelaunay">-</a>
742 
743   qh_ZEROdelaunay
744     a zero Delaunay facet occurs for input sites coplanar with their convex hull
745     the last normal coefficient of a zero Delaunay facet is within
746         qh_ZEROdelaunay * qh.ANGLEround of 0
747 
748   notes:
749     qh_ZEROdelaunay does not allow for joggled input ('QJ').
750 
751     You can avoid zero Delaunay facets by surrounding the input with a box.
752 
753     Use option 'PDk:-n' to explicitly define zero Delaunay facets
754       k= dimension of input sites (e.g., 3 for 3-d Delaunay triangulation)
755       n= the cutoff for zero Delaunay facets (e.g., 'PD3:-1e-12')
756 */
757 #define qh_ZEROdelaunay 2
758 
759 #endif /* qh_DEFuser */
760 
761 
762 
763