1 /*<html><pre>  -<a                             href="qh-geom_r.htm"
2   >-------------------------------</a><a name="TOP">-</a>
3 
4   geom_r.h
5     header file for geometric routines
6 
7    see qh-geom_r.htm and geom_r.c
8 
9    Copyright (c) 1993-2019 The Geometry Center.
10    $Id: //main/2019/qhull/src/libqhull_r/geom_r.h#1 $$Change: 2661 $
11    $DateTime: 2019/05/24 20:09:58 $$Author: bbarber $
12 */
13 
14 #ifndef qhDEFgeom
15 #define qhDEFgeom 1
16 
17 #include "libqhull_r.h"
18 
19 /* ============ -macros- ======================== */
20 
21 /*-<a                             href="qh-geom_r.htm#TOC"
22   >--------------------------------</a><a name="fabs_">-</a>
23 
24   fabs_(a)
25     returns the absolute value of a
26 */
27 #define fabs_( a ) ((( a ) < 0 ) ? -( a ):( a ))
28 
29 /*-<a                             href="qh-geom_r.htm#TOC"
30   >--------------------------------</a><a name="fmax_">-</a>
31 
32   fmax_(a,b)
33     returns the maximum value of a and b
34 */
35 #define fmax_( a,b )  ( ( a ) < ( b ) ? ( b ) : ( a ) )
36 
37 /*-<a                             href="qh-geom_r.htm#TOC"
38   >--------------------------------</a><a name="fmin_">-</a>
39 
40   fmin_(a,b)
41     returns the minimum value of a and b
42 */
43 #define fmin_( a,b )  ( ( a ) > ( b ) ? ( b ) : ( a ) )
44 
45 /*-<a                             href="qh-geom_r.htm#TOC"
46   >--------------------------------</a><a name="maximize_">-</a>
47 
48   maximize_(maxval, val)
49     set maxval to val if val is greater than maxval
50 */
51 #define maximize_( maxval, val ) { if (( maxval ) < ( val )) ( maxval )= ( val ); }
52 
53 /*-<a                             href="qh-geom_r.htm#TOC"
54   >--------------------------------</a><a name="minimize_">-</a>
55 
56   minimize_(minval, val)
57     set minval to val if val is less than minval
58 */
59 #define minimize_( minval, val ) { if (( minval ) > ( val )) ( minval )= ( val ); }
60 
61 /*-<a                             href="qh-geom_r.htm#TOC"
62   >--------------------------------</a><a name="det2_">-</a>
63 
64   det2_(a1, a2,
65         b1, b2)
66 
67     compute a 2-d determinate
68 */
69 #define det2_( a1,a2,b1,b2 ) (( a1 )*( b2 ) - ( a2 )*( b1 ))
70 
71 /*-<a                             href="qh-geom_r.htm#TOC"
72   >--------------------------------</a><a name="det3_">-</a>
73 
74   det3_(a1, a2, a3,
75        b1, b2, b3,
76        c1, c2, c3)
77 
78     compute a 3-d determinate
79 */
80 #define det3_( a1,a2,a3,b1,b2,b3,c1,c2,c3 ) ( ( a1 )*det2_( b2,b3,c2,c3 ) \
81                 - ( b1 )*det2_( a2,a3,c2,c3 ) + ( c1 )*det2_( a2,a3,b2,b3 ) )
82 
83 /*-<a                             href="qh-geom_r.htm#TOC"
84   >--------------------------------</a><a name="dX">-</a>
85 
86   dX( p1, p2 )
87   dY( p1, p2 )
88   dZ( p1, p2 )
89 
90     given two indices into rows[],
91 
92     compute the difference between X, Y, or Z coordinates
93 */
94 #define dX( p1,p2 )  ( *( rows[p1] ) - *( rows[p2] ))
95 #define dY( p1,p2 )  ( *( rows[p1]+1 ) - *( rows[p2]+1 ))
96 #define dZ( p1,p2 )  ( *( rows[p1]+2 ) - *( rows[p2]+2 ))
97 #define dW( p1,p2 )  ( *( rows[p1]+3 ) - *( rows[p2]+3 ))
98 
99 /*============= prototypes in alphabetical order, infrequent at end ======= */
100 
101 #ifdef __cplusplus
102 extern "C" {
103 #endif
104 
105 void    qh_backnormal(qhT *qh, realT **rows, int numrow, int numcol, boolT sign, coordT *normal, boolT *nearzero);
106 void    qh_distplane(qhT *qh, pointT *point, facetT *facet, realT *dist);
107 facetT *qh_findbest(qhT *qh, pointT *point, facetT *startfacet,
108                      boolT bestoutside, boolT isnewfacets, boolT noupper,
109                      realT *dist, boolT *isoutside, int *numpart);
110 facetT *qh_findbesthorizon(qhT *qh, boolT ischeckmax, pointT *point,
111                      facetT *startfacet, boolT noupper, realT *bestdist, int *numpart);
112 facetT *qh_findbestnew(qhT *qh, pointT *point, facetT *startfacet, realT *dist,
113                      boolT bestoutside, boolT *isoutside, int *numpart);
114 void    qh_gausselim(qhT *qh, realT **rows, int numrow, int numcol, boolT *sign, boolT *nearzero);
115 realT   qh_getangle(qhT *qh, pointT *vect1, pointT *vect2);
116 pointT *qh_getcenter(qhT *qh, setT *vertices);
117 pointT *qh_getcentrum(qhT *qh, facetT *facet);
118 coordT  qh_getdistance(qhT *qh, facetT *facet, facetT *neighbor, coordT *mindist, coordT *maxdist);
119 void    qh_normalize(qhT *qh, coordT *normal, int dim, boolT toporient);
120 void    qh_normalize2(qhT *qh, coordT *normal, int dim, boolT toporient,
121             realT *minnorm, boolT *ismin);
122 pointT *qh_projectpoint(qhT *qh, pointT *point, facetT *facet, realT dist);
123 
124 void    qh_setfacetplane(qhT *qh, facetT *newfacets);
125 void    qh_sethyperplane_det(qhT *qh, int dim, coordT **rows, coordT *point0,
126               boolT toporient, coordT *normal, realT *offset, boolT *nearzero);
127 void    qh_sethyperplane_gauss(qhT *qh, int dim, coordT **rows, pointT *point0,
128              boolT toporient, coordT *normal, coordT *offset, boolT *nearzero);
129 boolT   qh_sharpnewfacets(qhT *qh);
130 
131 /*========= infrequently used code in geom2_r.c =============*/
132 
133 coordT *qh_copypoints(qhT *qh, coordT *points, int numpoints, int dimension);
134 void    qh_crossproduct(int dim, realT vecA[3], realT vecB[3], realT vecC[3]);
135 realT   qh_determinant(qhT *qh, realT **rows, int dim, boolT *nearzero);
136 realT   qh_detjoggle(qhT *qh, pointT *points, int numpoints, int dimension);
137 void    qh_detmaxoutside(qhT *qh);
138 void    qh_detroundoff(qhT *qh);
139 realT   qh_detsimplex(qhT *qh, pointT *apex, setT *points, int dim, boolT *nearzero);
140 realT   qh_distnorm(int dim, pointT *point, pointT *normal, realT *offsetp);
141 realT   qh_distround(qhT *qh, int dimension, realT maxabs, realT maxsumabs);
142 realT   qh_divzero(realT numer, realT denom, realT mindenom1, boolT *zerodiv);
143 realT   qh_facetarea(qhT *qh, facetT *facet);
144 realT   qh_facetarea_simplex(qhT *qh, int dim, coordT *apex, setT *vertices,
145           vertexT *notvertex,  boolT toporient, coordT *normal, realT *offset);
146 pointT *qh_facetcenter(qhT *qh, setT *vertices);
147 facetT *qh_findgooddist(qhT *qh, pointT *point, facetT *facetA, realT *distp, facetT **facetlist);
148 vertexT *qh_furthestnewvertex(qhT *qh, unsigned int unvisited, facetT *facet, realT *maxdistp /* qh.newvertex_list */);
149 vertexT *qh_furthestvertex(qhT *qh, facetT *facetA, facetT *facetB, realT *maxdistp, realT *mindistp);
150 void    qh_getarea(qhT *qh, facetT *facetlist);
151 boolT   qh_gram_schmidt(qhT *qh, int dim, realT **rows);
152 boolT   qh_inthresholds(qhT *qh, coordT *normal, realT *angle);
153 void    qh_joggleinput(qhT *qh);
154 realT  *qh_maxabsval(realT *normal, int dim);
155 setT   *qh_maxmin(qhT *qh, pointT *points, int numpoints, int dimension);
156 realT   qh_maxouter(qhT *qh);
157 void    qh_maxsimplex(qhT *qh, int dim, setT *maxpoints, pointT *points, int numpoints, setT **simplex);
158 realT   qh_minabsval(realT *normal, int dim);
159 int     qh_mindiff(realT *vecA, realT *vecB, int dim);
160 boolT   qh_orientoutside(qhT *qh, facetT *facet);
161 void    qh_outerinner(qhT *qh, facetT *facet, realT *outerplane, realT *innerplane);
162 coordT  qh_pointdist(pointT *point1, pointT *point2, int dim);
163 void    qh_printmatrix(qhT *qh, FILE *fp, const char *string, realT **rows, int numrow, int numcol);
164 void    qh_printpoints(qhT *qh, FILE *fp, const char *string, setT *points);
165 void    qh_projectinput(qhT *qh);
166 void    qh_projectpoints(qhT *qh, signed char *project, int n, realT *points,
167              int numpoints, int dim, realT *newpoints, int newdim);
168 void    qh_rotateinput(qhT *qh, realT **rows);
169 void    qh_rotatepoints(qhT *qh, realT *points, int numpoints, int dim, realT **rows);
170 void    qh_scaleinput(qhT *qh);
171 void    qh_scalelast(qhT *qh, coordT *points, int numpoints, int dim, coordT low,
172                    coordT high, coordT newhigh);
173 void    qh_scalepoints(qhT *qh, pointT *points, int numpoints, int dim,
174                 realT *newlows, realT *newhighs);
175 boolT   qh_sethalfspace(qhT *qh, int dim, coordT *coords, coordT **nextp,
176               coordT *normal, coordT *offset, coordT *feasible);
177 coordT *qh_sethalfspace_all(qhT *qh, int dim, int count, coordT *halfspaces, pointT *feasible);
178 coordT  qh_vertex_bestdist(qhT *qh, setT *vertices);
179 coordT  qh_vertex_bestdist2(qhT *qh, setT *vertices, vertexT **vertexp, vertexT **vertexp2);
180 pointT *qh_voronoi_center(qhT *qh, int dim, setT *points);
181 
182 #ifdef __cplusplus
183 } /* extern "C"*/
184 #endif
185 
186 #endif /* qhDEFgeom */
187 
188 
189 
190