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