File indexing completed on 2025-12-16 10:19:27
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef qhDEFmerge
0015 #define qhDEFmerge 1
0016
0017 #include "libqhull_r.h"
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #define qh_ANGLEnone 2.0
0029
0030
0031
0032
0033
0034
0035
0036
0037 typedef enum {
0038 MRGnone= 0,
0039
0040
0041 MRGcoplanar,
0042 MRGanglecoplanar,
0043 MRGconcave,
0044 MRGconcavecoplanar,
0045 MRGtwisted,
0046
0047 MRGflip,
0048
0049 MRGdupridge,
0050
0051 MRGsubridge,
0052 MRGvertices,
0053
0054 MRGdegen,
0055 MRGredundant,
0056
0057 MRGmirror,
0058
0059
0060 MRGcoplanarhorizon,
0061 ENDmrg
0062 } mergeType;
0063
0064
0065
0066
0067
0068
0069
0070 #define qh_MERGEapex True
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081 typedef struct mergeT mergeT;
0082 struct mergeT {
0083 realT angle;
0084
0085 realT distance;
0086 facetT *facet1;
0087 facetT *facet2;
0088 vertexT *vertex1;
0089 vertexT *vertex2;
0090 ridgeT *ridge1;
0091 ridgeT *ridge2;
0092 mergeType mergetype;
0093 };
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110 #define FOREACHmerge_(merges) FOREACHsetelement_(mergeT, merges, merge)
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122 #define FOREACHmergeA_(merges) FOREACHsetelement_(mergeT, merges, mergeA)
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137 #define FOREACHmerge_i_(qh, mergeset) FOREACHsetelement_i_(qh, mergeT, mergeset, merge)
0138
0139
0140
0141 #ifdef __cplusplus
0142 extern "C" {
0143 #endif
0144
0145 void qh_premerge(qhT *qh, int apexpointid, realT maxcentrum, realT maxangle);
0146 void qh_postmerge(qhT *qh, const char *reason, realT maxcentrum, realT maxangle,
0147 boolT vneighbors);
0148 void qh_all_merges(qhT *qh, boolT othermerge, boolT vneighbors);
0149 void qh_all_vertexmerges(qhT *qh, int apexpointid, facetT *facet, facetT **retryfacet);
0150 void qh_appendmergeset(qhT *qh, facetT *facet, facetT *neighbor, mergeType mergetype, coordT dist, realT angle);
0151 void qh_appendvertexmerge(qhT *qh, vertexT *vertex, vertexT *destination, mergeType mergetype, realT distance, ridgeT *ridge1, ridgeT *ridge2);
0152 setT *qh_basevertices(qhT *qh, facetT *samecycle);
0153 void qh_check_dupridge(qhT *qh, facetT *facet1, realT dist1, facetT *facet2, realT dist2);
0154 void qh_checkconnect(qhT *qh );
0155 void qh_checkdelfacet(qhT *qh, facetT *facet, setT *mergeset);
0156 void qh_checkdelridge(qhT *qh );
0157 boolT qh_checkzero(qhT *qh, boolT testall);
0158 int qh_compare_anglemerge(const void *p1, const void *p2);
0159 int qh_compare_facetmerge(const void *p1, const void *p2);
0160 int qh_comparevisit(const void *p1, const void *p2);
0161 void qh_copynonconvex(qhT *qh, ridgeT *atridge);
0162 void qh_degen_redundant_facet(qhT *qh, facetT *facet);
0163 void qh_drop_mergevertex(qhT *qh, mergeT *merge);
0164 void qh_delridge_merge(qhT *qh, ridgeT *ridge);
0165 vertexT *qh_find_newvertex(qhT *qh, vertexT *oldvertex, setT *vertices, setT *ridges);
0166 vertexT *qh_findbest_pinchedvertex(qhT *qh, mergeT *merge, vertexT *apex, vertexT **pinchedp, realT *distp );
0167 vertexT *qh_findbest_ridgevertex(qhT *qh, ridgeT *ridge, vertexT **pinchedp, coordT *distp);
0168 void qh_findbest_test(qhT *qh, boolT testcentrum, facetT *facet, facetT *neighbor,
0169 facetT **bestfacet, realT *distp, realT *mindistp, realT *maxdistp);
0170 facetT *qh_findbestneighbor(qhT *qh, facetT *facet, realT *distp, realT *mindistp, realT *maxdistp);
0171 void qh_flippedmerges(qhT *qh, facetT *facetlist, boolT *wasmerge);
0172 void qh_forcedmerges(qhT *qh, boolT *wasmerge);
0173 void qh_freemergesets(qhT *qh);
0174 void qh_getmergeset(qhT *qh, facetT *facetlist);
0175 void qh_getmergeset_initial(qhT *qh, facetT *facetlist);
0176 boolT qh_getpinchedmerges(qhT *qh, vertexT *apex, coordT maxdupdist, boolT *iscoplanar );
0177 boolT qh_hasmerge(setT *mergeset, mergeType type, facetT *facetA, facetT *facetB);
0178 void qh_hashridge(qhT *qh, setT *hashtable, int hashsize, ridgeT *ridge, vertexT *oldvertex);
0179 ridgeT *qh_hashridge_find(qhT *qh, setT *hashtable, int hashsize, ridgeT *ridge,
0180 vertexT *vertex, vertexT *oldvertex, int *hashslot);
0181 void qh_initmergesets(qhT *qh);
0182 void qh_makeridges(qhT *qh, facetT *facet);
0183 void qh_mark_dupridges(qhT *qh, facetT *facetlist, boolT allmerges);
0184 void qh_maybe_duplicateridge(qhT *qh, ridgeT *ridge);
0185 void qh_maybe_duplicateridges(qhT *qh, facetT *facet);
0186 void qh_maydropneighbor(qhT *qh, facetT *facet);
0187 int qh_merge_degenredundant(qhT *qh);
0188 void qh_merge_nonconvex(qhT *qh, facetT *facet1, facetT *facet2, mergeType mergetype);
0189 void qh_merge_pinchedvertices(qhT *qh, int apexpointid );
0190 void qh_merge_twisted(qhT *qh, facetT *facet1, facetT *facet2);
0191 void qh_mergecycle(qhT *qh, facetT *samecycle, facetT *newfacet);
0192 void qh_mergecycle_all(qhT *qh, facetT *facetlist, boolT *wasmerge);
0193 void qh_mergecycle_facets(qhT *qh, facetT *samecycle, facetT *newfacet);
0194 void qh_mergecycle_neighbors(qhT *qh, facetT *samecycle, facetT *newfacet);
0195 void qh_mergecycle_ridges(qhT *qh, facetT *samecycle, facetT *newfacet);
0196 void qh_mergecycle_vneighbors(qhT *qh, facetT *samecycle, facetT *newfacet);
0197 void qh_mergefacet(qhT *qh, facetT *facet1, facetT *facet2, mergeType mergetype, realT *mindist, realT *maxdist, boolT mergeapex);
0198 void qh_mergefacet2d(qhT *qh, facetT *facet1, facetT *facet2);
0199 void qh_mergeneighbors(qhT *qh, facetT *facet1, facetT *facet2);
0200 void qh_mergeridges(qhT *qh, facetT *facet1, facetT *facet2);
0201 void qh_mergesimplex(qhT *qh, facetT *facet1, facetT *facet2, boolT mergeapex);
0202 void qh_mergevertex_del(qhT *qh, vertexT *vertex, facetT *facet1, facetT *facet2);
0203 void qh_mergevertex_neighbors(qhT *qh, facetT *facet1, facetT *facet2);
0204 void qh_mergevertices(qhT *qh, setT *vertices1, setT **vertices);
0205 setT *qh_neighbor_intersections(qhT *qh, vertexT *vertex);
0206 setT *qh_neighbor_vertices(qhT *qh, vertexT *vertex, setT *subridge);
0207 void qh_neighbor_vertices_facet(qhT *qh, vertexT *vertexA, facetT *facet, setT **vertices);
0208 void qh_newvertices(qhT *qh, setT *vertices);
0209 mergeT *qh_next_vertexmerge(qhT *qh);
0210 facetT *qh_opposite_horizonfacet(qhT *qh, mergeT *merge, vertexT **vertex);
0211 boolT qh_reducevertices(qhT *qh);
0212 vertexT *qh_redundant_vertex(qhT *qh, vertexT *vertex);
0213 boolT qh_remove_extravertices(qhT *qh, facetT *facet);
0214 void qh_remove_mergetype(qhT *qh, setT *mergeset, mergeType type);
0215 void qh_rename_adjacentvertex(qhT *qh, vertexT *oldvertex, vertexT *newvertex, realT dist);
0216 vertexT *qh_rename_sharedvertex(qhT *qh, vertexT *vertex, facetT *facet);
0217 boolT qh_renameridgevertex(qhT *qh, ridgeT *ridge, vertexT *oldvertex, vertexT *newvertex);
0218 void qh_renamevertex(qhT *qh, vertexT *oldvertex, vertexT *newvertex, setT *ridges,
0219 facetT *oldfacet, facetT *neighborA);
0220 boolT qh_test_appendmerge(qhT *qh, facetT *facet, facetT *neighbor, boolT simplicial);
0221 void qh_test_degen_neighbors(qhT *qh, facetT *facet);
0222 boolT qh_test_centrum_merge(qhT *qh, facetT *facet, facetT *neighbor, realT angle, boolT okangle);
0223 boolT qh_test_nonsimplicial_merge(qhT *qh, facetT *facet, facetT *neighbor, realT angle, boolT okangle);
0224 void qh_test_redundant_neighbors(qhT *qh, facetT *facet);
0225 boolT qh_test_vneighbors(qhT *qh );
0226 void qh_tracemerge(qhT *qh, facetT *facet1, facetT *facet2, mergeType mergetype);
0227 void qh_tracemerging(qhT *qh);
0228 void qh_undo_newfacets(qhT *qh);
0229 void qh_updatetested(qhT *qh, facetT *facet1, facetT *facet2);
0230 setT *qh_vertexridges(qhT *qh, vertexT *vertex, boolT allneighbors);
0231 void qh_vertexridges_facet(qhT *qh, vertexT *vertex, facetT *facet, setT **ridges);
0232 void qh_willdelete(qhT *qh, facetT *facet, facetT *replace);
0233
0234 #ifdef __cplusplus
0235 }
0236 #endif
0237
0238 #endif