TTK
Loading...
Searching...
No Matches
ReebSpace.cpp
Go to the documentation of this file.
1#include <ReebSpace.h>
2
4 this->setDebugMsgPrefix("ReebSpace");
5}
6
8 const SimplexId &sheet3Id,
9 const SimplexId &sheet0Id) {
10
11 bool alreadyConnected = false;
12 for(size_t i = 0; i < data.sheet3List_[sheet3Id].sheet0List_.size(); i++) {
13 if(data.sheet3List_[sheet3Id].sheet0List_[i] == sheet0Id) {
14 // already connected
15 alreadyConnected = true;
16 break;
17 }
18 }
19 if(!alreadyConnected)
20 data.sheet3List_[sheet3Id].sheet0List_.push_back(sheet0Id);
21
22 for(size_t i = 0; i < data.sheet0List_[sheet0Id].sheet3List_.size(); i++) {
23 if(data.sheet0List_[sheet0Id].sheet3List_[i] == sheet3Id)
24 // already connected
25 return -1;
26 }
27 data.sheet0List_[sheet0Id].sheet3List_.push_back(sheet3Id);
28
29 return 0;
30}
31
33 const SimplexId &sheet3Id,
34 const SimplexId &sheet1Id) {
35
36 bool alreadyConnected = false;
37 for(size_t i = 0; i < data.sheet3List_[sheet3Id].sheet1List_.size(); i++) {
38 if(data.sheet3List_[sheet3Id].sheet1List_[i] == sheet1Id) {
39 // already connected
40 alreadyConnected = true;
41 break;
42 }
43 }
44 if(!alreadyConnected)
45 data.sheet3List_[sheet3Id].sheet1List_.push_back(sheet1Id);
46
47 for(size_t i = 0; i < data.sheet1List_[sheet1Id].sheet3List_.size(); i++) {
48 if(data.sheet1List_[sheet1Id].sheet3List_[i] == sheet3Id)
49 // already connected
50 return -1;
51 }
52 data.sheet1List_[sheet1Id].sheet3List_.push_back(sheet3Id);
53
54 return 0;
55}
56
58 const SimplexId &sheet3Id,
59 const SimplexId &sheet2Id) {
60
61 bool alreadyConnected = false;
62 for(size_t i = 0; i < data.sheet3List_[sheet3Id].sheet2List_.size(); i++) {
63 if(data.sheet3List_[sheet3Id].sheet2List_[i] == sheet2Id) {
64 // already connected
65 alreadyConnected = true;
66 break;
67 }
68 }
69 if(!alreadyConnected)
70 data.sheet3List_[sheet3Id].sheet2List_.push_back(sheet2Id);
71
72 for(size_t i = 0; i < data.sheet2List_[sheet2Id].sheet3List_.size(); i++) {
73 if(data.sheet2List_[sheet2Id].sheet3List_[i] == sheet3Id)
74 // already connected
75 return -1;
76 }
77 data.sheet2List_[sheet2Id].sheet3List_.push_back(sheet3Id);
78
79 return 0;
80}
81
83 const SimplexId &sheet3Id,
84 const SimplexId &otherSheet3Id) {
85
86 if(sheet3Id == otherSheet3Id)
87 return -1;
88
89 bool alreadyConnected = false;
90 for(size_t i = 0; i < data.sheet3List_[sheet3Id].sheet3List_.size(); i++) {
91 if(data.sheet3List_[sheet3Id].sheet3List_[i] == otherSheet3Id) {
92 // already connected
93 alreadyConnected = true;
94 break;
95 }
96 }
97 if(!alreadyConnected)
98 data.sheet3List_[sheet3Id].sheet3List_.push_back(otherSheet3Id);
99
100 for(size_t i = 0; i < data.sheet3List_[otherSheet3Id].sheet3List_.size();
101 i++) {
102 if(data.sheet3List_[otherSheet3Id].sheet3List_[i] == sheet3Id)
103 // already connected
104 return -3;
105 }
106 data.sheet3List_[otherSheet3Id].sheet3List_.push_back(sheet3Id);
107
108 return 0;
109}
110
112 const SimplexId &sheet1Id,
113 const SimplexId &sheet0Id,
114 const SimplexId &biggerId) {
115
116 std::vector<SimplexId> newList;
117
118 newList.reserve(data.sheet0List_[sheet0Id].sheet1List_.size());
119
120 for(size_t i = 0; i < data.sheet0List_[sheet0Id].sheet1List_.size(); i++) {
121
122 if(data.sheet0List_[sheet0Id].sheet1List_[i] != sheet1Id) {
123 newList.push_back(data.sheet0List_[sheet0Id].sheet1List_[i]);
124 }
125 }
126
127 if(data.sheet0List_[sheet0Id].sheet1List_.empty()) {
128 data.sheet0List_[sheet0Id].pruned_ = true;
129 data.vertex2sheet3_[data.sheet0List_[sheet0Id].vertexId_] = biggerId;
130 }
131
132 return 0;
133}
134
136 const SimplexId &sheet3Id,
137 const SimplexId &sheet0Id) {
138
139 std::vector<SimplexId> newList;
140
141 newList.reserve(data.sheet0List_[sheet0Id].sheet3List_.size());
142 for(size_t i = 0; i < data.sheet0List_[sheet0Id].sheet3List_.size(); i++) {
143 if(data.sheet0List_[sheet0Id].sheet3List_[i] != sheet3Id)
144 newList.push_back(data.sheet0List_[sheet0Id].sheet3List_[i]);
145 }
146
147 data.sheet0List_[sheet0Id].sheet3List_ = newList;
148
149 return 0;
150}
151
153 const SimplexId &sheet3Id,
154 const SimplexId &sheet2Id) {
155
156 std::vector<SimplexId> newList;
157
158 newList.reserve(data.sheet2List_[sheet2Id].sheet3List_.size());
159 for(size_t i = 0; i < data.sheet2List_[sheet2Id].sheet3List_.size(); i++) {
160 if(data.sheet2List_[sheet2Id].sheet3List_[i] != sheet3Id)
161 newList.push_back(data.sheet2List_[sheet2Id].sheet3List_[i]);
162 }
163
164 data.sheet2List_[sheet2Id].sheet3List_ = newList;
165
166 return 0;
167}
168
170 const SimplexId &sheet3Id,
171 const SimplexId &other3SheetId) {
172
173 std::vector<SimplexId> newList;
174
175 newList.reserve(data.sheet3List_[other3SheetId].sheet3List_.size());
176 for(size_t i = 0; i < data.sheet3List_[other3SheetId].sheet3List_.size();
177 i++) {
178 if(data.sheet3List_[other3SheetId].sheet3List_[i] != sheet3Id)
179 newList.push_back(data.sheet3List_[other3SheetId].sheet3List_[i]);
180 }
181
182 data.sheet3List_[other3SheetId].sheet3List_ = newList;
183
184 return 0;
185}
186
188 const SimplexId &sheetId1) {
189
190 // 1. add the vertices and tets of 0 to 1
191 for(size_t i = 0; i < originalData_.sheet3List_[sheetId0].vertexList_.size();
192 i++) {
193 SimplexId const vertexId
194 = originalData_.sheet3List_[sheetId0].vertexList_[i];
195 originalData_.sheet3List_[sheetId1].vertexList_.push_back(vertexId);
196 originalData_.vertex2sheet3_[vertexId] = sheetId1;
197 }
198 for(size_t i = 0; i < originalData_.sheet3List_[sheetId0].tetList_.size();
199 i++) {
200 SimplexId const tetId = originalData_.sheet3List_[sheetId0].tetList_[i];
201 originalData_.sheet3List_[sheetId1].tetList_.push_back(tetId);
202 originalData_.tet2sheet3_[tetId] = sheetId1;
203 }
204
205 // 2. update bigger's score and re-insert it in the candidate list
206 originalData_.sheet3List_[sheetId1].domainVolume_
207 += originalData_.sheet3List_[sheetId0].domainVolume_;
208 originalData_.sheet3List_[sheetId1].rangeArea_
209 += originalData_.sheet3List_[sheetId0].rangeArea_;
210 originalData_.sheet3List_[sheetId1].hyperVolume_
211 += originalData_.sheet3List_[sheetId0].hyperVolume_;
212
213 originalData_.sheet3List_[sheetId0].pruned_ = true;
214 originalData_.sheet3List_[sheetId0].preMerger_ = sheetId1;
215 originalData_.sheet3List_[sheetId1].preMergedSheets_.push_back(sheetId0);
216
217 return 0;
218}
219
221
222 Timer t;
223
224 // currentData_ = originalData_;
225
226 // copy parts of the original data to the current one
227 // here we don't want to copy the fiber surfaces, this is just too much
228 currentData_.tet2sheet3_ = originalData_.tet2sheet3_;
229 currentData_.vertex2sheet0_ = originalData_.vertex2sheet0_;
230 currentData_.vertex2sheet3_ = originalData_.vertex2sheet3_;
231 currentData_.edge2sheet1_ = originalData_.edge2sheet1_;
232 currentData_.edgeTypes_ = originalData_.edgeTypes_;
233
234 currentData_.sheet0List_ = originalData_.sheet0List_;
235 currentData_.sheet1List_ = originalData_.sheet1List_;
236 currentData_.sheet3List_ = originalData_.sheet3List_;
237
238 currentData_.sheet2List_.resize(originalData_.sheet2List_.size());
239
240#ifdef TTK_ENABLE_OPENMP
241#pragma omp parallel for num_threads(threadNumber_)
242#endif
243 for(size_t i = 0; i < currentData_.sheet2List_.size(); i++) {
244 currentData_.sheet2List_[i].sheet1Id_
245 = originalData_.sheet2List_[i].sheet1Id_;
246 currentData_.sheet2List_[i].sheet3List_
247 = originalData_.sheet2List_[i].sheet3List_;
248 }
249
250 for(size_t i = 0; i < currentData_.sheet3List_.size(); i++) {
251 currentData_.sheet3List_[i].simplificationId_
252 = currentData_.sheet3List_[i].Id_;
253 }
254
255 for(size_t i = 0; i < currentData_.sheet1List_.size(); i++) {
256 if((currentData_.sheet1List_[i].hasSaddleEdges_)
257 && (currentData_.sheet1List_[i].sheet3List_.size() == 1)) {
258
259 currentData_.sheet1List_[i].pruned_ = true;
260 currentData_.sheet2List_[i].pruned_ = true;
261
262 for(size_t j = 0; j < currentData_.sheet1List_[i].sheet0List_.size();
263 j++) {
264 SimplexId const sheet0Id = currentData_.sheet1List_[i].sheet0List_[j];
265 currentData_.sheet0List_[sheet0Id].pruned_ = true;
266 }
267 }
268 }
269
270 this->printMsg("Data prepared for simplification.", 1.0, t.getElapsedTime(),
271 this->threadNumber_);
272
273 return 0;
274}
275
276int ttk::ReebSpace::printConnectivity(const ReebSpaceData &data) const {
277
278 if(debugLevel_ < static_cast<int>(debug::Priority::DETAIL))
279 return -1;
280
281 std::stringstream msg;
282
283 msg << "Connectivity..." << std::endl;
284
285 msg << data.sheet0List_.size() << " 0-sheets:" << std::endl;
286 for(size_t i = 0; i < data.sheet0List_.size(); i++) {
287 msg << "3-sheets for 0-sheet #" << i
288 << " [p=" << data.sheet0List_[i].pruned_ << "]"
289 << ": ";
290 for(size_t j = 0; j < data.sheet0List_[i].sheet3List_.size(); j++) {
291 msg << "#" << data.sheet0List_[i].sheet3List_[j] << ", ";
292 }
293 msg << std::endl;
294 }
295
296 msg << data.sheet1List_.size() << " 1-sheets:" << std::endl;
297 for(size_t i = 0; i < data.sheet1List_.size(); i++) {
298 msg << "3-sheets for 1-sheet #" << i
299 << " [p=" << data.sheet1List_[i].pruned_ << "]"
300 << ": ";
301 for(size_t j = 0; j < data.sheet1List_[i].sheet3List_.size(); j++) {
302 msg << "#" << data.sheet1List_[i].sheet3List_[j] << ", ";
303 }
304 msg << std::endl;
305 }
306
307 msg << data.sheet2List_.size() << " 2-sheets:" << std::endl;
308 for(size_t i = 0; i < data.sheet2List_.size(); i++) {
309 msg << "3-sheets for 2-sheet #" << i
310 << " [p=" << data.sheet2List_[i].pruned_ << "]"
311 << ": ";
312 for(size_t j = 0; j < data.sheet2List_[i].sheet3List_.size(); j++) {
313 msg << "#" << data.sheet2List_[i].sheet3List_[j] << ", ";
314 }
315 msg << std::endl;
316 }
317
318 msg << data.sheet3List_.size() << " 3-sheets:" << std::endl;
319 for(size_t i = 0; i < data.sheet3List_.size(); i++) {
320 msg << "3-sheets for 3-sheet #" << i
321 << " [p=" << data.sheet3List_[i].pruned_ << "]"
322 << ": ";
323 for(size_t j = 0; j < data.sheet3List_[i].sheet3List_.size(); j++) {
324 msg << "#" << data.sheet3List_[i].sheet3List_[j] << ", ";
325 }
326 msg << std::endl;
327 }
328
329 std::string one_line{};
330 while(std::getline(msg, one_line)) {
331 this->printMsg(one_line, debug::Priority::VERBOSE);
332 }
333
334 return 0;
335}
336
337// int ReebSpace::triangulateTetrahedron(const int &tetId,
338// const vector<vector<int> > &triangles,
339// vector<long long int> &outputTets){
340//
341// // create a local mesh to avoid large memory allocations in the constrained
342// // triangulation class.
343// vector<double> localPoints;
344// map<int, int> global2local;
345// vector<int> local2global;
346//
347// int localTriangleNumber = 0;
348// vector<long long int> localMarkers;
349// vector<long long int> localCells;
350//
351// // add the triangles of the tet, in order:
352// // i, j, k
353// // 0, 1, 2
354// // 0, 1, 3
355// // 0, 2, 3
356// // 1, 2, 3
357// for(int i = 0; i < 2; i++){
358// for(int j = i + 1; j < 3; j++){
359// for(int k = j + 1; k < 4; k++){
360//
361// int iId = 0;
362// int globalVertexId = tetList_[5*tetId + 1 + i];
363//
364// map<int, int>::iterator it = global2local.find(-(globalVertexId +
365// 1));
366//
367// if(it == global2local.end()){
368// iId = local2global.size();
369// global2local[-(globalVertexId + 1)] = iId;
370// local2global.push_back(-(globalVertexId + 1));
371//
372// localPoints.resize(localPoints.size() + 3);
373// localPoints[3*iId] = pointSet_[3*globalVertexId];
374// localPoints[3*iId + 1] = pointSet_[3*globalVertexId + 1];
375// localPoints[3*iId + 2] = pointSet_[3*globalVertexId + 2];
376// }
377// else{
378// iId = it->second;
379// }
380//
381// int jId = 0;
382// globalVertexId = tetList_[5*tetId + 1 + j];
383//
384// it = global2local.find(-(globalVertexId + 1));
385//
386// if(it == global2local.end()){
387// jId = local2global.size();
388// global2local[-(globalVertexId + 1)] = jId;
389// local2global.push_back(-(globalVertexId + 1));
390//
391// localPoints.resize(localPoints.size() + 3);
392// localPoints[3*jId] = pointSet_[3*globalVertexId];
393// localPoints[3*jId + 1] = pointSet_[3*globalVertexId + 1];
394// localPoints[3*jId + 2] = pointSet_[3*globalVertexId + 2];
395// }
396// else{
397// jId = it->second;
398// }
399//
400// int kId = 0;
401// globalVertexId = tetList_[5*tetId + 1 + k];
402//
403// it = global2local.find(-(globalVertexId + 1));
404//
405// if(it == global2local.end()){
406// kId = local2global.size();
407// global2local[-(globalVertexId + 1)] = kId;
408// local2global.push_back(-(globalVertexId + 1));
409//
410// localPoints.resize(localPoints.size() + 3);
411// localPoints[3*kId] = pointSet_[3*globalVertexId];
412// localPoints[3*kId + 1] = pointSet_[3*globalVertexId + 1];
413// localPoints[3*kId + 2] = pointSet_[3*globalVertexId + 2];
414// }
415// else{
416// kId = it->second;
417// }
418//
419// int triangleId = localTriangleNumber;
420// localTriangleNumber++;
421// localCells.resize(localCells.size() + 4);
422// localCells[4*triangleId] = 3;
423// localCells[4*triangleId + 1] = iId;
424// localCells[4*triangleId + 2] = jId;
425// localCells[4*triangleId + 3] = kId;
426// localMarkers.push_back(-1);
427// }
428// }
429// }
430//
431// // add the fiber surface triangles
432// for(int i = 0; i < (int) triangles.size(); i++){
433//
434// int triangleId = localTriangleNumber;
435// localTriangleNumber++;
436//
437// localCells.resize(localCells.size() + 4);
438// localCells[4*triangleId] = 3;
439// localMarkers.push_back(triangles[i][0]);
440//
441// for(int j = 0; j < 3; j++){
442// int localId = 0;
443// int globalVertexId =
444// sheet2List_[triangles[i][0]].triangleList_[triangles[i][1]][
445// triangles[i][2]].vertexIds_[j];
446//
447// map<int, int>::iterator it = global2local.find(globalVertexId);
448// if(it == global2local.end()){
449//
450// // merge fiber surface vertices with tetVertices if needed
451// bool tetVertex = false;
452// for(int k = 0; k < 4; k++){
453// vector<double> tetPoint(3);
454// tetPoint[0] = localPoints[3*k];
455// tetPoint[1] = localPoints[3*k+1];
456// tetPoint[2] = localPoints[3*k+2];
457// double distance = Geometry::distance(
458// fiberSurfaceVertexList_[globalVertexId].p_,
459// tetPoint.data());
460// if(distance < Geometry::powIntTen(-FLT_DIG)){
461// localId = k;
462// tetVertex = true;
463// break;
464// }
465// }
466//
467// if(!tetVertex){
468// // not found
469// localId = local2global.size();
470// global2local[globalVertexId] = localId;
471// local2global.push_back(globalVertexId);
472//
473// localPoints.resize(localPoints.size() + 3);
474// localPoints[3*localId] =
475// fiberSurfaceVertexList_[globalVertexId].p_[0];
476// localPoints[3*localId + 1] =
477// fiberSurfaceVertexList_[globalVertexId].p_[1];
478// localPoints[3*localId + 2] =
479// fiberSurfaceVertexList_[globalVertexId].p_[2];
480// }
481// }
482// else{
483// localId = it->second;
484// }
485//
486// localCells[4*triangleId + 1 + j] = localId;
487// }
488// }
489//
490//
491//
492// int ret = 0;
493// {
494// ConstrainedTriangulation cTriangulation;
495// cTriangulation.setDebugLevel(16);
496// // cTriangulation.setDebugLevel(0);
497// cTriangulation.setThreadNumber(1);
498// cTriangulation.setInputVertexNumber(localPoints.size()/3);
499// cTriangulation.setInputPoints(
500// (const double *) localPoints.data());
501// cTriangulation.setInputCellNumber(localTriangleNumber);
502// cTriangulation.setInputCells(
503// (const long long int *) localCells.data());
504// cTriangulation.setInputCellMarkers(
505// (const long long int *) localMarkers.data());
506// cTriangulation.setBoundaryMarker(-1);
507// cTriangulation.setBoundaryRemeshing(true);
508//
509// vector<float> outputPoints;
510// cTriangulation.setOutputPoints(&outputPoints);
511// cTriangulation.setOutputCells(&outputTets);
512// ret = cTriangulation.execute();
513// }
514//
515// // update with global vertex identifiers
516// for(int i = 0; i < (int) outputTets.size()/5; i++){
517// for(int j = 0; j < 4; j++){
518// outputTets[5*i + 1 + j] = local2global[outputTets[5*i + 1 + j]];
519// }
520// }
521//
522// return ret;
523// }
524
525// int ReebSpace::triangulateThreeSheets(){
526//
527// Timer t;
528//
529// vector<bool> inQueue(tetNumber_, false);
530// vector<vector<long long int> > outputTets(tetNumber_);
531// vector<vector<vector<int> > > tetTriangles(tetNumber_);
532// vector<int> tetList;
533//
534// for(int i = 0; i < (int) sheet2List_.size(); i++){
535// for(int j = 0; j < (int) sheet2List_[i].triangleList_.size(); j++){
536// for(int k = 0; k < (int) sheet2List_[i].triangleList_[j].size(); k++){
537//
538// int tetId = sheet2List_[i].triangleList_[j][k].tetId_;
539//
540// if(!inQueue[tetId]){
541// tetList.push_back(tetId);
542// inQueue[tetId] = true;
543// }
544//
545// tetTriangles[tetId].resize(
546// tetTriangles[tetId].size() + 1);
547// tetTriangles[tetId].back().resize(3);
548// tetTriangles[tetId].back()[0] = i;
549// tetTriangles[tetId].back()[1] = j;
550// tetTriangles[tetId].back()[2] = k;
551// }
552// }
553// }
554//
555// #ifdef TTK_ENABLE_OPENMP
556// #pragma omp parallel for num_threads(threadNumber_)
557// #endif
558// for(int i = 0; i < (int) tetList.size(); i++){
559// int tetId = tetList[i];
560// int ret =
561// triangulateTetrahedron(tetId, tetTriangles[tetId], outputTets[tetId]);
562// if(ret < 0){
563// break;
564// }
565// }
566//
567// // now merge the tet lists into 1 big list
568// sheet3points_.resize(3*(vertexNumber_ + fiberSurfaceVertexList_.size()));
569// for(int i = 0; i < 3*vertexNumber_; i++){
570// sheet3points_[i] = pointSet_[i];
571// }
572// for(int i = 0; i < (int) fiberSurfaceVertexList_.size(); i++){
573// sheet3points_[3*vertexNumber_ + 3*i] = fiberSurfaceVertexList_[i].p_[0];
574// sheet3points_[3*vertexNumber_ + 3*i + 1] =
575// fiberSurfaceVertexList_[i].p_[1]; sheet3points_[3*vertexNumber_ + 3*i +
576// 2] = fiberSurfaceVertexList_[i].p_[2];
577// }
578//
579// int tetOffset = 0;
580// for(int i = 0; i < (int) outputTets.size(); i++){
581//
582// tetOffset = sheet3cells_.size();
583//
584// if(outputTets[i].empty()){
585// // original tet which has not been remeshed
586// sheet3cells_.resize(sheet3cells_.size() + 5);
587// sheet3cells_[tetOffset] = 4;
588// for(int j = 0; j < 4; j++)
589// sheet3cells_[tetOffset + 1 + j] = tetList_[5*i + 1 + j];
590// }
591// else{
592// // concat sheet3cells_ and outputTets[i]
593// sheet3cells_.resize(sheet3cells_.size() + outputTets[i].size());
594// for(int j = 0; j < (int) outputTets[i].size()/5; j++){
595//
596// sheet3cells_[tetOffset] = 4;
597//
598// int vertexId = -1;
599//
600// for(int k = 0; k < 4; k++){
601// if(outputTets[i][5*j + 1 + k] < 0){
602// // tetVertex --> original id
603// vertexId = -(outputTets[i][5*j + 1 + k] + 1);
604// }
605// else{
606// vertexId = vertexNumber_ + outputTets[i][5*j + 1 + k];
607// }
608// sheet3cells_[tetOffset + 1 + k] = vertexId;
609// }
610//
611// tetOffset += 5;
612// }
613// }
614// }
615//
616// {
617// stringstream msg;
618// msg << "[ReebSpace] 3-sheets ("
619// << sheet3cells_.size()/5
620// << " tets) triangulated in "
621// << t.getElapsedTime() << " s. ("
622// << threadNumber_
623// << " thread(s))" << endl;
624// dMsg(cout, msg.str(), timeMsg);
625// }
626//
627// return 0;
628// }
void setDebugMsgPrefix(const std::string &prefix)
Definition Debug.h:364
int disconnect3sheetFrom2sheet(ReebSpaceData &data, const SimplexId &sheet3Id, const SimplexId &sheet2Id)
int connect3sheetTo3sheet(ReebSpaceData &data, const SimplexId &sheet3Id, const SimplexId &otherSheet3Id)
Definition ReebSpace.cpp:82
int connect3sheetTo0sheet(ReebSpaceData &data, const SimplexId &sheet3Id, const SimplexId &sheet0Id)
Definition ReebSpace.cpp:7
int printConnectivity(const ReebSpaceData &data) const
int connect3sheetTo2sheet(ReebSpaceData &data, const SimplexId &sheet3Id, const SimplexId &sheet2Id)
Definition ReebSpace.cpp:57
int prepareSimplification()
int connect3sheetTo1sheet(ReebSpaceData &data, const SimplexId &sheet3Id, const SimplexId &sheet1Id)
Definition ReebSpace.cpp:32
int preMergeSheets(const SimplexId &sheetId0, const SimplexId &sheetId1)
int disconnect1sheetFrom0sheet(ReebSpaceData &data, const SimplexId &sheet1Id, const SimplexId &sheet0Id, const SimplexId &biggerId)
int disconnect3sheetFrom3sheet(ReebSpaceData &data, const SimplexId &sheet3Id, const SimplexId &other3SheetId)
int disconnect3sheetFrom0sheet(ReebSpaceData &data, const SimplexId &sheet3Id, const SimplexId &sheet0Id)
double getElapsedTime()
Definition Timer.h:15
int SimplexId
Identifier type for simplices of any dimension.
Definition DataTypes.h:22
printMsg(debug::output::BOLD+" | | | | | . \\ | | (__| | / __/| |_| / __/|__ _|"+debug::output::ENDCOLOR, debug::Priority::PERFORMANCE, debug::LineMode::NEW, stream)