303 std::vector<std::tuple<VectorLowerDim,VectorDim,std::pair<short int,short int>,std::map<VectorDim,std::set<std::pair<short int,short int>>,
CompareVectorsByComponent<double,dim,float>>,size_t ,
const T*
const>>
polygonPatchIntersection(
const std::vector<std::pair<VectorDim,const T* const>>& polyPoints,
const bool& intersectInternalNodes);
305 std::vector<std::tuple<VectorLowerDim,VectorDim,std::pair<short int,short int>,std::map<VectorDim,std::set<std::pair<short int,short int>>,
CompareVectorsByComponent<double,dim,float>>,size_t ,
const T*
const>>
polygonPatchIntersection(
const std::vector<std::pair<VectorLowerDim,const T* const>>& polyPoints,
const bool& intersectInternalNodes);
307 std::vector<std::tuple<VectorLowerDim,VectorDim,std::pair<short int,short int>,std::map<VectorDim,std::set<std::pair<short int,short int>>,
CompareVectorsByComponent<double,dim,float>>,size_t ,
const T*
const>>
polygonPatchIntersection(
const std::vector<std::pair<VectorDim,const T* const>>& polyPoints,
const bool& intersectInternalNodes,std::set<
const Polyhedron<dim,dim-1>*>& usedFaces);
309 std::vector<std::tuple<VectorLowerDim,VectorDim,std::pair<short int,short int>,std::map<VectorDim,std::set<std::pair<short int,short int>>,
CompareVectorsByComponent<double,dim,float>>,size_t ,
const T*
const>>
polygonPatchIntersection(
const std::vector<std::pair<VectorLowerDim,const T* const>>& polyPoints,
const bool& intersectInternalNodes,std::set<
const Polyhedron<dim,dim-1>*>& usedFaces);
312 std::vector<std::shared_ptr<PeriodicPlanePatch<dim>>>
filledPatches(
const std::vector<VectorDim>& patchShifts);
368std::vector<std::tuple<typename PeriodicGlidePlane<dim>::VectorLowerDim,
typename PeriodicGlidePlane<dim>::VectorDim,std::pair<short int,short int>,std::map<typename PeriodicGlidePlane<dim>::VectorDim,std::set<std::pair<short int,short int>>,
CompareVectorsByComponent<double,dim,float>>,size_t,
const T*
const>>
PeriodicGlidePlane<dim>::polygonPatchIntersection(
const std::vector<std::pair<VectorLowerDim, const T* const>>& polyPoints,
const bool& intersectInternalNodes,std::set<
const Polyhedron<dim,dim-1>*>& usedFaces)
370 std::vector<std::tuple<typename PeriodicGlidePlane<dim>::VectorLowerDim,
typename PeriodicGlidePlane<dim>::VectorDim,std::pair<short int,short int>, std::map<VectorDim,std::set<std::pair<short int,short int>>,
CompareVectorsByComponent<double,dim,float>> ,size_t,
const T*
const>> ppiPPedges;
373 if (polyPoints.size())
377 std::shared_ptr<PeriodicPlanePatch<dim>> lastPatch(
nullptr);
379 for (
size_t k = 0;
k < polyPoints.size(); ++
k)
382 if(patchFound.second)
384 lastPatch=patchBoundary.
getPatch(patchFound.first);
403 for (
size_t k = 0;
k < polyPoints.size(); ++
k)
405 std::vector<std::tuple<typename PeriodicGlidePlane<dim>::VectorLowerDim,
typename PeriodicGlidePlane<dim>::VectorDim,std::pair<short int,short int>,
const T*
const>> ppi;
407 std::vector<std::pair<short int,short int>> edgeVector;
408 std::vector<std::shared_ptr<PeriodicPlanePatch<dim>>> currentPatches;
410 currentPatches.push_back(lastPatch);
411 const auto startPoint(polyPoints[startNodeID+
k]);
412 const auto endPoint(
k == polyPoints.size() - 1 ? polyPoints[startNodeID] : polyPoints[startNodeID+
k + 1]);
413 if(startPoint.second->periodicPlanePatch() != endPoint.second->periodicPlanePatch() || intersectInternalNodes)
420 std::map<float,std::pair<VectorLowerDim,std::set<const PeriodicPlaneEdge<dim>*>>> crossdEdges;
426 if (ssd.isIntersecting(FLT_EPSILON))
428 PlaneSegmentIntersection<dim-1> psi(0.5*(*bndEdge->source+*bndEdge->sink),bndEdge->outNormal,startPoint.first,endPoint.first);
430 && !bndEdge->isPeriodicEdge)
432 for(
const auto& face : bndEdge->meshIntersection->faces)
434 const bool isTrimmingFace(face->periodicFacePair.second==
nullptr?
true : face->regionIDs!=face->periodicFacePair.second->regionIDs);
437 if(usedFaces.find(face)==usedFaces.end())
439 usedFaces.insert(face);
447 const auto interSegment(ssd.intersectionSegment());
448 for(
const auto& tup : interSegment)
450 const auto crossIter(crossdEdges.find(std::get<1>(tup)));
451 if(crossIter==crossdEdges.end())
453 std::set<const PeriodicPlaneEdge<dim>*> tempSet;
454 tempSet.insert(bndEdge);
455 crossdEdges.emplace(std::get<1>(tup),std::get<0>(tup),tempSet);
459 crossIter->second.second.insert(bndEdge);
465 if (crossdEdges.size() == 0)
467 ppi.emplace_back(endPoint.first, lastPatch->shift, std::make_pair(-1,-1), endPoint.second);
470 THERE IS
A PROBLEM HERE BACAUSE THIS IS THE ONLY BREAK FROM THE MAIN WHILE LOOP
471 HOWEVER, FOR
A TRMMING EDDE WE KEEP FINDING INTERSECTIONS AND WE NEVER GET HERE
477 switch (crossdEdges.size())
482 for(
const auto& crossdEdgePair : crossdEdges)
501 const auto& edge(*crossdEdges.begin());
502 const auto& edgePatchShift(edge.second->patch->shift);
504 ppi.emplace_back(edge.first, edgePatchShift, std::make_pair(edge.second->edgeID,-1),
nullptr);
505 edgeVector.push_back(std::make_pair(edge.second->edgeID,-1));
507 const auto edgeSetIter1(edgeMaps.find(edgePatchShift));
508 if (edgeSetIter1 == edgeMaps.end())
510 std::set<std::pair<short int,short int>> edgeSet;
511 edgeSet.insert(std::make_pair(edge.second->edgeID,-1));
512 edgeMaps.emplace(edgePatchShift, edgeSet);
516 edgeSetIter1->second.insert(std::make_pair(edge.second->edgeID,-1));
519 if(edge.second->isPeriodicEdge)
521 const VectorDim localShift(edgePatchShift + edge.second->deltaShift);
524 currentPatches.push_back(lastPatch);
525 assert(edge.second->twin);
526 ppi.emplace_back(edge.first, edge.second->twin->patch->shift, std::make_pair(edge.second->twin->edgeID,-1),
nullptr);
527 edgeVector.push_back(std::make_pair(edge.second->twin->edgeID,-1));
529 const auto edgeSetIter2(edgeMaps.find(edge.second->twin->patch->shift));
530 if (edgeSetIter2 == edgeMaps.end())
532 std::set<std::pair<short int,short int>> edgeSet;
533 edgeSet.insert(std::make_pair(edge.second->twin->edgeID,-1));
534 edgeMaps.emplace(edge.second->twin->patch->shift, edgeSet);
538 edgeSetIter2->second.insert(std::make_pair(edge.second->twin->edgeID,-1));
609 const auto& edge0(*crossdEdges.begin());
610 const auto& edge1(*crossdEdges.rbegin());
611 if( (edge0.first-edge1.first).norm()>FLT_EPSILON
612 || edge0.second==edge1.second
613 || edge0.second->patch!=edge1.second->patch
616 throw std::runtime_error(
"polygonPatchIntersection: two intersections are inconsistent.");
618 const auto& edgePatchShift(edge0.second->patch->shift);
620 ppi.emplace_back(edge0.first, edgePatchShift, std::make_pair(edge0.second->edgeID, edge1.second->edgeID),
nullptr);
621 edgeVector.push_back(std::make_pair(edge0.second->edgeID, edge1.second->edgeID));
623 const auto edgeSetIter1 (edgeMaps.find(edgePatchShift));
624 if (edgeSetIter1==edgeMaps.end())
626 std::set<std::pair<short int,short int>> edgeSet;
627 edgeSet.insert(std::make_pair(edge0.second->edgeID, edge1.second->edgeID));
628 edgeMaps.emplace(edgePatchShift,edgeSet);
632 edgeSetIter1->second.insert(std::make_pair(edge0.second->edgeID, edge1.second->edgeID));
636 lastPatch = patchBoundary.
patches().
getFromKey(edgePatchShift + edge0.second->deltaShift);
637 currentPatches.push_back(lastPatch);
638 lastPatch = patchBoundary.
patches().
getFromKey(edgePatchShift + edge1.second->deltaShift);
639 currentPatches.push_back(lastPatch);
640 const VectorDim localShift(edgePatchShift + edge0.second->deltaShift+edge1.second->deltaShift);
642 currentPatches.push_back(lastPatch);
643 assert(edge0.second->twin);
644 assert(edge1.second->twin);
645 assert((edge0.second->twin!=edge1.second->twin) &&
"Two intersection must be different after twinned link");
648 short int beginTwinEdgeID(-1);
649 short rbeginTwinEdgeID(-1);
651 if (edge0.second==edge1.second->prev)
653 assert(edge0.second->twin->prev->twin &&
"A twin in the diagonally opposite patch must exist");
654 assert(edge1.second->twin->next->twin &&
"A twin in the diagonally opposite patch must exist");
655 beginTwinEdgeID=edge0.second->twin->prev->twin->edgeID;
656 rbeginTwinEdgeID=edge1.second->twin->next->twin->edgeID;
658 else if (edge0.second==edge1.second->next)
660 assert(edge0.second->twin->next->twin &&
"A twin in the diagonally opposite patch must exist");
661 assert(edge1.second->twin->prev->twin &&
"A twin in the diagonally opposite patch must exist");
663 beginTwinEdgeID=edge0.second->twin->next->twin->edgeID;
664 rbeginTwinEdgeID=edge1.second->twin->prev->twin->edgeID;
668 assert(
false &&
"Edges must be consecutive");
671 assert(beginTwinEdgeID!=-1 &&
"A twin ID must exist");
672 assert(rbeginTwinEdgeID!=-1 &&
"A twin ID must exist");
674 ppi.emplace_back(edge0.first, localShift, std::make_pair(beginTwinEdgeID, rbeginTwinEdgeID),
nullptr);
675 edgeVector.push_back(std::make_pair(beginTwinEdgeID, rbeginTwinEdgeID));
677 const auto edgeSetIter2 (edgeMaps.find(localShift));
678 if (edgeSetIter2==edgeMaps.end())
680 std::set<std::pair<short int,short int>> edgeSet;
681 edgeSet.insert(std::make_pair(beginTwinEdgeID, rbeginTwinEdgeID));
682 edgeMaps.emplace(localShift,edgeSet);
686 edgeSetIter2->second.insert(std::make_pair(beginTwinEdgeID, rbeginTwinEdgeID));
696 std::cout<<
"crossdEdges.size()="<<crossdEdges.size()<<std::endl;
697 throw std::runtime_error(
"polygonPatchIntersection: at most two intersections are possible.");
823 if (lastPatch->contains(endPoint.first))
825 ppi.emplace_back(endPoint.first, lastPatch->shift, std::make_pair(-1,-1), endPoint.second);
833 ppi.emplace_back(endPoint.first, lastPatch->shift, std::make_pair(-1,-1), endPoint.second);
838 for (
const auto& ppiIter : ppi )
840 size_t edgesStillRemaining(0);
841 if (std::get<3>(ppiIter) ==
nullptr)
845 edgesStillRemaining = edgeVector.size() - crossCount;
847 ppiPPedges.emplace_back(std::get<0>(ppiIter), std::get<1>(ppiIter), std::get<2>(ppiIter), edgeMaps, edgesStillRemaining, std::get<3>(ppiIter));
849 if (edgeVector.size() != 0)
851 if ((edgeVector.size() - crossCount ) != 0)
853 std::cout<<
"Edge VectorSize "<<edgeVector.size()<<std::endl;
854 std::cout<<
"Cross count "<<crossCount<<std::endl;
856 assert((edgeVector.size() - crossCount) == 0 &&
"No edges should be remaining after completion of polygonPatchIntersection");