15 #ifndef _FIBERSURFACE_H
16 #define _FIBERSURFACE_H
19 #include <parallel/algorithm>
24 #ifdef withrangeDrivenOctree
25 #include <RangeDrivenOctree.h>
59 #ifdef withrangeDrivenOctree
60 template <
class dataTypeU,
class dataTypeV>
61 inline int buildOctree();
64 template <
class dataTypeU,
class dataTypeV>
66 const pair<double, double> &rangePoint0,
67 const pair<double, double> &rangePoint1,
68 const vector<int> &seedTetList,
69 const int &polygonEdgeId = 0)
const;
71 template <
class dataTypeU,
class dataTypeV>
73 const vector<pair<pair<double, double>, pair<double, double> > >
75 const vector<int> &seedTetList,
76 const vector<int> *edgeIdList = NULL)
const;
78 template <
class dataTypeU,
class dataTypeV>
80 const pair<double, double> &rangePoint0,
81 const pair<double, double> &rangePoint1,
82 const int &polygonEdgeId = 0)
const;
84 template <
class dataTypeU,
class dataTypeV>
87 template <
class dataTypeU,
class dataTypeV>
89 const bool &mergeDuplicatedVertices =
false,
90 const bool &removeSmallEdges =
false,
91 const bool &edgeFlips =
false,
92 const bool &intersectionRemesh =
false);
94 #ifdef withrangeDrivenOctree
95 inline int flushOctree(){
96 return octree_.flush();
100 template <
class dataTypeU,
class dataTypeV>
102 const pair<double, double> &rangePoint0,
103 const pair<double, double> &rangePoint1,
104 const int &polygonEdgeId = 0)
const;
139 inline int setPolygon(
const vector<pair<pair<double, double>,
140 pair<double, double> > > *polygon){
168 vector<Triangle> *triangleList){
171 if((polygonEdgeId >= 0)
181 vector<Vertex> *vertexList){
184 if((polygonEdgeId >= 0)
201 pair<double, double>
uv_[3];
207 template <
class dataTypeU,
class dataTypeV>
210 const int &localEdgeId0,
const double &t0,
211 const double &u0,
const double &v0,
212 const int &localEdgeId1,
const double &t1,
213 const double &u1,
const double &v1,
214 const int &localEdgeId2,
const double &t2,
215 const double &u2,
const double &v2,
216 vector<vector<double> > &basePoints,
217 vector<pair<double, double> > &basePointProections,
218 vector<double> &basePointParameterization,
219 vector<pair<int, int> > &baseEdges)
const;
221 template <
class dataTypeU,
class dataTYpeV>
222 inline int computeCase0(
const int &polygonEdgeId,
const int &tetId,
223 const int &localEdgeId0,
const double &t0,
224 const double &u0,
const double &v0,
225 const int &localEdgeId1,
const double &t1,
226 const double &u1,
const double &v1,
227 const int &localEdgeId2,
const double &t2,
228 const double &u2,
const double &v2)
const;
230 template <
class dataTypeU,
class dataTYpeV>
231 inline int computeCase1(
const int &polygonEdgeId,
const int &tetId,
232 const int &localEdgeId0,
const double &t0,
233 const double &u0,
const double &v0,
234 const int &localEdgeId1,
const double &t1,
235 const double &u1,
const double &v1,
236 const int &localEdgeId2,
const double &t2,
237 const double &u2,
const double &v2)
const;
239 template <
class dataTypeU,
class dataTYpeV>
240 inline int computeCase2(
const int &polygonEdgeId,
const int &tetId,
241 const int &localEdgeId0,
const double &t0,
242 const double &u0,
const double &v0,
243 const int &localEdgeId1,
const double &t1,
244 const double &u1,
const double &v1,
245 const int &localEdgeId2,
const double &t2,
246 const double &u2,
const double &v2)
const;
248 template <
class dataTypeU,
class dataTYpeV>
249 inline int computeCase3(
const int &polygonEdgeId,
const int &tetId,
250 const int &localEdgeId0,
const double &t0,
251 const double &u0,
const double &v0,
252 const int &localEdgeId1,
const double &t1,
253 const double &u1,
const double &v1,
254 const int &localEdgeId2,
const double &t2,
255 const double &u2,
const double &v2)
const;
257 template <
class dataTypeU,
class dataTYpeV>
258 inline int computeCase4(
const int &polygonEdgeId,
const int &tetId,
259 const int &localEdgeId0,
const double &t0,
260 const double &u0,
const double &v0,
261 const int &localEdgeId1,
const double &t1,
262 const double &u1,
const double &v1,
263 const int &localEdgeId2,
const double &t2,
264 const double &u2,
const double &v2)
const;
266 #ifdef withrangeDrivenOctree
267 template <
class dataTypeU,
class dataTypeV>
268 inline int computeSurfaceWithOctree(
269 const pair<double, double> &rangePoint0,
270 const pair<double, double> &rangePoint1,
271 const int &polygonEdgeId)
const;
275 const pair<double, double> &intersection,
276 const vector<vector<IntersectionTriangle> > &tetIntersections,
277 vector<double> &pA, vector<double> &pB,
int &pivotVertexId,
278 bool &edgeFiber)
const;
281 const int &tetId,
const int &triangleId0,
const int &triangleId1,
282 const int &polygonEdgeId0,
const int &polygonEdgeId1,
283 const pair<double, double> &intersection,
284 int &newVertexNumber,
int &newTriangleNumber,
285 vector<vector<IntersectionTriangle> > &tetIntersections,
286 vector<vector<Vertex> > &tetNewVertices)
const;
289 const int &tetId,
const int &triangleId,
const int &polygonEdgeId,
290 const pair<double, double> &intersection,
291 const vector<double> &pA,
const vector<double> &pB,
292 const int &pivotVertexId,
293 int &newVertexNumber,
int &newTriangleNumber,
294 vector<vector<IntersectionTriangle> > &tetIntersections,
295 vector<vector<Vertex> > &tetNewVertices)
const;
298 const int &tetId,
const int &triangleId,
299 const int &vertexId0,
const int &vertexId1,
const int &vertexId2,
300 const vector<vector<Vertex> > &tetNewVertices,
301 int &newTriangleNumber,
302 vector<vector<IntersectionTriangle> > &tetIntersections,
303 const pair<double, double> *intersection = NULL)
const;
307 int flipEdges(vector<pair<int, int> > &triangles)
const;
310 const int &triangleId0,
const int &triangleId1,
311 const vector<vector<IntersectionTriangle> > &tetIntersections)
const;
314 const vector<vector<IntersectionTriangle> > &tetIntersections,
315 pair<double, double> &extremity0,
316 pair<double, double> &extremity1)
const;
319 const double *p0,
const double *p1,
const double *p2)
const;
322 const vector<double> &p0,
323 const pair<double, double> &uv0,
325 const vector<double> &p1,
326 const pair<double, double> &uv1,
332 const int &source,
const int &destination,
333 const int &pivotVertexId,
334 const vector<pair<int, int> > &starNeighbors)
const;
337 const int &edgeVertexId0,
const int &edgeVertexId1,
338 const int &otherVertexId0,
const int &otherVertexId1)
const;
341 const int &tetId,
const int &triangleId,
342 const vector<vector<IntersectionTriangle> > &tetIntersections,
343 const vector<vector<Vertex> > &tetNewVertices,
344 const int &vertexId0,
const int &vertexId1,
const int &vertexId2)
const{
346 vector<vector<double> > points(3);
347 for(
int i = 0; i < 3; i++){
348 int vertexId = vertexId0;
349 if(i == 1) vertexId = vertexId1;
350 if(i == 2) vertexId = vertexId2;
354 for(
int j = 0; j < 3; j++){
356 tetIntersections[tetId][triangleId].p_[vertexId][j];
360 for(
int j = 0; j < 3; j++){
361 points[i][j] = tetNewVertices[tetId][(-vertexId) - 1].p_[j];
367 points[0].data(), points[1].data(), points[2].data());
370 int mergeEdges(
const double &distanceThreshold)
const;
374 template <
class dataTypeU,
class dataTypeV>
378 const vector<pair<double, double> > &uv,
379 const vector<double> &t,
385 const vector<pair<int, int> > &triangles,
386 const double &distanceThreshold)
const;
395 const vector<vector<int> >
401 const vector<pair<pair<double, double>, pair<double, double> > >
405 vector<vector<Vertex> *>
407 vector<vector<Triangle> *>
410 #ifdef withrangeDrivenOctree
411 RangeDrivenOctree octree_;
416 #ifdef withrangeDrivenOctree
417 template <
class dataTypeU,
class dataTypeV>
418 inline int FiberSurface::buildOctree(){
430 octree_.build<dataTypeU, dataTypeV>();
437 template <
class dataTypeU,
class dataTypeV>
439 const int &localEdgeId0,
const double &t0,
440 const double &u0,
const double &v0,
441 const int &localEdgeId1,
const double &t1,
442 const double &u1,
const double &v1,
443 const int &localEdgeId2,
const double &t2,
444 const double &u2,
const double &v2,
445 vector<vector<double> > &basePoints,
446 vector<pair<double, double> > &basePointProjections,
447 vector<double> &basePointParameterization,
448 vector<pair<int, int> > &baseEdges)
const{
450 basePoints.resize(3);
451 basePointProjections.resize(3);
452 basePointParameterization.resize(3);
455 for(
int i = 0; i < 3; i++){
457 int vertexId0, vertexId1;
465 + edgeImplicitEncoding_[2*localEdgeId0 + 1]];
466 basePointProjections[i].first = u0;
467 basePointProjections[i].second = v0;
468 basePointParameterization[i] = t0;
473 + edgeImplicitEncoding_[2*localEdgeId1]];
475 + edgeImplicitEncoding_[2*localEdgeId1 + 1]];
476 basePointProjections[i].first = u1;
477 basePointProjections[i].second = v1;
478 basePointParameterization[i] = t1;
483 + edgeImplicitEncoding_[2*localEdgeId2]];
485 + edgeImplicitEncoding_[2*localEdgeId2 + 1]];
486 basePointProjections[i].first = u2;
487 basePointProjections[i].second = v2;
488 basePointParameterization[i] = t2;
492 vector<double> baryCentrics;
493 vector<double> p0(2), p1(2), p(2);
494 p0[0] = ((dataTypeU *)
uField_)[vertexId0];
495 p0[1] = ((dataTypeV *)
vField_)[vertexId0];
496 p1[0] = ((dataTypeU *)
uField_)[vertexId1];
497 p1[1] = ((dataTypeV *)
vField_)[vertexId1];
498 p[0] = basePointProjections[i].first;
499 p[1] = basePointProjections[i].second;
501 p0.data(), p1.data(), p.data(), baryCentrics, 2);
503 basePoints[i].resize(3);
504 for(
int j = 0; j < 3; j++){
506 baryCentrics[0]*
pointSet_[3*vertexId0 + j]
507 + baryCentrics[1]*
pointSet_[3*vertexId1 + j];
510 if(vertexId0 < vertexId1){
511 baseEdges[i] = pair<int, int>(vertexId0, vertexId1);
514 baseEdges[i] = pair<int, int>(vertexId1, vertexId0);
521 template<
class dataTypeU,
class dataTypeV>
523 const int &polygonEdgeId,
const int &tetId,
524 const int &localEdgeId0,
const double &t0,
525 const double &u0,
const double &v0,
526 const int &localEdgeId1,
const double &t1,
527 const double &u1,
const double &v1,
528 const int &localEdgeId2,
const double &t2,
529 const double &u2,
const double &v2)
const{
550 for(
int i = 0; i < 3; i++){
553 vertexId + i].isIntersectionPoint_ =
false;
557 for(
int i = 0; i < 3; i++){
559 int vertexId0, vertexId1;
566 + edgeImplicitEncoding_[2*localEdgeId0 + 1]];
574 + edgeImplicitEncoding_[2*localEdgeId1]];
576 + edgeImplicitEncoding_[2*localEdgeId1 + 1]];
584 + edgeImplicitEncoding_[2*localEdgeId2]];
586 + edgeImplicitEncoding_[2*localEdgeId2 + 1]];
593 vector<double> baryCentrics;
594 vector<double> p0(2), p1(2), p(2);
595 p0[0] = ((dataTypeU *)
uField_)[vertexId0];
596 p0[1] = ((dataTypeV *)
vField_)[vertexId0];
597 p1[0] = ((dataTypeU *)
uField_)[vertexId1];
598 p1[1] = ((dataTypeV *)
vField_)[vertexId1];
602 p0.data(), p1.data(), p.data(), baryCentrics, 2);
604 for(
int j = 0; j < 3; j++){
606 baryCentrics[0]*
pointSet_[3*vertexId0 + j]
607 + baryCentrics[1]*
pointSet_[3*vertexId1 + j];
610 if(vertexId0 < vertexId1)
612 = pair<int, int>(vertexId0, vertexId1);
615 = pair<int, int>(vertexId1, vertexId0);
622 template <
class dataTypeU,
class dataTypeV>
624 const int &polygonEdgeId,
const int &tetId,
625 const int &localEdgeId0,
const double &t0,
626 const double &u0,
const double &v0,
627 const int &localEdgeId1,
const double &t1,
628 const double &u1,
const double &v1,
629 const int &localEdgeId2,
const double &t2,
630 const double &u2,
const double &v2)
const{
636 for(
int i = 0; i < 5; i++){
639 vertexId + i].isIntersectionPoint_ =
false;
641 = pair<int, int>(-1, -1);
648 for(
int i = 0; i < 3; i++){
658 triangleId + i].vertexIds_[0] = vertexId;
660 + i].vertexIds_[1] = vertexId + 1;
662 triangleId + i].vertexIds_[2] = vertexId + 2;
666 triangleId + i].vertexIds_[0] = vertexId + 1;
668 triangleId + i].vertexIds_[1] = vertexId + 2;
670 triangleId + i].vertexIds_[2] = vertexId + 3;
674 triangleId + i].vertexIds_[0] = vertexId + 2;
676 triangleId + i].vertexIds_[1] = vertexId + 3;
678 triangleId + i].vertexIds_[2] = vertexId + 4;
684 vector<vector<double> > basePoints(3);
685 vector<pair<double, double> > basePointProjections(3);
686 vector<double> basePointParameterization(3);
687 vector<pair<int, int> > baseEdges(3);
689 computeBaseTriangle<dataTypeU, dataTypeV>(tetId,
690 localEdgeId0, t0, u0, v0,
691 localEdgeId1, t1, u1, v1,
692 localEdgeId2, t2, u2, v2,
693 basePoints, basePointProjections, basePointParameterization, baseEdges);
696 int pivotVertexId = -1;
698 if((t0 >= 0)&&(t0 <= 1)){
701 if((t1 >= 0)&&(t1 <= 1)){
704 if((t2 >= 0)&&(t2 <= 1)){
709 for(
int i = 0; i < 5; i++){
711 int vertexId0, vertexId1;
716 for(
int j = 0; j < 3; j++){
718 basePoints[pivotVertexId][j];
722 basePointParameterization[pivotVertexId];
724 basePointProjections[pivotVertexId];
726 baseEdges[pivotVertexId];
736 vertexId0 = pivotVertexId;
737 vertexId1 = (pivotVertexId + 2)%3;
738 if(basePointParameterization[(pivotVertexId + 2)%3] > 1){
750 vertexId0 = pivotVertexId;
751 vertexId1 = (pivotVertexId + 1)%3;
752 if(basePointParameterization[(pivotVertexId + 1)%3] > 1){
761 vertexId0 = (pivotVertexId + 2)%3;
762 vertexId1 = (pivotVertexId + 1)%3;
763 if(basePointParameterization[(pivotVertexId + 2)%3] < 0){
772 vertexId0 = (pivotVertexId + 2)%3;
773 vertexId1 = (pivotVertexId + 1)%3;
774 if(basePointParameterization[(pivotVertexId + 2)%3] < 0){
786 basePoints[vertexId0],
787 basePointProjections[vertexId0],
788 basePointParameterization[vertexId0],
789 basePoints[vertexId1],
790 basePointProjections[vertexId1],
791 basePointParameterization[vertexId1],
805 template <
class dataTypeU,
class dataTypeV>
807 const int &polygonEdgeId,
const int &tetId,
808 const int &localEdgeId0,
const double &t0,
809 const double &u0,
const double &v0,
810 const int &localEdgeId1,
const double &t1,
811 const double &u1,
const double &v1,
812 const int &localEdgeId2,
const double &t2,
813 const double &u2,
const double &v2)
const{
819 for(
int i = 0; i < 4; i++){
822 vertexId + i].isIntersectionPoint_ =
false;
824 = pair<int, int>(-1, -1);
831 for(
int i = 0; i < 2; i++){
840 triangleId + i].vertexIds_[0] = vertexId;
842 triangleId + i].vertexIds_[1] = vertexId + 1;
844 triangleId + i].vertexIds_[2] = vertexId + 2;
848 triangleId + i].vertexIds_[0] = vertexId + 1;
850 triangleId + i].vertexIds_[1] = vertexId + 3;
852 triangleId + i].vertexIds_[2] = vertexId + 2;
857 vector<vector<double> > basePoints(3);
858 vector<pair<double, double> > basePointProjections(3);
859 vector<double> basePointParameterization(3);
860 vector<pair<int, int> > baseEdges(3);
862 computeBaseTriangle<dataTypeU, dataTypeV>(tetId,
863 localEdgeId0, t0, u0, v0,
864 localEdgeId1, t1, u1, v1,
865 localEdgeId2, t2, u2, v2,
866 basePoints, basePointProjections, basePointParameterization, baseEdges);
869 bool isPivotPositive =
false;
870 int pivotVertexId = -1;
872 if(((t0 < 0)&&((t1 < 0)||(t2 < 0)))
873 ||((t1 < 0)&&((t0 < 0)||(t2 < 0)))
874 ||((t2 < 0)&&((t1 < 0)||(t0 < 0)))){
875 isPivotPositive =
true;
903 for(
int i = 0; i < 4; i++){
905 int vertexId0, vertexId1;
914 vertexId0 = pivotVertexId;
915 vertexId1 = (pivotVertexId + 2)%3;
926 vertexId0 = pivotVertexId;
927 vertexId1 = (pivotVertexId + 1)%3;
938 vertexId0 = pivotVertexId;
939 vertexId1 = (pivotVertexId + 2)%3;
950 vertexId0 = pivotVertexId;
951 vertexId1 = (pivotVertexId + 1)%3;
962 basePoints[vertexId0],
963 basePointProjections[vertexId0],
964 basePointParameterization[vertexId0],
965 basePoints[vertexId1],
966 basePointProjections[vertexId1],
967 basePointParameterization[vertexId1],
980 template <
class dataTypeU,
class dataTypeV>
982 const int &polygonEdgeId,
const int &tetId,
983 const int &localEdgeId0,
const double &t0,
984 const double &u0,
const double &v0,
985 const int &localEdgeId1,
const double &t1,
986 const double &u1,
const double &v1,
987 const int &localEdgeId2,
const double &t2,
988 const double &u2,
const double &v2)
const{
994 for(
int i = 0; i < 3; i++){
997 vertexId + i].isIntersectionPoint_ =
false;
999 = pair<int, int>(-1, -1);
1020 vector<vector<double> > basePoints(3);
1021 vector<pair<double, double> > basePointProjections(3);
1022 vector<double> basePointParameterization(3);
1023 vector<pair<int, int> > baseEdges(3);
1025 computeBaseTriangle<dataTypeU, dataTypeV>(tetId,
1026 localEdgeId0, t0, u0, v0,
1027 localEdgeId1, t1, u1, v1,
1028 localEdgeId2, t2, u2, v2,
1029 basePoints, basePointProjections, basePointParameterization, baseEdges);
1032 bool isPivotPositive =
false;
1033 int pivotVertexId = -1;
1035 if((t0 <= 1)&&(t0 >= 0)){
1040 isPivotPositive =
true;
1042 if((t1 <= 1)&&(t1 >= 0)){
1047 isPivotPositive =
true;
1049 if((t2 <= 1)&&(t2 >= 0)){
1054 isPivotPositive =
true;
1058 for(
int i = 0; i < 3; i++){
1060 int vertexId0, vertexId1;
1065 for(
int j = 0; j < 3; j++){
1067 basePoints[pivotVertexId][j];
1071 basePointParameterization[pivotVertexId];
1073 basePointProjections[pivotVertexId];
1075 baseEdges[pivotVertexId];
1082 vertexId0 = pivotVertexId;
1083 vertexId1 = (pivotVertexId + 1)%3;
1093 vertexId0 = pivotVertexId;
1094 vertexId1 = (pivotVertexId + 2)%3;
1104 basePoints[vertexId0],
1105 basePointProjections[vertexId0],
1106 basePointParameterization[vertexId0],
1107 basePoints[vertexId1],
1108 basePointProjections[vertexId1],
1109 basePointParameterization[vertexId1],
1123 template <
class dataTypeU,
class dataTypeV>
1125 const int &polygonEdgeId,
const int &tetId,
1126 const int &localEdgeId0,
const double &t0,
1127 const double &u0,
const double &v0,
1128 const int &localEdgeId1,
const double &t1,
1129 const double &u1,
const double &v1,
1130 const int &localEdgeId2,
const double &t2,
1131 const double &u2,
const double &v2)
const{
1137 for(
int i = 0; i < 4; i++){
1140 vertexId + i].isIntersectionPoint_ =
false;
1142 = pair<int, int>(-1, -1);
1149 for(
int i = 0; i < 2; i++){
1158 triangleId + i].vertexIds_[0] = vertexId;
1160 triangleId + i].vertexIds_[1] = vertexId + 1;
1162 triangleId + i].vertexIds_[2] = vertexId + 2;
1166 triangleId + i].vertexIds_[0] = vertexId + 1;
1168 triangleId + i].vertexIds_[1] = vertexId + 3;
1170 triangleId + i].vertexIds_[2] = vertexId + 2;
1175 vector<vector<double> > basePoints(3);
1176 vector<pair<double, double> > basePointProjections(3);
1177 vector<double> basePointParameterization(3);
1178 vector<pair<int, int> > baseEdges(3);
1180 computeBaseTriangle<dataTypeU, dataTypeV>(tetId,
1181 localEdgeId0, t0, u0, v0,
1182 localEdgeId1, t1, u1, v1,
1183 localEdgeId2, t2, u2, v2,
1184 basePoints, basePointProjections, basePointParameterization, baseEdges);
1187 bool isPivotPositive =
false;
1188 int pivotVertexId = -1;
1192 isPivotPositive =
true;
1196 isPivotPositive =
false;
1201 isPivotPositive =
true;
1205 isPivotPositive =
false;
1209 isPivotPositive =
true;
1213 isPivotPositive =
false;
1217 for(
int i = 0; i < 4; i++){
1219 int vertexId0, vertexId1;
1227 vertexId0 = pivotVertexId;
1228 vertexId1 = (pivotVertexId + 2)%3;
1238 vertexId0 = pivotVertexId;
1239 vertexId1 = (pivotVertexId + 1)%3;
1249 basePoints[vertexId0],
1250 basePointProjections[vertexId0],
1251 basePointParameterization[vertexId0],
1252 basePoints[vertexId1],
1253 basePointProjections[vertexId1],
1254 basePointParameterization[vertexId1],
1265 for(
int j = 0; j < 3; j++){
1267 basePoints[(pivotVertexId + 2)%3][j];
1271 basePointParameterization[(pivotVertexId + 2)%3];
1273 basePointProjections[(pivotVertexId + 2)%3];
1275 baseEdges[(pivotVertexId + 2)%3];
1279 for(
int j = 0; j < 3; j++){
1281 basePoints[(pivotVertexId + 1)%3][j];
1284 basePointParameterization[(pivotVertexId + 1)%3];
1286 basePointProjections[(pivotVertexId + 1)%3];
1288 baseEdges[(pivotVertexId + 1)%3];
1297 template <
class dataTypeU,
class dataTypeV>
1299 const pair<double, double> &rangePoint0,
1300 const pair<double, double> &rangePoint1,
1301 const vector<int> &seedTetList,
1302 const int &polygonEdgeId)
const{
1304 #ifndef withKamikaze
1324 queue<int> tetQueue;
1327 for(
int i = 0; i < (int) seedTetList.size(); i++){
1328 tetQueue.push(seedTetList[i]);
1331 int createdVertices = 0;
1335 int tetId = tetQueue.front();
1338 if(!visitedTets[tetId]){
1340 createdVertices = processTetrahedron<dataTypeU, dataTypeV>(
1341 tetId, rangePoint0, rangePoint1, polygonEdgeId);
1343 if(createdVertices){
1345 for(
int i = 0; i < (int) (*
tetNeighbors_)[tetId].size(); i++){
1351 visitedTets[tetId] =
true;
1354 }
while(tetQueue.size());
1360 const vector<pair<pair<double, double>, pair<double, double> > > &edgeList,
1361 const vector<int> &seedTetList,
1362 const vector<int> *edgeIdList)
const{
1364 #ifndef withKamikaze
1384 queue<int> tetQueue;
1387 for(
int i = 0; i < (int) seedTetList.size(); i++){
1388 tetQueue.push(seedTetList[i]);
1391 int createdVertices = 0;
1395 int tetId = tetQueue.front();
1398 if(!visitedTets[tetId]){
1400 vector<vector<int> > threadedTetQueue(edgeList.size());
1402 #pragma omp parallel for num_threads(threadNumber_)
1404 for(
int i = 0; i < (int) edgeList.size(); i++){
1406 int polygonEdgeId = 0;
1409 polygonEdgeId = (*edgeIdList)[i];
1412 createdVertices = processTetrahedron<dataTypeU, dataTypeV>(
1418 if(createdVertices){
1420 for(
int j = 0; j < (int) (*
tetNeighbors_)[tetId].size(); j++){
1428 visitedTets[tetId] =
true;
1430 for(
int i = 0; i < (int) threadedTetQueue.size(); i++){
1431 for(
int j = 0; j < (int) threadedTetQueue[i].size(); j++){
1432 tetQueue.push(threadedTetQueue[i][j]);
1437 }
while(tetQueue.size());
1442 template <
class dataTypeU,
class dataTypeV>
1444 const pair<double, double> &rangePoint0,
1445 const pair<double, double> &rangePoint1,
1446 const int &polygonEdgeId)
const {
1448 #ifndef withKamikaze
1466 #pragma omp parallel for num_threads(threadNumber_)
1470 processTetrahedron<dataTypeU, dataTypeV>(
1471 i, rangePoint0, rangePoint1, polygonEdgeId);
1477 template <
class dataTypeU,
class dataTypeV>
1480 #ifndef withKamikaze
1501 #ifdef withrangeDrivenOctree
1502 if(!octree_.empty()){
1505 #pragma omp parallel for num_threads(threadNumber_)
1509 computeSurfaceWithOctree<dataTypeU, dataTypeV>(
1510 (*polygon_)[i].first, (*polygon_)[i].second, i);
1516 #pragma omp parallel for num_threads(threadNumber_)
1520 computeSurface<dataTypeU, dataTypeV>(
1521 (*polygon_)[i].first, (*polygon_)[i].second, i);
1527 #pragma omp parallel for num_threads(threadNumber_)
1531 computeSurface<dataTypeU, dataTypeV>(
1532 (*polygon_)[i].first, (*polygon_)[i].second, i);
1536 finalize<dataTypeU, dataTypeV>(
pointSnapping_, NULL, NULL, NULL);
1540 msg <<
"[FiberSurface] FiberSurface extracted in "
1543 <<
" thread(s))" << endl;
1550 #ifdef withrangeDrivenOctree
1551 template <
class dataTypeU,
class dataTypeV>
1552 inline int FiberSurface::computeSurfaceWithOctree(
1553 const pair<double, double> &rangePoint0,
1554 const pair<double, double> &rangePoint1,
1555 const int &polygonEdgeId)
const {
1557 #ifndef withKamikaze
1574 vector<int> tetList;
1575 octree_.rangeSegmentQuery(rangePoint0, rangePoint1, tetList);
1578 #pragma omp parallel for num_threads(threadNumber_)
1580 for(
int i = 0; i < (int) tetList.size(); i++){
1581 processTetrahedron<dataTypeU, dataTypeV>(
1582 tetList[i], rangePoint0, rangePoint1, polygonEdgeId);
1590 const bool &mergeDuplicatedVertices,
1591 const bool &removeSmallEdges,
1592 const bool &edgeFlips,
1593 const bool &intersectionRemesh){
1596 int fiberSurfaceVertexNumber = 0;
1601 (*globalVertexList_).resize(fiberSurfaceVertexNumber);
1602 fiberSurfaceVertexNumber = 0;
1608 (*globalVertexList_)[fiberSurfaceVertexNumber] =
1610 fiberSurfaceVertexNumber++;
1615 for(
int k = 0; k < 3; k++){
1629 if(intersectionRemesh){
1630 remeshIntersections<dataTypeU, dataTypeV>();
1633 if((mergeDuplicatedVertices)||(removeSmallEdges)){
1641 if(removeSmallEdges)
1652 template <
class dataTypeU,
class dataTypeV>
1654 const pair<double, double> &rangePoint0,
1655 const pair<double, double> &rangePoint1,
1656 const int &polygonEdgeId)
const{
1658 double rangeEdge[2];
1659 rangeEdge[0] = rangePoint0.first - rangePoint1.first;
1660 rangeEdge[1] = rangePoint0.second - rangePoint1.second;
1662 double rangeNormal[2];
1663 rangeNormal[0] = -rangeEdge[1];
1664 rangeNormal[1] = rangeEdge[0];
1667 int upperNumber = 0;
1668 int lowerNumber = 0;
1669 int equalVertexLocalId = -1;
1671 for(
int i = 0; i < 4; i++){
1673 int vertexId =
tetList_[5*tetId + 1 + i];
1675 double projectedVertex[2];
1676 projectedVertex[0] = ((dataTypeU *)
uField_)[vertexId];
1677 projectedVertex[1] = ((dataTypeV *)
vField_)[vertexId];
1679 double vertexRangeEdge[2];
1680 vertexRangeEdge[0] = projectedVertex[0] - rangePoint0.first;
1681 vertexRangeEdge[1] = projectedVertex[1] - rangePoint0.second;
1683 d[i] = vertexRangeEdge[0]*rangeNormal[0]
1684 + vertexRangeEdge[1]*rangeNormal[1];
1686 if(fabs(d[i]) < pow(10, -DBL_DIG))
1695 equalVertexLocalId = i;
1700 if(!((upperNumber == 0)||(lowerNumber == 0))){
1703 vector<bool> lonelyVertex(4,
false);
1704 vector<int> triangleEdgeNumbers(2, 0);
1705 vector<vector<int> > triangleEdges(2);
1706 triangleEdges[0].resize(3, -1);
1707 triangleEdges[1].resize(3, -1);
1716 int edgeCounter = 0;
1717 for(
int i = 0; i < 4; i++){
1732 for(
int j = jStart; j != jEnd; j += jStep){
1734 if(((d[i] > 0)&&(d[j] < 0))||((d[i] < 0)&&(d[j] > 0))){
1737 if(triangleEdgeNumbers[0] == 3){
1738 triangleEdges[1][triangleEdgeNumbers[1]] = edgeCounter;
1739 triangleEdgeNumbers[1]++;
1742 triangleEdges[0][triangleEdgeNumbers[0]] = edgeCounter;
1743 triangleEdgeNumbers[0]++;
1747 if((d[i] == 0)&&(d[j] == 0)){
1753 triangleEdges[0][triangleEdgeNumbers[0]] = edgeCounter;
1754 triangleEdgeNumbers[0]++;
1756 triangleEdges[0][triangleEdgeNumbers[0]] = edgeCounter;
1757 triangleEdgeNumbers[0]++;
1765 if(triangleEdges[1][0] != -1){
1766 if(triangleEdges[1][1] == -1){
1774 int forbiddenEdge = -1;
1775 switch(triangleEdges[1][0]){
1795 for(
int i = 0; i < (int) triangleEdges[0].size(); i++){
1796 if(triangleEdges[0][i] != forbiddenEdge){
1797 if(triangleEdges[1][1] != -1){
1798 triangleEdges[1][2] = triangleEdges[0][i];
1802 triangleEdges[1][1] = triangleEdges[0][i];
1810 for(
int i = 0; i < 2; i++){
1811 if(triangleEdges[i][0] != -1){
1813 if(triangleEdges[i][2] == -1){
1815 switch(equalVertexLocalId){
1818 triangleEdges[i][2] = 0;
1822 triangleEdges[i][2] = 5;
1836 pair<double, double> uv0, uv1;
1837 vector<pair<double, double> > uv(3);
1838 vector<double> t(3);
1840 int createdVertices = 0;
1842 for(
int i = 0; i < 2; i++){
1843 if(triangleEdges[i][0] != -1){
1846 int lowerVertexNumber = 0;
1847 int upperVertexNumber = 0;
1848 int greyVertexNumber = 0;
1850 for(
int j = 0; j < (int) triangleEdges[i].size(); j++){
1852 if((j < (
int) triangleEdges[i].size() - 1)
1853 &&(triangleEdges[i][j] == triangleEdges[i][j + 1])){
1869 ((j)&&(triangleEdges[i][j] != triangleEdges[i][j - 1]))){
1886 uv[j].first = uv0.first
1887 + (d0/(d0 - d1))*(uv1.first - uv0.first);
1888 uv[j].second = uv0.second
1889 + (d0/(d0 - d1))*(uv1.second - uv0.second);
1894 if(fabs(rangePoint1.first - rangePoint0.first)
1895 > fabs(rangePoint1.second - rangePoint0.second)){
1896 t[j] = (uv[j].first - rangePoint0.first)
1897 / (rangePoint1.first - rangePoint0.first);
1900 t[j] = (uv[j].second - rangePoint0.second)
1901 / (rangePoint1.second - rangePoint0.second);
1904 if((t[j] <= 1)&&(t[j] >= 0))
1907 lowerVertexNumber++;
1909 upperVertexNumber++;
1917 if(greyVertexNumber == 3){
1918 createdVertices += computeCase0<dataTypeU, dataTypeV>(
1919 polygonEdgeId, tetId,
1920 triangleEdges[i][0], t[0], uv[0].first, uv[0].second,
1921 triangleEdges[i][1], t[1], uv[1].first, uv[1].second,
1922 triangleEdges[i][2], t[2], uv[2].first, uv[2].second);
1924 else if(lowerVertexNumber == 3){
1927 else if(upperVertexNumber == 3){
1930 else if((lowerVertexNumber == 1)
1931 &&(upperVertexNumber == 1)
1932 &&(greyVertexNumber == 1)){
1933 createdVertices += computeCase1<dataTypeU, dataTypeV>(
1934 polygonEdgeId, tetId,
1935 triangleEdges[i][0], t[0], uv[0].first, uv[0].second,
1936 triangleEdges[i][1], t[1], uv[1].first, uv[1].second,
1937 triangleEdges[i][2], t[2], uv[2].first, uv[2].second);
1939 else if((lowerVertexNumber == 2)&&(upperVertexNumber == 1)){
1940 createdVertices += computeCase2<dataTypeU, dataTypeV>(
1941 polygonEdgeId, tetId,
1942 triangleEdges[i][0], t[0], uv[0].first, uv[0].second,
1943 triangleEdges[i][1], t[1], uv[1].first, uv[1].second,
1944 triangleEdges[i][2], t[2], uv[2].first, uv[2].second);
1946 else if((lowerVertexNumber == 1)&&(upperVertexNumber == 2)){
1947 createdVertices += computeCase2<dataTypeU, dataTypeV>(
1948 polygonEdgeId, tetId,
1949 triangleEdges[i][0], t[0], uv[0].first, uv[0].second,
1950 triangleEdges[i][1], t[1], uv[1].first, uv[1].second,
1951 triangleEdges[i][2], t[2], uv[2].first, uv[2].second);
1953 else if((greyVertexNumber == 1)
1954 &&(lowerVertexNumber == 2)){
1955 createdVertices += computeCase3<dataTypeU, dataTypeV>(
1956 polygonEdgeId, tetId,
1957 triangleEdges[i][0], t[0], uv[0].first, uv[0].second,
1958 triangleEdges[i][1], t[1], uv[1].first, uv[1].second,
1959 triangleEdges[i][2], t[2], uv[2].first, uv[2].second);
1961 else if((greyVertexNumber == 1)
1962 &&(upperVertexNumber == 2)){
1963 createdVertices += computeCase3<dataTypeU, dataTypeV>(
1964 polygonEdgeId, tetId,
1965 triangleEdges[i][0], t[0], uv[0].first, uv[0].second,
1966 triangleEdges[i][1], t[1], uv[1].first, uv[1].second,
1967 triangleEdges[i][2], t[2], uv[2].first, uv[2].second);
1969 else if((greyVertexNumber == 2)
1970 &&(lowerVertexNumber == 1)){
1971 createdVertices += computeCase4<dataTypeU, dataTypeV>(
1972 polygonEdgeId, tetId,
1973 triangleEdges[i][0], t[0], uv[0].first, uv[0].second,
1974 triangleEdges[i][1], t[1], uv[1].first, uv[1].second,
1975 triangleEdges[i][2], t[2], uv[2].first, uv[2].second);
1977 else if((greyVertexNumber == 2)
1978 &&(upperVertexNumber == 1)){
1979 createdVertices += computeCase4<dataTypeU, dataTypeV>(
1980 polygonEdgeId, tetId,
1981 triangleEdges[i][0], t[0], uv[0].first, uv[0].second,
1982 triangleEdges[i][1], t[1], uv[1].first, uv[1].second,
1983 triangleEdges[i][2], t[2], uv[2].first, uv[2].second);
1992 if((triangleEdges[1][0] != -1)&&(createdVertices > 3)){
1994 vector<int> createdVertexList(createdVertices);
1995 for(
int i = 0; i < (int) createdVertices; i++){
1996 createdVertexList[i] =
2000 vector<bool> snappedVertices(createdVertices,
false);
2002 for(
int i = 0; i < createdVertices; i++){
2004 vector<int> colinearVertices;
2005 if(!snappedVertices[i]){
2006 colinearVertices.push_back(i);
2007 for(
int j = 0; j < createdVertices; j++){
2008 if((i != j)&&(!snappedVertices[j])){
2013 createdVertexList[i]].t_ ==
2015 createdVertexList[j]].t_){
2016 colinearVertices.push_back(j);
2022 if((colinearVertices.size() == 4)||(colinearVertices.size() == 3)){
2027 pair<int, int> minPair;
2028 double minDistance = -1;
2029 for(
int j = 0; j < (int) colinearVertices.size(); j++){
2030 for(
int k = 0; k < (int) colinearVertices.size(); k++){
2035 createdVertexList[colinearVertices[j]]].p_,
2037 createdVertexList[colinearVertices[k]]].p_);
2051 if((minDistance < 0)||(distance < minDistance)){
2052 minDistance = distance;
2060 if((minDistance != -1)&&(minDistance < pow10(-DBL_DIG))){
2063 for(
int j = 0; j < (int) colinearVertices.size(); j++){
2064 if((j != minPair.first)&&(j != minPair.second)){
2067 for(
int k = 0; k < 3; k++){
2069 createdVertexList[colinearVertices[minPair.first]]].p_[k] =
2071 createdVertexList[colinearVertices[j]]].p_[k];
2074 createdVertexList[colinearVertices[minPair.first]]].uv_ =
2076 createdVertexList[colinearVertices[j]]].uv_;
2079 createdVertexList[colinearVertices[minPair.first]]].t_ =
2081 createdVertexList[colinearVertices[j]]].t_;
2085 colinearVertices[minPair.first]]].isBasePoint_ =
2087 createdVertexList[colinearVertices[j]]].isBasePoint_;
2091 colinearVertices[minPair.first]]].isIntersectionPoint_ =
2094 colinearVertices[j]]].isIntersectionPoint_;
2097 colinearVertices[j]]].meshEdge_.first != -1){
2100 colinearVertices[minPair.first]]].meshEdge_ =
2103 colinearVertices[j]]].meshEdge_;
2108 for(
int k = 0; k < 3; k++){
2110 createdVertexList[colinearVertices[minPair.second]]].p_[k]
2112 createdVertexList[colinearVertices[j]]].p_[k];
2115 createdVertexList[colinearVertices[minPair.second]]].uv_ =
2117 createdVertexList[colinearVertices[j]]].uv_;
2120 createdVertexList[colinearVertices[minPair.second]]].t_ =
2122 createdVertexList[colinearVertices[j]]].t_;
2126 colinearVertices[minPair.second]]].isBasePoint_ =
2128 createdVertexList[colinearVertices[j]]].isBasePoint_;
2132 colinearVertices[minPair.second]]].isIntersectionPoint_ =
2135 colinearVertices[j]]].isIntersectionPoint_;
2138 colinearVertices[j]]].meshEdge_.first != -1){
2141 colinearVertices[minPair.second]]].meshEdge_ =
2144 colinearVertices[j]]].meshEdge_;
2147 snappedVertices[colinearVertices[minPair.first]] =
true;
2148 snappedVertices[colinearVertices[minPair.second]] =
true;
2159 return createdVertices;
2165 template <
class dataTypeU,
class dataTypeV>
2168 #ifndef withKamikaze
2188 vector<vector<IntersectionTriangle> > tetIntersections(
tetNumber_);
2189 vector<vector<Vertex> > tetNewVertices(
tetNumber_);
2197 tetIntersections[tetId].resize(tetIntersections[tetId].size() + 1);
2199 tetIntersections[tetId].back().caseId_ =
2201 tetIntersections[tetId].back().polygonEdgeId_ = i;
2202 tetIntersections[tetId].back().triangleId_ = j;
2203 for(
int k = 0; k < 3; k++){
2204 tetIntersections[tetId].back().vertexIds_[k] =
2206 tetIntersections[tetId].back().uv_[k] =
2207 (*globalVertexList_)[
2208 tetIntersections[tetId].back().vertexIds_[k]].uv_;
2209 tetIntersections[tetId].back().t_[k] =
2210 (*globalVertexList_)[
2211 tetIntersections[tetId].back().vertexIds_[k]].t_;
2212 for(
int l = 0; l < 3; l++){
2213 tetIntersections[tetId].back().p_[k][l] =
2214 (*globalVertexList_)[
2215 tetIntersections[tetId].back().vertexIds_[k]].p_[l];
2218 tetIntersections[tetId].back().intersection_.first = -DBL_MAX;
2219 tetIntersections[tetId].back().intersection_.second = -DBL_MAX;
2223 vector<int> tetList;
2224 for(
int i = 0; i < (int) tetIntersections.size(); i++){
2225 if(tetIntersections[i].size() > 1)
2226 tetList.push_back(i);
2230 #pragma omp parallel for num_threads(threadNumber_)
2232 for(
int i = 0; i < (int) tetList.size(); i++){
2234 int tetId = tetList[i];
2238 int newTriangleNumber = 1;
2239 int newVertexNumber = 1;
2241 for(
int j = 0; j < (int) tetIntersections[tetId].size(); j++){
2245 msg <<
"[FiberSurface] Preventing an infinite loop!" << endl;
2246 msg <<
"[FiberSurface] More than 1000 re-meshed triangles in tet #"
2247 << tetId <<
" :(" << endl;
2248 msg <<
"[FiberSurface] Extra-thin triangles keep on intersecting?!"
2256 int originalTriangleNumber = (int) tetIntersections[tetId].size();
2258 for(
int k = 0; k < originalTriangleNumber; k++){
2260 int polygonEdgeId0 = tetIntersections[tetId][j].polygonEdgeId_;
2261 int polygonEdgeId1 = tetIntersections[tetId][k].polygonEdgeId_;
2263 if((j != k)&&(polygonEdgeId0 != polygonEdgeId1)){
2268 pair<double, double> edge0point0, edge0point1;
2271 edge0point0, edge0point1);
2274 pair<double, double> edge1point0, edge1point1;
2277 edge1point0, edge1point1);
2280 pair<double, double> intersection;
2281 bool hasIntersection =
2283 edge0point0.first, edge0point0.second,
2284 edge0point1.first, edge0point1.second,
2285 edge1point0.first, edge1point0.second,
2286 edge1point1.first, edge1point1.second,
2287 intersection.first, intersection.second);
2289 if((hasIntersection)
2302 polygonEdgeId0, polygonEdgeId1, intersection,
2303 newVertexNumber, newTriangleNumber,
2304 tetIntersections, tetNewVertices);
2312 for(
int i = 0; i < (int) tetNewVertices.size(); i++){
2313 for(
int j = 0; j < (int) tetNewVertices[i].size(); j++){
2315 int localId = (*globalVertexList_).size();
2316 tetNewVertices[i][j].localId_ = localId;
2317 (*globalVertexList_).push_back(tetNewVertices[i][j]);
2321 for(
int i = 0; i < (int) tetIntersections.size(); i++){
2323 for(
int j = 0; j < (int) tetIntersections[i].size(); j++){
2325 if(((tetIntersections[i][j].intersection_.first != -DBL_MAX)
2326 &&(tetIntersections[i][j].intersection_.second != -DBL_MAX))
2327 ||(tetIntersections[i][j].triangleId_ < 0)){
2329 int triangleId = tetIntersections[i][j].triangleId_;
2336 tetIntersections[i][j].polygonEdgeId_]).size();
2338 tetIntersections[i][j].polygonEdgeId_]).resize(triangleId + 1);
2340 tetIntersections[i][j].polygonEdgeId_]).back().tetId_ = i;
2342 tetIntersections[i][j].polygonEdgeId_]).back().caseId_ =
2343 tetIntersections[i][j].caseId_;
2346 for(
int k = 0; k < 3; k++){
2348 int vertexId = tetIntersections[i][j].vertexIds_[k];
2352 vertexId = tetNewVertices[i][-(vertexId + 1)].localId_;
2355 tetIntersections[i][j].polygonEdgeId_])[triangleId].vertexIds_[k]
2365 #endif // FIBERSURFACE_H
int setTetList(const long long int *tetList)
Definition: FiberSurface.h:152
int polygonEdgeId_
Definition: FiberSurface.h:198
int computeSurface()
Definition: FiberSurface.h:1478
int polygonEdgeId_
Definition: FiberSurface.h:52
bool pointSnapping_
Definition: FiberSurface.h:389
double p_[3]
Definition: FiberSurface.h:43
int computeCase4(const int &polygonEdgeId, const int &tetId, const int &localEdgeId0, const double &t0, const double &u0, const double &v0, const int &localEdgeId1, const double &t1, const double &u1, const double &v1, const int &localEdgeId2, const double &t2, const double &u2, const double &v2) const
Definition: FiberSurface.h:1124
int tetNumber_
Definition: FiberSurface.h:391
int setPointMergingThreshold(const double &threshold)
Definition: FiberSurface.h:124
pair< double, double > intersection_
Definition: FiberSurface.h:204
const void * uField_
Definition: FiberSurface.h:392
int finalize(const bool &mergeDuplicatedVertices=false, const bool &removeSmallEdges=false, const bool &edgeFlips=false, const bool &intersectionRemesh=false)
Definition: FiberSurface.h:1589
static int computeBarycentricCoordinates(const double *p0, const double *p1, const double *p, vector< double > &baryCentrics, const int &dimension=3)
Definition: Geometry.cpp:121
int edgeImplicitEncoding_[12]
Definition: FiberSurface.h:397
pair< double, double > uv_[3]
Definition: FiberSurface.h:201
int polygonEdgeId_
Definition: FiberSurface.h:39
bool isEdgeAngleCollapsible(const int &source, const int &destination, const int &pivotVertexId, const vector< pair< int, int > > &starNeighbors) const
Definition: FiberSurface.cpp:1080
int setPolygonEdgeNumber(const int &polygonEdgeNumber)
Definition: FiberSurface.h:145
const int msg(const char *msg, const int &debugLevel=infoMsg) const
Definition: Debug.cpp:67
static double distance(const double *p0, const double *p1, const int &dimension=3)
Definition: Geometry.cpp:347
int snapVertexBarycentrics(const double &distanceThreshold) const
Definition: FiberSurface.cpp:1636
Definition: FiberSurface.h:194
double p_[3][3]
Definition: FiberSurface.h:203
int vertexIds_[3]
Definition: FiberSurface.h:52
int tetId_
Definition: FiberSurface.h:52
int computeCase3(const int &polygonEdgeId, const int &tetId, const int &localEdgeId0, const double &t0, const double &u0, const double &v0, const int &localEdgeId1, const double &t1, const double &u1, const double &v1, const int &localEdgeId2, const double &t2, const double &u2, const double &v2) const
Definition: FiberSurface.h:981
int setTetNumber(const int &tetNumber)
Definition: FiberSurface.h:162
int vertexIds_[3]
Definition: FiberSurface.h:200
FiberSurface()
Definition: FiberSurface.cpp:88
const long long int * tetList_
Definition: FiberSurface.h:394
int setPointMerging(const bool &onOff)
Definition: FiberSurface.h:119
int setPolygon(const vector< pair< pair< double, double >, pair< double, double > > > *polygon)
Definition: FiberSurface.h:139
bool isBasePoint_
Definition: FiberSurface.h:38
int getNumberOfCommonVertices(const int &tetId, const int &triangleId0, const int &triangleId1, const vector< vector< IntersectionTriangle > > &tetIntersections) const
Definition: FiberSurface.cpp:129
const float * pointSet_
Definition: FiberSurface.h:393
int computeContour(const pair< double, double > &rangePoint0, const pair< double, double > &rangePoint1, const vector< int > &seedTetList, const int &polygonEdgeId=0) const
Definition: FiberSurface.h:1298
int mergeVertices(const double &distanceThreshold) const
Definition: FiberSurface.cpp:1374
struct wtfit::FiberSurface::_intersectionTriangle IntersectionTriangle
static bool isTriangleColinear(const double *p0, const double *p1, const double *p2, const double *tolerance=NULL)
Definition: Geometry.cpp:489
int pointNumber_
Definition: FiberSurface.h:391
virtual const int dMsg(ostream &stream, string msg, const int &debugLevel=infoMsg) const
Definition: Debug.cpp:52
int caseId_
Definition: FiberSurface.h:195
int computeCase1(const int &polygonEdgeId, const int &tetId, const int &localEdgeId0, const double &t0, const double &u0, const double &v0, const int &localEdgeId1, const double &t1, const double &u1, const double &v1, const int &localEdgeId2, const double &t2, const double &u2, const double &v2) const
Definition: FiberSurface.h:623
pair< int, int > meshEdge_
Definition: FiberSurface.h:42
int computeCase0(const int &polygonEdgeId, const int &tetId, const int &localEdgeId0, const double &t0, const double &u0, const double &v0, const int &localEdgeId1, const double &t1, const double &u1, const double &v1, const int &localEdgeId2, const double &t2, const double &u2, const double &v2) const
Definition: FiberSurface.h:522
int processTetrahedron(const int &tetId, const pair< double, double > &rangePoint0, const pair< double, double > &rangePoint1, const int &polygonEdgeId=0) const
Definition: FiberSurface.h:1653
double pointSnappingThreshold_
Definition: FiberSurface.h:399
int setTetNeighbors(const vector< vector< int > > *tetNeighbors)
Definition: FiberSurface.h:157
vector< Vertex > * globalVertexList_
Definition: FiberSurface.h:404
double getElapsedTime()
Definition: Os.h:359
FiberSurface processing package.
Definition: FiberSurface.h:31
pair< double, double > uv_
Definition: FiberSurface.h:45
int setTriangleList(const int &polygonEdgeId, vector< Triangle > *triangleList)
Definition: FiberSurface.h:167
int getTriangleRangeExtremities(const int &tetId, const int &triangleId, const vector< vector< IntersectionTriangle > > &tetIntersections, pair< double, double > &extremity0, pair< double, double > &extremity1) const
Definition: FiberSurface.cpp:972
const vector< vector< int > > * tetNeighbors_
Definition: FiberSurface.h:396
bool isIntersectionTriangleColinear(const int &tetId, const int &triangleId, const vector< vector< IntersectionTriangle > > &tetIntersections, const vector< vector< Vertex > > &tetNewVertices, const int &vertexId0, const int &vertexId1, const int &vertexId2) const
Definition: FiberSurface.h:340
int triangleId_
Definition: FiberSurface.h:197
int flipEdges() const
Definition: FiberSurface.cpp:712
bool isIntersectionPoint_
Definition: FiberSurface.h:38
int mergeEdges(const double &distanceThreshold) const
Definition: FiberSurface.cpp:1166
int computeTriangleIntersection(const int &tetId, const int &triangleId0, const int &triangleId1, const int &polygonEdgeId0, const int &polygonEdgeId1, const pair< double, double > &intersection, int &newVertexNumber, int &newTriangleNumber, vector< vector< IntersectionTriangle > > &tetIntersections, vector< vector< Vertex > > &tetNewVertices) const
Definition: FiberSurface.cpp:296
int setGlobalVertexList(vector< Vertex > *globalList)
Definition: FiberSurface.h:106
int computeBaseTriangle(const int &tetId, const int &localEdgeId0, const double &t0, const double &u0, const double &v0, const int &localEdgeId1, const double &t1, const double &u1, const double &v1, const int &localEdgeId2, const double &t2, const double &u2, const double &v2, vector< vector< double > > &basePoints, vector< pair< double, double > > &basePointProections, vector< double > &basePointParameterization, vector< pair< int, int > > &baseEdges) const
Definition: FiberSurface.h:438
int setInputField(const void *uField, const void *vField)
Definition: FiberSurface.h:111
double edgeCollapseThreshold_
Definition: FiberSurface.h:399
int setPointSet(const float *pointSet)
Definition: FiberSurface.h:134
int setPointNumber(const int &number)
Definition: FiberSurface.h:129
Minimalist debugging class.
Definition: Debug.h:39
static bool computeSegmentIntersection(const double &xA, const double &yA, const double &xB, const double &yB, const double &xC, const double &yC, const double &xD, const double &yD, double &x, double &y)
Definition: Geometry.cpp:251
int polygonEdgeNumber_
Definition: FiberSurface.h:391
int computeCase2(const int &polygonEdgeId, const int &tetId, const int &localEdgeId0, const double &t0, const double &u0, const double &v0, const int &localEdgeId1, const double &t1, const double &u1, const double &v1, const int &localEdgeId2, const double &t2, const double &u2, const double &v2) const
Definition: FiberSurface.h:806
bool isEdgeFlippable(const int &edgeVertexId0, const int &edgeVertexId1, const int &otherVertexId0, const int &otherVertexId1) const
Definition: FiberSurface.cpp:1127
int caseId_
Definition: FiberSurface.h:52
vector< vector< Vertex > * > polygonEdgeVertexLists_
Definition: FiberSurface.h:406
int setVertexList(const int &polygonEdgeId, vector< Vertex > *vertexList)
Definition: FiberSurface.h:180
~FiberSurface()
Definition: FiberSurface.cpp:125
int createNewIntersectionTriangle(const int &tetId, const int &triangleId, const int &vertexId0, const int &vertexId1, const int &vertexId2, const vector< vector< Vertex > > &tetNewVertices, int &newTriangleNumber, vector< vector< IntersectionTriangle > > &tetIntersections, const pair< double, double > *intersection=NULL) const
Definition: FiberSurface.cpp:641
bool hasDuplicatedVertices(const double *p0, const double *p1, const double *p2) const
Definition: FiberSurface.cpp:1043
double t_[3]
Definition: FiberSurface.h:202
int computeTriangleFiber(const int &tetId, const int &triangleId, const pair< double, double > &intersection, const vector< vector< IntersectionTriangle > > &tetIntersections, vector< double > &pA, vector< double > &pB, int &pivotVertexId, bool &edgeFiber) const
Definition: FiberSurface.cpp:166
const vector< pair< pair< double, double >, pair< double, double > > > * polygon_
Definition: FiberSurface.h:402
Definition: CommandLineParser.h:13
const void * vField_
Definition: FiberSurface.h:392
int interpolateBasePoints(const vector< double > &p0, const pair< double, double > &uv0, const double &t0, const vector< double > &p1, const pair< double, double > &uv1, const double &t1, const double &t, Vertex &v) const
Definition: FiberSurface.cpp:1058
int remeshIntersections() const
Definition: FiberSurface.h:2166
int localId_
Definition: FiberSurface.h:39
double t_
Definition: FiberSurface.h:43
int globalId_
Definition: FiberSurface.h:39
Definition: FiberSurface.h:35
Definition: FiberSurface.h:48
vector< vector< Triangle > * > polygonEdgeTriangleLists_
Definition: FiberSurface.h:408
int snapToBasePoint(const vector< vector< double > > &basePoints, const vector< pair< double, double > > &uv, const vector< double > &t, Vertex &v) const
Definition: FiberSurface.cpp:1605
int threadNumber_
Definition: Debug.h:108
int debugLevel_
Definition: Debug.h:108