Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
PeriodicGlidePlane_NEW.h
Go to the documentation of this file.
1/* This file is part of MoDELib, the Mechanics Of Defects Evolution Library.
2 *
3 *
4 * MoDELib is distributed without any warranty under the
5 * GNU General Public License (GPL) v2 <http://www.gnu.org/licenses/>.
6 */
7
8#ifndef model_PeriodicGlidePlane_H_
9#define model_PeriodicGlidePlane_H_
10
11
12#include <memory>
13#include <string>
14#include <list>
15
16#include <GlidePlane.h>
17#include <GlidePlaneFactory.h>
18//#include <PeriodicGlidePlaneFactory.h>
19#include <TerminalColors.h>
20#include <DiophantineSolver.h>
21#include <SharedPtrFactories.h>
22#include <GramSchmidt.h>
23#include <Polygon2D.h>
24
25
26namespace model
27{
28
29template<int dim>
31
32template<int dim>
34
35template<int dim>
37
38template<int dim>
40
41template<int dim>
43
44template<int dim>
46{
47
48 typedef Eigen::Matrix<double,dim,1> VectorDim;
49 typedef Eigen::Matrix<double,dim-1,1> VectorLowerDim;
50 const PeriodicPlanePatch<dim>* const patch;
51 const std::shared_ptr<PeriodicPlaneNode<dim>> source;
52 const std::shared_ptr<PeriodicPlaneNode<dim>> sink;
53 const std::shared_ptr<const MeshBoundarySegment<dim>> meshIntersection;
54 const short int edgeID;
56 const bool isPeriodicEdge;
58
62
64 const std::shared_ptr<PeriodicPlaneNode<dim>>& source_in,
65 const std::shared_ptr<PeriodicPlaneNode<dim>>& sink_in,
66 const std::shared_ptr<const MeshBoundarySegment<dim>> meshIntersection_in,
67 const short int&)
68 ;
70
71 static bool periodicFacesInSameGrain(const std::shared_ptr<const MeshBoundarySegment<dim>> meshIntersection_in);
72
73 std::string tag() const;
76
77 template<typename T>
78 std::vector<std::pair<VectorLowerDim,const T* const>> trimPolygon(const std::vector<std::pair<VectorLowerDim,const T* const>>& polyPoints) const
79 {
80// // Find if source and sink are inside the original polygon
81// std::vector<VectorLowerDim> windVector;
82// for(const auto& pt : polyPoints)
83// {
84// windVector.push_back(pt.first);
85// }
86// const bool sourceInside(Polygon2D::windingNumber(*source,windVector)!=0);
87// const bool sinkInside(Polygon2D::windingNumber( *sink,windVector)!=0);
88//
90//
92
93 std::vector<std::pair<VectorLowerDim,const T* const>> trimmedPolygon;
94 const Plane<dim-1> plane(0.5*(*source+*sink),outNormal);
95 for (size_t k = 0; k < polyPoints.size(); ++k)
96 {
97 const auto startPoint(polyPoints[k]);
98 const auto endPoint(k == polyPoints.size() - 1 ? polyPoints[0] : polyPoints[k + 1]);
99
100 const bool startPointBelowPlane(plane.isAbove(startPoint.first));
101 const bool endPointBelowPlane(plane.isAbove(endPoint.first));
102
103 if(startPointBelowPlane && endPointBelowPlane)
104 {// no crossing, add endPoint
105 trimmedPolygon.push_back(endPoint);
106 }
107 else if(startPointBelowPlane && !endPointBelowPlane)
108 {//
109 FiniteLineSegment<dim-1> fls(startPoint.first,endPoint.first);
110 PlaneSegmentIntersection<dim-1> psi(plane,fls);
112 {
113 trimmedPolygon.emplace_back(0.5*(psi.x0+psi.x1),nullptr);
114 }
116 {// end point may be on the edge, keep it
117 trimmedPolygon.push_back(endPoint);
118 }
119 else
120 {
121 throw std::runtime_error("trimPolygon: intersection should be INCIDENT or COINCIDENT");
122 }
123 }
124 else if(!startPointBelowPlane && endPointBelowPlane)
125 {//
126 FiniteLineSegment<dim-1> fls(startPoint.first,endPoint.first);
127 PlaneSegmentIntersection<dim-1> psi(plane,fls);
129 {
130 trimmedPolygon.emplace_back(0.5*(psi.x0+psi.x1),nullptr);
131 trimmedPolygon.push_back(endPoint);
132 }
134 {// end point may be on the edge, keep it
135 trimmedPolygon.push_back(endPoint);
136 }
137 else
138 {
139 throw std::runtime_error("trimPolygon: intersection should be INCIDENT or COINCIDENT");
140 }
141 }
142 else
143 {// both points are above the plane, discard them
144
145 }
146 }
147 return trimmedPolygon;
148 }
149
150};
151
152template<int dim>
153struct NodalConnectivity
154{
156
159
161 /* init */ inEdge(nullptr)
162 /* init */,outEdge(nullptr)
163 {
164
165 }
166};
167
168template<int dim>
169class PeriodicPlaneNode : public StaticID<PeriodicPlaneNode<dim>>
170/* */,public Eigen::Matrix<double,dim-1,1>
171{
172
173public:
174
175 typedef Eigen::Matrix<double,dim-1,1> VectorLowerDim;
179 typedef std::map<size_t,NodalConnectivity<dim>> NodalConnectivityContainerType;
180 typedef std::set<PeriodicPlaneEdgeType*> InOutEdgeContainerType;
182 typedef CompareVectorsByComponent<double,dim-1,float> CompareType;
183
184private:
185
186 NodalConnectivityContainerType _patchConnectivities;
187 NodalConnectivityContainerType _neighborConnectivities;
188
189public:
190
200};
201
202template<int dim>
203struct PeriodicPlanePatch : public StaticID<PeriodicPlanePatch<dim>>
204/* */, private std::vector<std::shared_ptr<PeriodicPlaneEdge<dim>>>
205{
206
207 typedef Eigen::Matrix<double,dim,1> VectorDim;
209 typedef Eigen::Matrix<double,dim-1,1> VectorLowerDim;
211 typedef std::vector<std::shared_ptr<PeriodicPlaneEdge<dim>>> PeriodicPlaneEdgeContainerType;
212
214 const VectorDim shift;
215 const std::shared_ptr<GlidePlane<dim>> glidePlane;
216
222 std::shared_ptr<PeriodicPlaneEdge<dim>> edgeOnFaces(const std::set<const Polyhedron<dim,dim-1>*>& faces) const;
223 int contains(const VectorLowerDim& test) const;
224};
225
226template<int dim>
227struct PeriodicPatchBoundary : public StaticID<PeriodicPatchBoundary<dim>>
228/* */,public KeyConstructableWeakPtrFactory<PeriodicPatchBoundary<dim>,PeriodicPlaneNode<dim>,typename PeriodicPlaneNode<dim>::CompareType>
229/* */,private std::set<const PeriodicPlaneEdge<dim>*>
230/* */,public KeyConstructableWeakPtrFactory<PeriodicPatchBoundary<dim>,PeriodicPlanePatch<dim>,typename PeriodicPlanePatch<dim>::CompareType>
231
232{
233 typedef Eigen::Matrix<double,dim,dim> MatrixDim;
234 typedef Eigen::Matrix<double,dim,1> VectorDim;
235 typedef Eigen::Matrix<double,dim-1,1> VectorLowerDim;
237 typedef std::set<const PeriodicPlaneEdge<dim>*> UntwinnedEdgeContainerType;
238 typedef std::vector<const PeriodicPlaneEdge<dim>*> BoundaryContainerType;
239 typedef std::vector<BoundaryContainerType> BoundariesContainerType;
241
245 const std::shared_ptr<GlidePlane<dim>> referencePlane;
246
247 PeriodicPatchBoundary(GlidePlaneFactory<dim>&, const std::shared_ptr<GlidePlane<dim>>& referencePlane_in);
259 const NodeCointainerType& nodes() const;
261 bool isCompact() const;
262 static VectorDim rightHandedNormal(const std::vector<const PeriodicPlaneEdge<dim>*>& bnd);
263 double rightHandedArea(const std::vector<const PeriodicPlaneEdge<dim>*>& bnd);
264 bool isRightHandedBoundary(const std::vector<const PeriodicPlaneEdge<dim>*>& bnd);
265 VectorLowerDim getLocalPosition(const VectorDim& point,const VectorDim& shift) const;
267 std::shared_ptr<PeriodicPlaneNode<dim> > getSharedNode(const VectorDim& pointDim,const VectorDim& shift);
268 std::shared_ptr<PeriodicPlanePatch<dim>> getPatch(const VectorDim& shift);
270 std::shared_ptr<GlidePlane<dim>> getGlidePlane(const VectorDim& shift);
273};
274
275template<int dim>
277{
278
279public:
280
281 typedef Eigen::Matrix<double,dim,dim> MatrixDim;
282 typedef Eigen::Matrix<double,dim,1> VectorDim;
283 typedef Eigen::Matrix<long int, dim, 1> VectorDimI;
284 typedef Eigen::Matrix<double,dim-1,1> VectorLowerDim;
285 // typedef KeyConstructableSharedPtrFactory<PeriodicGlidePlane<dim>,PeriodicPlanePatch<dim>> PatchContainerType;
286 typedef std::set<const PeriodicPlaneEdge<dim>*> UntwinnedEdgeContainerType;
287 typedef std::vector<const PeriodicPlaneEdge<dim>*> BoundaryContainerType;
288 typedef std::vector<BoundaryContainerType> BoundariesContainerType;
292
295 const std::shared_ptr<GlidePlane<dim>> referencePlane;
296
297
299 void print();
300
301
302 template<typename T>
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);
304 template<typename T>
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);
306 template<typename T>
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);
308 template<typename T>
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);
310
311 std::pair<VectorDim,bool> findPatch(const VectorLowerDim&,const VectorDim&);
312 std::vector<std::shared_ptr<PeriodicPlanePatch<dim>>> filledPatches(const std::vector<VectorDim>& patchShifts);
313};
314
315template<int dim>
317{
318 typedef Eigen::Matrix<double,dim,1> VectorDim;
319 size_t glidePlaneID;
320 size_t patchBoundaryID;
322
325 PeriodicPlanePatchIO(std::stringstream& ss);
326};
327
328template <int dim,class T>
329T& operator << (T& os, const PeriodicPlanePatchIO<dim>& ds)
330{
331 os << ds.glidePlaneID<<"\t"
332 /**/<< ds.patchBoundaryID<<"\t"
333 /**/<< std::setprecision(15)<<std::scientific<<ds.shift.transpose();
334 return os;
335}
336
337template<int dim>
338template<typename T>
339std::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<VectorDim,const T* const>>& polyPoints, const bool& intersectInternalNodes)
340{
341 std::set<const Polyhedron<dim,dim-1>*> usedFaces;
342 return polygonPatchIntersection(polyPoints,intersectInternalNodes,usedFaces);
343}
344
345template<int dim>
346template<typename T>
347std::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<VectorDim,const T* const>>& polyPoints, const bool& intersectInternalNodes,std::set<const Polyhedron<dim,dim-1>*>& usedFaces)
348{
349 std::vector<std::pair<VectorLowerDim,const T* const>> lowerPolyPoints;
350 for(const auto& point : polyPoints)
351 {
352 assert(this->referencePlane->contains(point.first) && "reference plane does not cointain point");
353 lowerPolyPoints.push_back(std::make_pair(referencePlane->localPosition(point.first-VectorDim::Zero()),point.second));
354 }
355 return polygonPatchIntersection(lowerPolyPoints,intersectInternalNodes,usedFaces);
356}
357
358template<int dim>
359template<typename T>
360std::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)
361{
362 std::set<const Polyhedron<dim,dim-1>*> usedFaces;
363 return polygonPatchIntersection(polyPoints,intersectInternalNodes,usedFaces);
364}
365
366template<int dim>
367template<typename T>
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)
369{
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; // 2dPos,shift,std::pair<edgeIDs>,LoopNodeType*
371 // 2dPos,shift,std::pair<edgeIDs>,edgeMap,edgesStillRemaining,LoopNodeType*
372 //This is done to take care of all the edges that the two nodes are intersecting, size_t indicates the remaining intersection
373 if (polyPoints.size())
374 {
376// auto lastPatch(patchBoundary.getPatch(findPatch(polyPoints[0].first, VectorDim::Zero()).first));
377 std::shared_ptr<PeriodicPlanePatch<dim>> lastPatch(nullptr);
378 int startNodeID(-1);
379 for (size_t k = 0; k < polyPoints.size(); ++k)
380 {
381 auto patchFound(findPatch(polyPoints[k].first, VectorDim::Zero()));
382 if(patchFound.second)
383 {
384 lastPatch=patchBoundary.getPatch(patchFound.first);
385 startNodeID=k;
386 break;
387 }
388 }
389
390 if(lastPatch)
391 {
392
393// for(const auto& trimEdge : lastPatch->edges())
394// {
395// if(!trimEdge->isPeriodicEdge)
396// {
397// polyPoints=trimEdge->trimPolygon(polyPoints);
398// }
399// }
400
401
402 // Find other points
403 for (size_t k = 0; k < polyPoints.size(); ++k)
404 {
405 std::vector<std::tuple<typename PeriodicGlidePlane<dim>::VectorLowerDim,typename PeriodicGlidePlane<dim>::VectorDim,std::pair<short int,short int>,const T* const>> ppi; // 2dPos,shift,std::pair<edgeIDs>,LoopNodeType*
406 std::map<VectorDim,std::set<std::pair<short int,short int>>,CompareVectorsByComponent<double,dim,float>> edgeMaps; //This will populate the set of edges that this link has crossed along with the patchShift
407 std::vector<std::pair<short int,short int>> edgeVector; //This will just give the number of edges intersected
408 std::vector<std::shared_ptr<PeriodicPlanePatch<dim>>> currentPatches;
409 // std::cout<<"k point ="<<k<<std::endl;
410 currentPatches.push_back(lastPatch); // keep patches alive durin current line segment search
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)
414 {
415 while (true)
416 {
417 // std::map<const PeriodicPlanePatch<dim> *, std::vector<std::pair<const VectorLowerDim, const PeriodicPlaneEdge<dim> *const>>> crossdEdges;
418// std::vector<std::pair<const VectorLowerDim, const PeriodicPlaneEdge<dim> *const>> crossdEdges; // TODO this should be a container sorted by the scalae intersection paramenter along startPoint->endPoint (ssd.t)
419
420 std::map<float,std::pair<VectorLowerDim,std::set<const PeriodicPlaneEdge<dim>*>>> crossdEdges;
421
422 for (const auto &bndEdge : patchBoundary.untwinnedEdges())
423 { // loop over outer boundaries and holes
424
425 SegmentSegmentDistance<dim - 1> ssd(startPoint.first, endPoint.first, *bndEdge->source, *bndEdge->sink);
426 if (ssd.isIntersecting(FLT_EPSILON))
427 { // intersection with current boundary found
428 PlaneSegmentIntersection<dim-1> psi(0.5*(*bndEdge->source+*bndEdge->sink),bndEdge->outNormal,startPoint.first,endPoint.first);
430 && !bndEdge->isPeriodicEdge)
431 {// try to trim polygon
432 for(const auto& face : bndEdge->meshIntersection->faces)
433 {
434 const bool isTrimmingFace(face->periodicFacePair.second==nullptr? true : face->regionIDs!=face->periodicFacePair.second->regionIDs);
435 if(isTrimmingFace)
436 {// not a periodic face
437 if(usedFaces.find(face)==usedFaces.end())
438 {// face not used yet
439 usedFaces.insert(face);
440 return polygonPatchIntersection(bndEdge->trimPolygon(polyPoints),intersectInternalNodes,usedFaces);
441 }
442 }
443 }
444 }
445
446 // Store intersection(s) ordered along loop segment
447 const auto interSegment(ssd.intersectionSegment());
448 for(const auto& tup : interSegment)
449 {
450 const auto crossIter(crossdEdges.find(std::get<1>(tup)));
451 if(crossIter==crossdEdges.end())
452 {
453 std::set<const PeriodicPlaneEdge<dim>*> tempSet;
454 tempSet.insert(bndEdge);
455 crossdEdges.emplace(std::get<1>(tup),std::get<0>(tup),tempSet);
456 }
457 else
458 {
459 crossIter->second.second.insert(bndEdge);
460 }
461 }
462 }
463 }
464
465 if (crossdEdges.size() == 0)
466 { // No untwinned edges have been crossed, break and move to next pair of polyPoints
467 ppi.emplace_back(endPoint.first, lastPatch->shift, std::make_pair(-1,-1), endPoint.second);
468 break; // while loop
469
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
472
473 }
474 else
475 {
476 // START OF NEW IMPLEMENTATION
477 switch (crossdEdges.size())
478 {
479
480 CONTINUE HERE
481
482 for(const auto& crossdEdgePair : crossdEdges)
483 {
484// if(crossdEdgePair.second.second.size())
485// {
486// const auto& edgePatch(crossdEdgePair.second.second.begin()->patch);
487// for(const auto& otherEdge : crossdEdgePair.second.second())
488// {
489// if(otherEdge->paatch!=edgePatch)
490// {
491// throw std::runtime_error("Two different patches are found for the same edge intersection");
492// }
493// }
494// }
495 }
496
497 case 1:
498 {// only one intersection point (possibly one or two edges)
499
500
501 const auto& edge(*crossdEdges.begin());
502 const auto& edgePatchShift(edge.second->patch->shift);
503
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));
506
507 const auto edgeSetIter1(edgeMaps.find(edgePatchShift));
508 if (edgeSetIter1 == edgeMaps.end())
509 {
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);
513 }
514 else
515 {
516 edgeSetIter1->second.insert(std::make_pair(edge.second->edgeID,-1));
517 }
518
519 if(edge.second->isPeriodicEdge)
520 {
521 const VectorDim localShift(edgePatchShift + edge.second->deltaShift);
522 // Insert patches corresponding to the individual intersections as well
523 lastPatch = patchBoundary.patches().getFromKey(localShift);
524 currentPatches.push_back(lastPatch); // keep patches alive durin current line segment search
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));
528
529 const auto edgeSetIter2(edgeMaps.find(edge.second->twin->patch->shift));
530 if (edgeSetIter2 == edgeMaps.end())
531 {
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);
535 }
536 else
537 {
538 edgeSetIter2->second.insert(std::make_pair(edge.second->twin->edgeID,-1));
539 }
540 }
541 else
542 {
543 // Line<dim-1> line(edge.first,(*edge.second->sink)-(*edge.second->source));
544 // std::pair<double,double> lineBounds(std::make_pair(0.0,0.0));
545 //
546 // for (size_t j = k+1; j < polyPoints.size(); ++k)
547 // {// Pick subsequent loop segments until you find another intersection with the line
548 // const auto startPointTemp(polyPoints[startNodeID+j]);
549 // const auto endPointTemp(j == polyPoints.size() - 1 ? polyPoints[startNodeID] : polyPoints[startNodeID+j + 1]);
550 //
551 // const auto chord(endPointTemp.first-startPointTemp.first);
552 // const double chordNorm(chord.norm());
553 // if(chordNorm>FLT_EPSILON)
554 // {
555 // LineLineIntersection<dim-1> lli(line.P,line.d,startPointTemp.first,chord/chordNorm);
556 // if( lli.type==LineLineIntersection<dim-1>::INCIDENT
557 // && lli.u1/chordNorm > 0.0-FLT_EPSILON // intersection inside finite line segment
558 // && lli.u1/chordNorm < 1.0+FLT_EPSILON)// intersection inside finite line segment
559 // {
560 // lineBounds=std::make_pair(std::min(0.0,lli.u0),std::max(0.0,lli.u0));
561 // break;
562 // }
563 // }
564 // }
565 // if(lineBounds.first==lineBounds.second)
566 // {
567 // throw std::runtime_error("Cound not determine lineBounds.");
568 // }
569 //
570 // // Check if polyPoints polygon
571 //
572 // std::set<const PeriodicPlaneEdge<dim>*> possibleEdges;
573 // for (const auto &bndEdge : patchBoundary.untwinnedEdges()) // instead of this for loop we could use only edge.second->nextUntwinned() and edge.second->prevUntwinned()
574 // { // loop over outer boundaries and holes
575 // const auto chord(*bndEdge->sink-*bndEdge->source);
576 // const double chordNorm(chord.norm());
577 // if(chordNorm>FLT_EPSILON)
578 // {
579 // LineLineIntersection<dim-1> lli(line.P,line.d,*bndEdge->source,chord/chordNorm);
580 // if( lli.type==LineLineIntersection<dim-1>::INCIDENT
581 // && lli.u0 > lineBounds.first // intersection inside lineBounds
582 // && lli.u0 < lineBounds.second // intersection inside lineBounds
583 // && lli.u1/chordNorm > 0.0-FLT_EPSILON // intersection inside finite line segment
584 // && lli.u1/chordNorm < 1.0+FLT_EPSILON)// intersection inside finite line segment
585 // {
586 // possibleEdges.insert(bndEdge);
587 // }
588 // }
589 // }
590 //
591 // if(possibleEdges.size()==1)
592 // {
593 //
594 // }
595 // else
596 // {
597 // std::cout<<"possibleEdges.size()="<<possibleEdges.size()<<std::endl;
598 // throw std::runtime_error("Expected exactly one possible edge");
599 // }
600
601 }
602
603
604 break;
605 }
606
607 case 2:
608 {
609 const auto& edge0(*crossdEdges.begin());
610 const auto& edge1(*crossdEdges.rbegin());
611 if( (edge0.first-edge1.first).norm()>FLT_EPSILON // 2d intersection not coincident
612 || edge0.second==edge1.second // same edge twice
613 || edge0.second->patch!=edge1.second->patch // edges in different patches
614 )
615 {
616 throw std::runtime_error("polygonPatchIntersection: two intersections are inconsistent.");
617 }
618 const auto& edgePatchShift(edge0.second->patch->shift);
619
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));
622
623 const auto edgeSetIter1 (edgeMaps.find(edgePatchShift));
624 if (edgeSetIter1==edgeMaps.end())
625 {
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);
629 }
630 else
631 {
632 edgeSetIter1->second.insert(std::make_pair(edge0.second->edgeID, edge1.second->edgeID));
633 }
634
635 //here three patches are needed to be inserted... two at periodically opposite faces and one at diagonally opposite faces
636 lastPatch = patchBoundary.patches().getFromKey(edgePatchShift + edge0.second->deltaShift);
637 currentPatches.push_back(lastPatch); // keep patches alive durin current line segment search
638 lastPatch = patchBoundary.patches().getFromKey(edgePatchShift + edge1.second->deltaShift);
639 currentPatches.push_back(lastPatch); // keep patches alive durin current line segment search
640 const VectorDim localShift(edgePatchShift + edge0.second->deltaShift+edge1.second->deltaShift);
641 lastPatch = patchBoundary.patches().getFromKey(localShift);
642 currentPatches.push_back(lastPatch); // keep patches alive durin current line segment search
643 assert(edge0.second->twin); //Now the twin for both the edges must exist
644 assert(edge1.second->twin);
645 assert((edge0.second->twin!=edge1.second->twin) && "Two intersection must be different after twinned link");
646 //Insert a new node at the twinned edge of the current pair of edges
647 //Need to determine the correct edgeIDs
648 short int beginTwinEdgeID(-1);
649 short rbeginTwinEdgeID(-1);
650 //We need to get the edgeID corresponding to the diagonally opposite patch
651 if (edge0.second==edge1.second->prev)
652 {
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;
657 }
658 else if (edge0.second==edge1.second->next)
659 {
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");
662
663 beginTwinEdgeID=edge0.second->twin->next->twin->edgeID;
664 rbeginTwinEdgeID=edge1.second->twin->prev->twin->edgeID;
665 }
666 else
667 {
668 assert(false && "Edges must be consecutive");
669 }
670
671 assert(beginTwinEdgeID!=-1 && "A twin ID must exist");
672 assert(rbeginTwinEdgeID!=-1 && "A twin ID must exist");
673
674 ppi.emplace_back(edge0.first, localShift, std::make_pair(beginTwinEdgeID, rbeginTwinEdgeID), nullptr);
675 edgeVector.push_back(std::make_pair(beginTwinEdgeID, rbeginTwinEdgeID));
676
677 const auto edgeSetIter2 (edgeMaps.find(localShift));
678 if (edgeSetIter2==edgeMaps.end())
679 {
680 std::set<std::pair<short int,short int>> edgeSet;
681 edgeSet.insert(std::make_pair(beginTwinEdgeID, rbeginTwinEdgeID));
682 edgeMaps.emplace(localShift,edgeSet);
683 }
684 else
685 {
686 edgeSetIter2->second.insert(std::make_pair(beginTwinEdgeID, rbeginTwinEdgeID));
687 }
688
689 break;
690 }
691
692
693
694 default:
695 {
696 std::cout<<"crossdEdges.size()="<<crossdEdges.size()<<std::endl;
697 throw std::runtime_error("polygonPatchIntersection: at most two intersections are possible.");
698 break;
699 }
700 }
701
702 // OLD IMPLEMENTATION
703 // for (const auto &pair : crossdEdges) //HOW IS THIS IN THE RIGHT ORDER???
704 // { // loop over crossed patches
705 // assert((pair.second.size()>0 && pair.second.size()<=2) && "At max two periodic plane edges can be intersected (2D geometry constraint)");
706 // if (pair.second.size()==2 && (pair.second.begin()->first-pair.second.rbegin()->first).norm()<FLT_EPSILON)
707 // {// Two intersectoins at the same position (intersectoin at corner)
708 // // pair.second.size() cannot be 4 even for diagonally opposite ends since we are looping over the untwineed edges for the intersection.
709 // //Need to check that two subsequen links are at the same 2D position
710 //
711 // //The two intersection points are the same... Insert at diagonally opposite end
712 //
713 // assert((pair.second.begin()->second!=pair.second.rbegin()->second) && "Two intersection must be different");
714 // ppi.emplace_back(pair.second.begin()->first, pair.first->shift, std::make_pair(pair.second.begin()->second->edgeID, pair.second.rbegin()->second->edgeID), nullptr);
715 // const auto edgeSetIter1 (edgeMaps.find(pair.first->shift));
716 // edgeVector.push_back(std::make_pair(pair.second.begin()->second->edgeID, pair.second.rbegin()->second->edgeID));
717 //
718 // if (edgeSetIter1==edgeMaps.end())
719 // {
720 // std::set<std::pair<short int,short int>> edgeSet;
721 // edgeSet.insert(std::make_pair(pair.second.begin()->second->edgeID, pair.second.rbegin()->second->edgeID));
722 // edgeMaps.emplace(pair.first->shift,edgeSet);
723 // }
724 // else
725 // {
726 // edgeSetIter1->second.insert(std::make_pair(pair.second.begin()->second->edgeID, pair.second.rbegin()->second->edgeID));
727 // }
728 //
729 // //here three patches are needed to be inserted... two at periodically opposite faces and one at diagonally opposite faces
730 // lastPatch = patchBoundary.patches().getFromKey(pair.first->shift + pair.second.begin()->second->deltaShift);
731 // currentPatches.push_back(lastPatch); // keep patches alive durin current line segment search
732 // lastPatch = patchBoundary.patches().getFromKey(pair.first->shift + pair.second.rbegin()->second->deltaShift);
733 // currentPatches.push_back(lastPatch); // keep patches alive durin current line segment search
734 // const VectorDim localShift(pair.first->shift + pair.second.begin()->second->deltaShift+pair.second.rbegin()->second->deltaShift);
735 // lastPatch = patchBoundary.patches().getFromKey(localShift);
736 // currentPatches.push_back(lastPatch); // keep patches alive durin current line segment search
737 // assert(pair.second.begin()->second->twin); //Now the twin for both the edges must exist
738 // assert(pair.second.rbegin()->second->twin);
739 // assert((pair.second.begin()->second->twin!=pair.second.rbegin()->second->twin) && "Two intersection must be different after twinned link");
740 // //Insert a new node at the twinned edge of the current pair of edges
741 // //Need to determine the correct edgeIDs
742 // short int beginTwinEdgeID(-1);
743 // short rbeginTwinEdgeID(-1);
744 // //We need to get the edgeID corresponding to the diagonally opposite patch
745 // if (pair.second.begin()->second==pair.second.rbegin()->second->prev)
746 // {
747 // assert(pair.second.begin()->second->twin->prev->twin && "A twin in the diagonally opposite patch must exist");
748 // assert(pair.second.rbegin()->second->twin->next->twin && "A twin in the diagonally opposite patch must exist");
749 // beginTwinEdgeID=pair.second.begin()->second->twin->prev->twin->edgeID;
750 // rbeginTwinEdgeID=pair.second.rbegin()->second->twin->next->twin->edgeID;
751 // }
752 // else if (pair.second.begin()->second==pair.second.rbegin()->second->next)
753 // {
754 // assert(pair.second.begin()->second->twin->next->twin && "A twin in the diagonally opposite patch must exist");
755 // assert(pair.second.rbegin()->second->twin->prev->twin && "A twin in the diagonally opposite patch must exist");
756 //
757 // beginTwinEdgeID=pair.second.begin()->second->twin->next->twin->edgeID;
758 // rbeginTwinEdgeID=pair.second.rbegin()->second->twin->prev->twin->edgeID;
759 // }
760 // else
761 // {
762 // assert(false && "Edges must be consecutive");
763 // }
764 //
765 // assert(beginTwinEdgeID!=-1 && "A twin ID must exist");
766 // assert(rbeginTwinEdgeID!=-1 && "A twin ID must exist");
767 //
768 // ppi.emplace_back(pair.second.begin()->first, localShift, std::make_pair(beginTwinEdgeID, rbeginTwinEdgeID), nullptr);
769 // edgeVector.push_back(std::make_pair(beginTwinEdgeID, rbeginTwinEdgeID));
770 //
771 // const auto edgeSetIter2 (edgeMaps.find(localShift));
772 // if (edgeSetIter2==edgeMaps.end())
773 // {
774 // std::set<std::pair<short int,short int>> edgeSet;
775 // edgeSet.insert(std::make_pair(beginTwinEdgeID, rbeginTwinEdgeID));
776 // edgeMaps.emplace(localShift,edgeSet);
777 // }
778 // else
779 // {
780 // edgeSetIter2->second.insert(std::make_pair(beginTwinEdgeID, rbeginTwinEdgeID));
781 // }
782 // }
783 // else
784 // {// Intersections not a corner
785 // for (const auto &edge : pair.second) HOW IS THIS IN THE RIGHT ORDER???
786 // { // loop over crossed edges. edge.first=2D position, edge.second= edge ptr
787 // ppi.emplace_back(edge.first, pair.first->shift, std::make_pair(edge.second->edgeID,-1), nullptr);
788 // edgeVector.push_back(std::make_pair(edge.second->edgeID,-1));
789 //
790 // const auto edgeSetIter1(edgeMaps.find(pair.first->shift));
791 // if (edgeSetIter1 == edgeMaps.end())
792 // {
793 // std::set<std::pair<short int,short int>> edgeSet;
794 // edgeSet.insert(std::make_pair(edge.second->edgeID,-1));
795 // edgeMaps.emplace(pair.first->shift, edgeSet);
796 // }
797 // else
798 // {
799 // edgeSetIter1->second.insert(std::make_pair(edge.second->edgeID,-1));
800 // }
801 // const VectorDim localShift(pair.first->shift + edge.second->deltaShift);
802 // // Insert patches corresponding to the individual intersections as well
803 // lastPatch = patchBoundary.patches().getFromKey(localShift);
804 // currentPatches.push_back(lastPatch); // keep patches alive durin current line segment search
805 // assert(edge.second->twin);
806 // ppi.emplace_back(edge.first, edge.second->twin->patch->shift, std::make_pair(edge.second->twin->edgeID,-1), nullptr);
807 // edgeVector.push_back(std::make_pair(edge.second->twin->edgeID,-1));
808 //
809 // const auto edgeSetIter2(edgeMaps.find(edge.second->twin->patch->shift));
810 // if (edgeSetIter2 == edgeMaps.end())
811 // {
812 // std::set<std::pair<short int,short int>> edgeSet;
813 // edgeSet.insert(std::make_pair(edge.second->twin->edgeID,-1));
814 // edgeMaps.emplace(edge.second->twin->patch->shift, edgeSet);
815 // }
816 // else
817 // {
818 // edgeSetIter2->second.insert(std::make_pair(edge.second->twin->edgeID,-1));
819 // }
820 // }
821 // }
822 // }
823 if (lastPatch->contains(endPoint.first))
824 {
825 ppi.emplace_back(endPoint.first, lastPatch->shift, std::make_pair(-1,-1), endPoint.second);
826 break;
827 }
828 }
829 }
830 }
831 else
832 {
833 ppi.emplace_back(endPoint.first, lastPatch->shift, std::make_pair(-1,-1), endPoint.second);
834 }
835
836 //Here populate the ppiPPedges
837 size_t crossCount=0;
838 for (const auto& ppiIter : ppi )
839 {
840 size_t edgesStillRemaining(0);
841 if (std::get<3>(ppiIter) == nullptr)
842 {
843 //That mean intersection with the edge is here
844 crossCount++;
845 edgesStillRemaining = edgeVector.size() - crossCount;
846 }
847 ppiPPedges.emplace_back(std::get<0>(ppiIter), std::get<1>(ppiIter), std::get<2>(ppiIter), edgeMaps, edgesStillRemaining, std::get<3>(ppiIter));
848 }
849 if (edgeVector.size() != 0)
850 {
851 if ((edgeVector.size() - crossCount ) != 0)
852 {
853 std::cout<<"Edge VectorSize "<<edgeVector.size()<<std::endl;
854 std::cout<<"Cross count "<<crossCount<<std::endl;
855 }
856 assert((edgeVector.size() - crossCount) == 0 && "No edges should be remaining after completion of polygonPatchIntersection");
857 }
858 }
859 }
860
861
862
863
864// auto lastPatch(patchBoundary.getPatch(findPatch(polyPoints[startNodeID].first, VectorDim::Zero()).first));
865
866 // const size_t loopID((*polyPoints.begin()).second->loop()->sID);
867 // const size_t runID((*polyPoints.begin()).second->network().simulationParameters.runID);
868
869 // std::ofstream polyFile("poly.txt");
870 // for(const auto& node : polyPoints)
871 // {
872 // polyFile<<" "<<node.transpose()<<std::endl;
873 // }
874
875 // int removeMe=0;
876
877 // ppi.emplace_back(polyPoints[0],lastPatch,nullptr);
878
879
880 }
881
882 return ppiPPedges;
883}
884
885template<typename T1,typename T2, typename T3,typename T4>
886void printIntersections(const T1& ppi,const T2& usedPatches,const T3& lastPatch,int& removeMe, const T4& untwinnedEdges)
887{
888 std::ofstream pointsFile("points_"+std::to_string(removeMe)+".txt");
889 for(const auto& tup : ppi)
890 {
891 // if(!node.second.expired())
892 // {
893 pointsFile<<" "<<std::get<0>(tup).transpose()<<std::endl;
894 // }
895 }
896
897 std::ofstream edgesFile("edges_"+std::to_string(removeMe)+".txt");
898 for(const auto& patch : usedPatches)
899 {
900 for(const auto& edge : patch->edges())
901 {
902 if(untwinnedEdges.find(edge.get())!=untwinnedEdges.end())
903 {
904 edgesFile<<patch->sID<<" "<<edge->source->transpose()<<" "<<edge->sink->transpose()<<" 1"<<std::endl;
905 }
906 else
907 {
908 edgesFile<<patch->sID<<" "<<edge->source->transpose()<<" "<<edge->sink->transpose()<<" 0"<<std::endl;
909 }
910
911 }
912 }
913
914 std::ofstream lastPatchFile("lastPatch_"+std::to_string(removeMe)+".txt");
915 for(const auto& edge : lastPatch->edges())
916 {
917 lastPatchFile<<lastPatch->sID<<" "<<edge->source->transpose()<<" "<<edge->sink->transpose()<<std::endl;
918 }
919 removeMe++;
920}
921
922
923}
924#endif
Class template representing a straight line at the intersection of PlanarMeshFaces.
std::vector< const PeriodicPlaneEdge< dim > * > BoundaryContainerType
GlidePlaneFactory< dim > & glidePlaneFactory
std::pair< VectorDim, bool > findPatch(const VectorLowerDim &, const VectorDim &)
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)
PeriodicGlidePlaneFactoryType & periodicGlidePlaneFactory
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)
Eigen::Matrix< double, dim-1, 1 > VectorLowerDim
std::vector< PolygonPatchIntersectionRecord< dim, T > > polygonPatchIntersection(const std::vector< std::pair< VectorDim, const T *const > > &polyPoints, const bool &intersectInternalNodes=false)
Eigen::Matrix< long int, dim, 1 > VectorDimI
const std::shared_ptr< GlidePlane< dim > > referencePlane
std::vector< std::shared_ptr< PeriodicPlanePatch< dim > > > filledPatches(const std::vector< VectorDim > &patchShifts)
Eigen::Matrix< double, dim, 1 > VectorDim
PeriodicGlidePlane(PeriodicGlidePlaneFactoryType *const pgpf, const KeyType &key_in)
std::vector< BoundaryContainerType > BoundariesContainerType
std::set< const PeriodicPlaneEdge< dim > * > UntwinnedEdgeContainerType
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)
GlidePlaneType::KeyType KeyType
Eigen::Matrix< double, dim, dim > MatrixDim
PeriodicGlidePlaneFactory< dim > PeriodicGlidePlaneFactoryType
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)
PeriodicPlaneEdge< dim > PeriodicPlaneEdgeType
InOutEdgeContainerType outEdges() const
CompareVectorsByComponent< double, dim-1, float > CompareType
NodalConnectivityContainerType & patchConnectivities()
Eigen::Matrix< double, dim-1, 1 > VectorLowerDim
void removeLink(PeriodicPlaneEdgeType *const link)
const NodalConnectivityContainerType & patchConnectivities() const
void addLink(PeriodicPlaneEdgeType *const link)
std::map< size_t, NodalConnectivity< dim > > NodalConnectivityContainerType
PeriodicPlaneNode(PeriodicPatchBoundary< dim > *const, const VectorLowerDim &pos)
InOutEdgeContainerType inEdges() const
const NodalConnectivityContainerType & neighborConnectivities() const
NodalConnectivityContainerType & neighborConnectivities()
NodalConnectivity< dim > NodalConnectivityType
std::set< PeriodicPlaneEdgeType * > InOutEdgeContainerType
PeriodicPlaneNode< dim > PeriodicPlaneNodeType
function infiniteDisplacement syms Ax Ay Az Bx By Bz qx qy qz u L x y z real A
void printIntersections(const T1 &ppi, const T2 &usedPatches, const T3 &lastPatch, int &removeMe, const T4 &untwinnedEdges)
T & operator<<(T &os, const PeriodicPlanePatchIO< dim > &ds)
LatticePlaneKey< dim > GlidePlaneKey
GlidePlaneKey< dim > KeyType
Definition GlidePlane.h:49
SharedPtrType getFromKey(const KeyType &key)
PeriodicPlaneEdgeType * outEdge
PeriodicPlaneEdge< dim > PeriodicPlaneEdgeType
PeriodicPlaneEdgeType * inEdge
const PatchContainerType & patches() const
void createNewBoundary(const PeriodicPlaneEdge< dim > *currentEdge, UntwinnedEdgeContainerType &untwinnedCopy)
PeriodicPatchBoundary(GlidePlaneFactory< dim > &, const std::shared_ptr< GlidePlane< dim > > &referencePlane_in)
KeyConstructableWeakPtrFactory< PeriodicPatchBoundary< dim >, PeriodicPlaneNode< dim >, typename PeriodicPlaneNode< dim >::CompareType > NodeCointainerType
const UntwinnedEdgeContainerType & untwinnedEdges() const
BoundariesContainerType & outerBoundaries()
Eigen::Matrix< double, dim, dim > MatrixDim
PatchContainerType & patches()
const BoundariesContainerType & innerBoundaries() const
static VectorDim rightHandedNormal(const std::vector< const PeriodicPlaneEdge< dim > * > &bnd)
VectorLowerDim getLocalPosition(const VectorDim &point, const VectorDim &shift) const
std::vector< const PeriodicPlaneEdge< dim > * > BoundaryContainerType
const PatchContainerType & patches() const
VectorDim getGlobalPosition(const VectorLowerDim &point) const
bool isRightHandedBoundary(const std::vector< const PeriodicPlaneEdge< dim > * > &bnd)
BoundariesContainerType _outerBoundaries
UntwinnedEdgeContainerType & untwinnedEdges()
std::set< const PeriodicPlaneEdge< dim > * > UntwinnedEdgeContainerType
void addUntwinnedEdge(const PeriodicPlaneEdge< dim > *link)
std::shared_ptr< GlidePlane< dim > > getGlidePlane(const VectorDim &shift)
double rightHandedArea(const std::vector< const PeriodicPlaneEdge< dim > * > &bnd)
const std::shared_ptr< GlidePlane< dim > > referencePlane
NodeCointainerType & nodes()
int isInsideOuterBoundary(const VectorLowerDim &test)
BoundariesContainerType _innerBoundaries
Eigen::Matrix< double, dim-1, 1 > VectorLowerDim
BoundariesContainerType & innerBoundaries()
KeyConstructableWeakPtrFactory< PeriodicPatchBoundary< dim >, PeriodicPlanePatch< dim >, typename PeriodicPlanePatch< dim >::CompareType > PatchContainerType
std::vector< BoundaryContainerType > BoundariesContainerType
Eigen::Matrix< double, dim, 1 > VectorDim
const BoundariesContainerType & outerBoundaries() const
const UntwinnedEdgeContainerType & untwinnedEdges() const
std::shared_ptr< PeriodicPlanePatch< dim > > getPatch(const VectorDim &shift)
const NodeCointainerType & nodes() const
std::shared_ptr< PeriodicPlaneNode< dim > > getSharedNode(const VectorDim &pointDim, const VectorDim &shift)
GlidePlaneFactory< dim > & glidePlaneFactory
GlidePlaneKey< dim > getGlidePlaneKey(const VectorDim &shift)
void removeUntwinnedEdge(const PeriodicPlaneEdge< dim > *link)
PeriodicPlaneEdge(const PeriodicPlanePatch< dim > *const patch_in, const std::shared_ptr< PeriodicPlaneNode< dim > > &source_in, const std::shared_ptr< PeriodicPlaneNode< dim > > &sink_in, const std::shared_ptr< const MeshBoundarySegment< dim > > meshIntersection_in, const short int &)
const std::shared_ptr< const MeshBoundarySegment< dim > > meshIntersection
PeriodicPlaneEdge< dim > * next
Eigen::Matrix< double, dim-1, 1 > VectorLowerDim
Eigen::Matrix< double, dim, 1 > VectorDim
const std::shared_ptr< PeriodicPlaneNode< dim > > sink
std::vector< std::pair< VectorLowerDim, const T *const > > trimPolygon(const std::vector< std::pair< VectorLowerDim, const T *const > > &polyPoints) const
const std::shared_ptr< PeriodicPlaneNode< dim > > source
std::string tag() const
PeriodicPlaneEdge< dim > * twin
PeriodicPlaneEdge< dim > * nextUntwinned() const
const PeriodicPlanePatch< dim > *const patch
PeriodicPlaneEdge< dim > * prevUntwinned() const
static bool periodicFacesInSameGrain(const std::shared_ptr< const MeshBoundarySegment< dim > > meshIntersection_in)
PeriodicPlaneEdge< dim > * prev
std::shared_ptr< PeriodicPlaneEdge< dim > > edgeOnFaces(const std::set< const Polyhedron< dim, dim-1 > * > &faces) const
const PeriodicPlaneEdgeContainerType & edges() const
static bool isRightHandedBoundary(const BoundingMeshSegments< dim > &, const Plane< dim > &)
Eigen::Matrix< double, dim-1, 1 > VectorLowerDim
CompareVectorsByComponent< double, dim, float > CompareType
Eigen::Matrix< double, dim, 1 > VectorDim
const std::shared_ptr< GlidePlane< dim > > glidePlane
PeriodicPatchBoundary< dim > *const patchBoundary
PeriodicPlanePatch(PeriodicPatchBoundary< dim > *const, const VectorDim &)
int contains(const VectorLowerDim &test) const
void addMeshIntersections(const BoundingMeshSegments< dim > &)
std::vector< std::shared_ptr< PeriodicPlaneEdge< dim > > > PeriodicPlaneEdgeContainerType
Eigen::Matrix< double, dim, 1 > VectorDim
PeriodicPlanePatchIO(const PeriodicPlanePatch< dim > &patch)
PeriodicPlanePatchIO(std::stringstream &ss)
newsubseg ss[0]
int k
vertex first