Reverted incorrect merge (missing files)
[blender.git] / extern / qhull / src / qdelaun.c
1 /*<html><pre>  -<a                             href="qh-qhull.htm"
2   >-------------------------------</a><a name="TOP">-</a>
3
4    qdelaun.c
5      compute Delaunay triangulations and furthest-point Delaunay
6      triangulations using qhull
7
8    see unix.c for full interface
9
10    copyright (c) 1993-2002, The Geometry Center
11 */
12
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <string.h>
16 #include <ctype.h>
17 #include <math.h>
18 #include "qhull.h"
19 #include "mem.h"
20 #include "qset.h"
21
22 #if __MWERKS__ && __POWERPC__
23 #include <SIOUX.h>
24 #include <Files.h>
25 #include <console.h>
26 #include <Desk.h>
27
28 #elif __cplusplus
29 extern "C" {
30   int isatty (int);
31 }
32
33 #elif _MSC_VER
34 #include <io.h>
35 #define isatty _isatty
36
37 #else
38 int isatty (int);  /* returns 1 if stdin is a tty
39                    if "Undefined symbol" this can be deleted along with call in main() */
40 #endif
41
42 /*-<a                             href="qh-qhull.htm#TOC"
43   >-------------------------------</a><a name="prompt">-</a>
44
45   qh_prompt 
46     long prompt for qhull
47     
48   notes:
49     restricted version of qhull.c
50  
51   see:
52     concise prompt below
53 */  
54
55 /* duplicated in qdelau_f.htm and qdelaun.htm */
56 char hidden_options[]=" d n v H U Qb QB Qc Qf Qg Qi Qm Qr QR Qv Qx TR E V FC Fi Fo Ft Fp FV Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 ";
57
58 char qh_prompta[]= "\n\
59 qdelaunay- compute the Delaunay triangulation\n\
60     http://www.geom.umn.edu/software/qhull  %s\n\
61 \n\
62 input (stdin):\n\
63     first lines: dimension and number of points (or vice-versa).\n\
64     other lines: point coordinates, best if one point per line\n\
65     comments:    start with a non-numeric character\n\
66 \n\
67 options:\n\
68     Qu   - compute furthest-site Delaunay triangulation\n\
69     Qt   - triangulated output\n\
70     QJ   - joggled input instead of merged facets\n\
71 \n\
72 Qhull control options:\n\
73     QJn  - randomly joggle input in range [-n,n]\n\
74 %s%s%s%s";  /* split up qh_prompt for Visual C++ */
75 char qh_promptb[]= "\
76     Qs   - search all points for the initial simplex\n\
77     Qz   - add point-at-infinity to Delaunay triangulation\n\
78     QGn  - print Delaunay region if visible from point n, -n if not\n\
79     QVn  - print Delaunay regions that include point n, -n if not\n\
80 \n\
81 ";
82 char qh_promptc[]= "\
83 Trace options:\n\
84     T4   - trace at level n, 4=all, 5=mem/gauss, -1= events\n\
85     Tc   - check frequently during execution\n\
86     Ts   - print statistics\n\
87     Tv   - verify result: structure, convexity, and in-circle test\n\
88     Tz   - send all output to stdout\n\
89     TFn  - report summary when n or more facets created\n\
90     TI file - input data from file, no spaces or single quotes\n\
91     TO file - output results to file, may be enclosed in single quotes\n\
92     TPn  - turn on tracing when point n added to hull\n\
93      TMn - turn on tracing at merge n\n\
94      TWn - trace merge facets when width > n\n\
95     TVn  - stop qhull after adding point n, -n for before (see TCn)\n\
96      TCn - stop qhull after building cone for point n (see TVn)\n\
97 \n\
98 Precision options:\n\
99     Cn   - radius of centrum (roundoff added).  Merge facets if non-convex\n\
100      An  - cosine of maximum angle.  Merge facets if cosine > n or non-convex\n\
101            C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge\n\
102     Rn   - randomly perturb computations by a factor of [1-n,1+n]\n\
103     Wn   - min facet width for outside point (before roundoff)\n\
104 \n\
105 Output formats (may be combined; if none, produces a summary to stdout):\n\
106     f    - facet dump\n\
107     G    - Geomview output (see below)\n\
108     i    - vertices incident to each Delaunay region\n\
109     m    - Mathematica output (2-d only, lifted to a paraboloid)\n\
110     o    - OFF format (dim, points, and facets as a paraboloid)\n\
111     p    - point coordinates (lifted to a paraboloid)\n\
112     s    - summary (stderr)\n\
113 \n\
114 ";
115 char qh_promptd[]= "\
116 More formats:\n\
117     Fa   - area for each Delaunay region\n\
118     FA   - compute total area for option 's'\n\
119     Fc   - count plus coincident points for each Delaunay region\n\
120     Fd   - use cdd format for input (homogeneous with offset first)\n\
121     FD   - use cdd format for numeric output (offset first)\n\
122     FF   - facet dump without ridges\n\
123     FI   - ID of each Delaunay region\n\
124     Fm   - merge count for each Delaunay region (511 max)\n\
125     Fn   - count plus neighboring region for each Delaunay region\n\
126     FN   - count plus neighboring region for each point\n\
127     FO   - options and precision constants\n\
128     FP   - nearest point and distance for each coincident point\n\
129     FQ   - command used for qdelaunay\n\
130     Fs   - summary: #int (8), dimension, #points, tot vertices, tot facets,\n\
131                     for output: #vertices, #Delaunay regions,\n\
132                                 #coincident points, #non-simplicial regions\n\
133                     #real (2), max outer plane, min vertex\n\
134     FS   - sizes:   #int (0)\n\
135                     #real(2) tot area, 0\n\
136     Fv   - count plus vertices for each Delaunay region\n\
137     Fx   - extreme points of Delaunay triangulation (on convex hull)\n\
138 \n\
139 ";
140 char qh_prompte[]= "\
141 Geomview options (2-d and 3-d)\n\
142     Ga   - all points as dots\n\
143      Gp  -  coplanar points and vertices as radii\n\
144      Gv  -  vertices as spheres\n\
145     Gi   - inner planes only\n\
146      Gn  -  no planes\n\
147      Go  -  outer planes only\n\
148     Gc     - centrums\n\
149     Gh   - hyperplane intersections\n\
150     Gr   - ridges\n\
151     GDn  - drop dimension n in 3-d and 4-d output\n\
152     Gt   - transparent outer ridges to view 3-d Delaunay\n\
153 \n\
154 Print options:\n\
155     PAn  - keep n largest Delaunay regions by area\n\
156     Pdk:n - drop facet if normal[k] <= n (default 0.0)\n\
157     PDk:n - drop facet if normal[k] >= n\n\
158     Pg   - print good Delaunay regions (needs 'QGn' or 'QVn')\n\
159     PFn  - keep Delaunay regions whose area is at least n\n\
160     PG   - print neighbors of good regions (needs 'QGn' or 'QVn')\n\
161     PMn  - keep n Delaunay regions with most merges\n\
162     Po   - force output.  If error, output neighborhood of facet\n\
163     Pp   - do not report precision problems\n\
164 \n\
165     .    - list of all options\n\
166     -    - one line descriptions of all options\n\
167 ";
168 /* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
169
170 /*-<a                             href="qh-qhull.htm#TOC"
171   >-------------------------------</a><a name="prompt2">-</a>
172
173   qh_prompt2
174     synopsis for qhull 
175 */  
176 char qh_prompt2[]= "\n\
177 qdelaunay- compute the Delaunay triangulation. Qhull %s\n\
178     input (stdin): dimension, number of points, point coordinates\n\
179     comments start with a non-numeric character\n\
180 \n\
181 options (qdelaun.htm):\n\
182     Qu   - furthest-site Delaunay triangulation\n\
183     Qt   - triangulated output\n\
184     QJ   - joggled input instead of merged facets\n\
185     Tv   - verify result: structure, convexity, and in-circle test\n\
186     .    - concise list of all options\n\
187     -    - one-line description of all options\n\
188 \n\
189 output options (subset):\n\
190     s    - summary of results (default)\n\
191     i    - vertices incident to each Delaunay region\n\
192     Fx   - extreme points (vertices of the convex hull)\n\
193     o    - OFF format (shows the points lifted to a paraboloid)\n\
194     G    - Geomview output (2-d and 3-d points lifted to a paraboloid)\n\
195     m    - Mathematica output (2-d inputs lifted to a paraboloid)\n\
196     QVn  - print Delaunay regions that include point n, -n if not\n\
197     TO file- output results to file, may be enclosed in single quotes\n\
198 \n\
199 examples:\n\
200     rbox c P0 D2 | qdelaunay s o          rbox c P0 D2 | qdelaunay i\n\
201     rbox c P0 D2 | qdelaunay Fv           rbox c P0 D2 | qdelaunay s Qu Fv\n\
202     rbox c G1 d D2 | qdelaunay s i        rbox c G1 d D2 | qdelaunay Qt\n\
203     rbox M3,4 z 100 D2 | qdelaunay s      rbox M3,4 z 100 D2 | qdelaunay s Qt\n\
204 \n\
205 ";
206 /* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */
207
208 /*-<a                             href="qh-qhull.htm#TOC"
209   >-------------------------------</a><a name="prompt3">-</a>
210
211   qh_prompt3
212     concise prompt for qhull 
213 */  
214 char qh_prompt3[]= "\n\
215 Qhull %s.\n\
216 Except for 'F.' and 'PG', upper-case options take an argument.\n\
217 \n\
218  incidences     mathematica    OFF_format     points_lifted  summary\n\
219  facet_dump\n\
220 \n\
221  Farea          FArea_total    Fcoincident    Fd_cdd_in      FD_cdd_out\n\
222  FF_dump_xridge FIDs           Fmerges        Fneighbors     FNeigh_vertex\n\
223  FOptions       FPoint_near    FQdelaun       Fsummary       FSize\n\
224  Fvertices      Fxtremes\n\
225 \n\
226  Gvertices      Gpoints        Gall_points    Gno_planes     Ginner\n\
227  Gcentrums      Ghyperplanes   Gridges        Gouter         GDrop_dim\n\
228  Gtransparent\n\
229 \n\
230  PArea_keep     Pdrop d0:0D0   Pgood          PFacet_area_keep\n\
231  PGood_neighbors PMerge_keep   Poutput_forced Pprecision_not\n\
232 \n\
233  QGood_point    QJoggle        Qsearch_1st    Qtriangulate   QupperDelaunay\n\
234  QVertex_good   Qzinfinite\n\
235 \n\
236  T4_trace       Tcheck_often   Tstatistics    Tverify        Tz_stdout\n\
237  TFacet_log     TInput_file    TPoint_trace   TMerge_trace   TOutput_file\n\
238  TWide_trace    TVertex_stop   TCone_stop\n\
239 \n\
240  Angle_max      Centrum_size   Random_dist    Wide_outside\n\
241 ";
242
243 /*-<a                             href="qh-qhull.htm#TOC"
244   >-------------------------------</a><a name="main">-</a>
245   
246   main( argc, argv )
247     processes the command line, calls qhull() to do the work, and exits
248   
249   design:
250     initializes data structures
251     reads points
252     finishes initialization
253     computes convex hull and other structures
254     checks the result
255     writes the output
256     frees memory
257 */
258 int main(int argc, char *argv[]) {
259   int curlong, totlong; /* used !qh_NOmem */
260   int exitcode, numpoints, dim;
261   coordT *points;
262   boolT ismalloc;
263
264 #if __MWERKS__ && __POWERPC__
265   char inBuf[BUFSIZ], outBuf[BUFSIZ], errBuf[BUFSIZ];
266   SIOUXSettings.showstatusline= false;
267   SIOUXSettings.tabspaces= 1;
268   SIOUXSettings.rows= 40;
269   if (setvbuf (stdin, inBuf, _IOFBF, sizeof(inBuf)) < 0   /* w/o, SIOUX I/O is slow*/
270   || setvbuf (stdout, outBuf, _IOFBF, sizeof(outBuf)) < 0
271   || (stdout != stderr && setvbuf (stderr, errBuf, _IOFBF, sizeof(errBuf)) < 0)) 
272     fprintf (stderr, "qhull internal warning (main): could not change stdio to fully buffered.\n");
273   argc= ccommand(&argv);
274 #endif
275
276   if ((argc == 1) && isatty( 0 /*stdin*/)) {      
277     fprintf(stdout, qh_prompt2, qh_VERSION);
278     exit(qh_ERRnone);
279   }
280   if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) {
281     fprintf(stdout, qh_prompta, qh_VERSION,  
282                 qh_promptb, qh_promptc, qh_promptd, qh_prompte);
283     exit(qh_ERRnone);
284   }
285   if (argc >1 && *argv[1] == '.' && !*(argv[1]+1)) {
286     fprintf(stdout, qh_prompt3, qh_VERSION);
287     exit(qh_ERRnone);
288   }
289   qh_init_A (stdin, stdout, stderr, argc, argv);  /* sets qh qhull_command */
290   exitcode= setjmp (qh errexit); /* simple statement for CRAY J916 */
291   if (!exitcode) {
292     qh_option ("delaunay  Qbbound-last", NULL, NULL);
293     qh DELAUNAY= True;     /* 'd'   */
294     qh SCALElast= True;    /* 'Qbb' */
295     qh KEEPcoplanar= True; /* 'Qc', to keep coplanars in 'p' */
296     qh_checkflags (qh qhull_command, hidden_options);
297     qh_initflags (qh qhull_command);
298     points= qh_readpoints (&numpoints, &dim, &ismalloc);
299     if (dim >= 5) {
300       qh_option ("Qxact_merge", NULL, NULL);
301       qh MERGEexact= True; /* 'Qx' always */
302     }
303     qh_init_B (points, numpoints, dim, ismalloc);
304     qh_qhull();
305     qh_check_output();
306     qh_produce_output();
307     if (qh VERIFYoutput && !qh FORCEoutput && !qh STOPpoint && !qh STOPcone)
308       qh_check_points();
309     exitcode= qh_ERRnone;
310   }
311   qh NOerrexit= True;  /* no more setjmp */
312 #ifdef qh_NOmem
313   qh_freeqhull( True);
314 #else
315   qh_freeqhull( False);
316   qh_memfreeshort (&curlong, &totlong);
317   if (curlong || totlong) 
318     fprintf (stderr, "qhull internal warning (main): did not free %d bytes of long memory (%d pieces)\n",
319        totlong, curlong);
320 #endif
321   return exitcode;
322 } /* main */
323