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