1 /*<html><pre>  -<a                             href="qh-merge_r.htm"
2   >-------------------------------</a><a name="TOP">-</a>
3 
4    merge_r.h
5    header file for merge_r.c
6 
7    see qh-merge_r.htm and merge_r.c
8 
9    Copyright (c) 1993-2015 C.B. Barber.
10    $Id: //main/2015/qhull/src/libqhull_r/merge_r.h#3 $$Change: 2079 $
11    $DateTime: 2016/02/07 17:43:34 $$Author: bbarber $
12 */
13 
14 #ifndef qhDEFmerge
15 #define qhDEFmerge 1
16 
17 #include "libqhull_r.h"
18 
19 
20 /*============ -constants- ==============*/
21 
22 /*-<a                             href="qh-merge_r.htm#TOC"
23   >--------------------------------</a><a name="qh_ANGLEredundant">-</a>
24 
25   qh_ANGLEredundant
26     indicates redundant merge in mergeT->angle
27 */
28 #define qh_ANGLEredundant 6.0
29 
30 /*-<a                             href="qh-merge_r.htm#TOC"
31   >--------------------------------</a><a name="qh_ANGLEdegen">-</a>
32 
33   qh_ANGLEdegen
34     indicates degenerate facet in mergeT->angle
35 */
36 #define qh_ANGLEdegen     5.0
37 
38 /*-<a                             href="qh-merge_r.htm#TOC"
39   >--------------------------------</a><a name="qh_ANGLEconcave">-</a>
40 
41   qh_ANGLEconcave
42     offset to indicate concave facets in mergeT->angle
43 
44   notes:
45     concave facets are assigned the range of [2,4] in mergeT->angle
46     roundoff error may make the angle less than 2
47 */
48 #define qh_ANGLEconcave  1.5
49 
50 /*-<a                             href="qh-merge_r.htm#TOC"
51   >--------------------------------</a><a name="MRG">-</a>
52 
53   MRG... (mergeType)
54     indicates the type of a merge (mergeT->type)
55 */
56 typedef enum {  /* in sort order for facet_mergeset */
57   MRGnone= 0,
58   MRGcoplanar,          /* centrum coplanar */
59   MRGanglecoplanar,     /* angle coplanar */
60                         /* could detect half concave ridges */
61   MRGconcave,           /* concave ridge */
62   MRGflip,              /* flipped facet. facet1 == facet2 */
63   MRGridge,             /* duplicate ridge (qh_MERGEridge) */
64                         /* degen and redundant go onto degen_mergeset */
65   MRGdegen,             /* degenerate facet (!enough neighbors) facet1 == facet2 */
66   MRGredundant,         /* redundant facet (vertex subset) */
67                         /* merge_degenredundant assumes degen < redundant */
68   MRGmirror,            /* mirror facet from qh_triangulate */
69   ENDmrg
70 } mergeType;
71 
72 /*-<a                             href="qh-merge_r.htm#TOC"
73   >--------------------------------</a><a name="qh_MERGEapex">-</a>
74 
75   qh_MERGEapex
76     flag for qh_mergefacet() to indicate an apex merge
77 */
78 #define qh_MERGEapex     True
79 
80 /*============ -structures- ====================*/
81 
82 /*-<a                             href="qh-merge_r.htm#TOC"
83   >--------------------------------</a><a name="mergeT">-</a>
84 
85   mergeT
86     structure used to merge facets
87 */
88 
89 typedef struct mergeT mergeT;
90 struct mergeT {         /* initialize in qh_appendmergeset */
91   realT   angle;        /* angle between normals of facet1 and facet2 */
92   facetT *facet1;       /* will merge facet1 into facet2 */
93   facetT *facet2;
94   mergeType type;
95 };
96 
97 
98 /*=========== -macros- =========================*/
99 
100 /*-<a                             href="qh-merge_r.htm#TOC"
101   >--------------------------------</a><a name="FOREACHmerge_">-</a>
102 
103   FOREACHmerge_( merges ) {...}
104     assign 'merge' to each merge in merges
105 
106   notes:
107     uses 'mergeT *merge, **mergep;'
108     if qh_mergefacet(),
109       restart since qh.facet_mergeset may change
110     see <a href="qset_r.h#FOREACHsetelement_">FOREACHsetelement_</a>
111 */
112 #define FOREACHmerge_( merges ) FOREACHsetelement_(mergeT, merges, merge)
113 
114 /*============ prototypes in alphabetical order after pre/postmerge =======*/
115 
116 #ifdef __cplusplus
117 extern "C" {
118 #endif
119 
120 void    qh_premerge(qhT *qh, vertexT *apex, realT maxcentrum, realT maxangle);
121 void    qh_postmerge(qhT *qh, const char *reason, realT maxcentrum, realT maxangle,
122              boolT vneighbors);
123 void    qh_all_merges(qhT *qh, boolT othermerge, boolT vneighbors);
124 void    qh_appendmergeset(qhT *qh, facetT *facet, facetT *neighbor, mergeType mergetype, realT *angle);
125 setT   *qh_basevertices(qhT *qh, facetT *samecycle);
126 void    qh_checkconnect(qhT *qh /* qh.new_facets */);
127 boolT   qh_checkzero(qhT *qh, boolT testall);
128 int     qh_compareangle(const void *p1, const void *p2);
129 int     qh_comparemerge(const void *p1, const void *p2);
130 int     qh_comparevisit(const void *p1, const void *p2);
131 void    qh_copynonconvex(qhT *qh, ridgeT *atridge);
132 void    qh_degen_redundant_facet(qhT *qh, facetT *facet);
133 void    qh_degen_redundant_neighbors(qhT *qh, facetT *facet, facetT *delfacet);
134 vertexT *qh_find_newvertex(qhT *qh, vertexT *oldvertex, setT *vertices, setT *ridges);
135 void    qh_findbest_test(qhT *qh, boolT testcentrum, facetT *facet, facetT *neighbor,
136            facetT **bestfacet, realT *distp, realT *mindistp, realT *maxdistp);
137 facetT *qh_findbestneighbor(qhT *qh, facetT *facet, realT *distp, realT *mindistp, realT *maxdistp);
138 void    qh_flippedmerges(qhT *qh, facetT *facetlist, boolT *wasmerge);
139 void    qh_forcedmerges(qhT *qh, boolT *wasmerge);
140 void    qh_getmergeset(qhT *qh, facetT *facetlist);
141 void    qh_getmergeset_initial(qhT *qh, facetT *facetlist);
142 void    qh_hashridge(qhT *qh, setT *hashtable, int hashsize, ridgeT *ridge, vertexT *oldvertex);
143 ridgeT *qh_hashridge_find(qhT *qh, setT *hashtable, int hashsize, ridgeT *ridge,
144               vertexT *vertex, vertexT *oldvertex, int *hashslot);
145 void    qh_makeridges(qhT *qh, facetT *facet);
146 void    qh_mark_dupridges(qhT *qh, facetT *facetlist);
147 void    qh_maydropneighbor(qhT *qh, facetT *facet);
148 int     qh_merge_degenredundant(qhT *qh);
149 void    qh_merge_nonconvex(qhT *qh, facetT *facet1, facetT *facet2, mergeType mergetype);
150 void    qh_mergecycle(qhT *qh, facetT *samecycle, facetT *newfacet);
151 void    qh_mergecycle_all(qhT *qh, facetT *facetlist, boolT *wasmerge);
152 void    qh_mergecycle_facets(qhT *qh, facetT *samecycle, facetT *newfacet);
153 void    qh_mergecycle_neighbors(qhT *qh, facetT *samecycle, facetT *newfacet);
154 void    qh_mergecycle_ridges(qhT *qh, facetT *samecycle, facetT *newfacet);
155 void    qh_mergecycle_vneighbors(qhT *qh, facetT *samecycle, facetT *newfacet);
156 void    qh_mergefacet(qhT *qh, facetT *facet1, facetT *facet2, realT *mindist, realT *maxdist, boolT mergeapex);
157 void    qh_mergefacet2d(qhT *qh, facetT *facet1, facetT *facet2);
158 void    qh_mergeneighbors(qhT *qh, facetT *facet1, facetT *facet2);
159 void    qh_mergeridges(qhT *qh, facetT *facet1, facetT *facet2);
160 void    qh_mergesimplex(qhT *qh, facetT *facet1, facetT *facet2, boolT mergeapex);
161 void    qh_mergevertex_del(qhT *qh, vertexT *vertex, facetT *facet1, facetT *facet2);
162 void    qh_mergevertex_neighbors(qhT *qh, facetT *facet1, facetT *facet2);
163 void    qh_mergevertices(qhT *qh, setT *vertices1, setT **vertices);
164 setT   *qh_neighbor_intersections(qhT *qh, vertexT *vertex);
165 void    qh_newvertices(qhT *qh, setT *vertices);
166 boolT   qh_reducevertices(qhT *qh);
167 vertexT *qh_redundant_vertex(qhT *qh, vertexT *vertex);
168 boolT   qh_remove_extravertices(qhT *qh, facetT *facet);
169 vertexT *qh_rename_sharedvertex(qhT *qh, vertexT *vertex, facetT *facet);
170 void    qh_renameridgevertex(qhT *qh, ridgeT *ridge, vertexT *oldvertex, vertexT *newvertex);
171 void    qh_renamevertex(qhT *qh, vertexT *oldvertex, vertexT *newvertex, setT *ridges,
172                         facetT *oldfacet, facetT *neighborA);
173 boolT   qh_test_appendmerge(qhT *qh, facetT *facet, facetT *neighbor);
174 boolT   qh_test_vneighbors(qhT *qh /* qh.newfacet_list */);
175 void    qh_tracemerge(qhT *qh, facetT *facet1, facetT *facet2);
176 void    qh_tracemerging(qhT *qh);
177 void    qh_updatetested(qhT *qh, facetT *facet1, facetT *facet2);
178 setT   *qh_vertexridges(qhT *qh, vertexT *vertex);
179 void    qh_vertexridges_facet(qhT *qh, vertexT *vertex, facetT *facet, setT **ridges);
180 void    qh_willdelete(qhT *qh, facetT *facet, facetT *replace);
181 
182 #ifdef __cplusplus
183 } /* extern "C" */
184 #endif
185 
186 #endif /* qhDEFmerge */
187