431{
432
433 std::vector<std::vector<VertexInfo> >verticesPerSeam;
434
435
436
437 std::vector<std::list<VertexInfo> > VVSeam(
V.
rows());
438 Eigen::MatrixXi F_hit = Eigen::MatrixXi::Zero(
F.
rows(), 3);
439 for (
unsigned int f=0; f<
F.
rows();f++)
440 {
441 int f0 = f;
442 for(int k0=0; k0<3; k0++){
444 if(f1 == -1)
445 continue;
446
448 if (seam && F_hit(f0,k0) == 0)
449 {
451 int v1 =
F(f0, (k0+1)%3);
453 VVSeam[v0].push_back(VertexInfo(v1, f0, k0, f1, k1));
454 VVSeam[v1].push_back(VertexInfo(v0, f0, k0, f1, k1));
455 F_hit(f0, k0) = 1;
456 F_hit(f1, k1) = 1;
457 }
458 }
459 }
460
461
462 std::vector<int> startVertexIndices;
463 std::vector<bool> isStartVertex(
V.
rows());
464 for (
unsigned int i=0;i<
V.
rows();i++)
465 {
466 isStartVertex[i] = false;
467
469 {
470 startVertexIndices.push_back(i);
471 isStartVertex[i] = true;
472 }
473 }
474
475
476 for (unsigned int i=0;i<startVertexIndices.size();i++)
477 {
478 auto startVertexNeighbors = &VVSeam[startVertexIndices[i]];
479 const int neighborSize = startVertexNeighbors->size();
480
481
482
483 for (unsigned int j=0;j<neighborSize;j++)
484 {
485 std::vector<VertexInfo> thisSeam;
486
487
488 auto startVertex = VertexInfo(startVertexIndices[i], -1, -1, -1, -1);
489 auto currentVertex = startVertex;
490
491 thisSeam.push_back(currentVertex);
492
493
494 auto currentVertexNeighbors = startVertexNeighbors;
495 auto nextVertex = currentVertexNeighbors->front();
496 currentVertexNeighbors->pop_front();
497
498 auto prevVertex = startVertex;
499 while (true)
500 {
501
502 prevVertex = currentVertex;
503 currentVertex = nextVertex;
504 currentVertexNeighbors = &VVSeam[nextVertex.v];
505
506
507 thisSeam.push_back(currentVertex);
508
509
510 auto it = std::find(currentVertexNeighbors->begin(), currentVertexNeighbors->end(), prevVertex);
511 assert(it != currentVertexNeighbors->end());
512 currentVertexNeighbors->erase(it);
513
514 if (currentVertexNeighbors->size() == 1 && !isStartVertex[currentVertex.v])
515 {
516 nextVertex = currentVertexNeighbors->front();
517 currentVertexNeighbors->pop_front();
518 }
519 else
520 break;
521 }
522 verticesPerSeam.push_back(thisSeam);
523 }
524 }
525
526 return verticesPerSeam;
527}
constexpr auto size(const C &c) -> decltype(c.size())
Definition span.hpp:183