48 std::vector<Eigen::Matrix<double,2,1>> localBndPts;
49 localBndPts.reserve(globalBndPts.size());
50 for(
const auto& gpt : globalBndPts)
52 const Eigen::Matrix<double,2,1> localPos(plane.localPosition(gpt));
53 const auto pointIter(uniquePointsIDs.find(localPos));
54 if(pointIter==uniquePointsIDs.end())
56 uniquePointsIDs.emplace(localPos,localBndPts.size());
57 localBndPts.emplace_back(localPos);
60 const auto originalBndPts(localBndPts);
62 std::vector<Eigen::Matrix<int,2,1>> segments;
63 segments.reserve(localBndPts.size());
64 for(
size_t k=0;
k<localBndPts.size();++
k)
66 const size_t k1(
k<localBndPts.size()-1?
k+1 : 0);
67 const auto& pointK(localBndPts[
k]);
68 const auto& pointK1(localBndPts[k1]);
69 const auto iterK(uniquePointsIDs.find(pointK));
70 const auto iterK1(uniquePointsIDs.find(pointK1));
72 if(iterK!=uniquePointsIDs.end() && iterK1!=uniquePointsIDs.end())
74 segments.emplace_back((Eigen::Matrix<int,2,1>()<<iterK->second,iterK1->second).finished());
78 throw std::runtime_error(
"iterK and iterK1 must exist");
84 const double L(std::pow(
DN.ddBase.mesh.volume(),1.0/3.0));
86 for(
const auto& otherWeakLoop :
DN.loops())
88 for(
const auto& otherPatchPair : otherWeakLoop.second.lock()->patches().localPatches())
90 const auto otherGlidePlane(otherPatchPair.first->glidePlane);
91 if(otherGlidePlane.get()!=&plane)
96 const auto localLineOrigin(
plane.localPosition(ppi.P));
97 const auto localLineDir(
plane.localDirection(ppi.d));
99 std::map<float,Eigen::Matrix<double,2,1>> patchLineIntersections;
100 for(
size_t k=0;
k<originalBndPts.size();++
k)
102 const size_t k1(
k<originalBndPts.size()-1?
k+1 : 0);
103 const auto& pointK(originalBndPts[
k]);
104 const auto& pointK1(originalBndPts[k1]);
106 if(ssd.dMin<FLT_EPSILON)
108 patchLineIntersections.emplace(ssd.t,0.5*(ssd.x0+ssd.x1));
112 if(patchLineIntersections.size()>=2)
114 const Eigen::Matrix<double,2,1>& p0(patchLineIntersections.begin()->second);
115 const Eigen::Matrix<double,2,1>&
p1(patchLineIntersections.rbegin()->second);
116 const Eigen::Matrix<double,2,1> chord(
p1-p0);
117 const int np=chord.norm()/localMeshSize;
119 bool oldPointIncluded=
false;
122 for(
int n=1;
n<np;++
n)
124 const double u(
double(n)/np);
125 const Eigen::Matrix<double,2,1> P(p0+
u*chord);
126 const Eigen::Matrix<double,2,1> otherP(otherGlidePlane->localPosition(
plane.globalPosition(P)));
128 const bool newPointIncluded(wn!=0);
129 const auto pliIter(uniquePointsIDs.find(P));
130 const bool newPointFound(pliIter!=uniquePointsIDs.end());
131 const size_t newPointID(newPointFound? pliIter->second : localBndPts.size() );
137 uniquePointsIDs.emplace(P,localBndPts.size());
138 localBndPts.emplace_back(P);
142 segments.emplace_back((Eigen::Matrix<int,2,1>()<<oldPointID,newPointID).finished());
145 oldPointIncluded=newPointIncluded;
146 oldPointID=newPointID;
156 triMesh.
reMesh(localBndPts,segments,meshSize,
"pazq");
159 for(
const auto&
v : triMesh.vertices())
162 displacements.push_back(VectorDim::Zero());
165 for(
const auto&
tri : triMesh.triangles())
167 const auto& v0(points[
tri(0)]);
168 const auto& v1(points[
tri(1)]);
169 const auto& v2(points[
tri(2)]);
170 const auto c(1.0/3.0*(v0+v1+v2));
171 const auto h(
c+(v1-v0).cross(v2-v1));
173 MatrixDim vertexMatrix(MatrixDim::Zero());
174 vertexMatrix.col(0)=v0-
h;
175 vertexMatrix.col(1)=v1-
h;
176 vertexMatrix.col(2)=v2-
h;
178 heightPoints.push_back(
h);
179 invVertexMatrix.push_back(vertexMatrix.inverse());
180 heightDisplacements.push_back(VectorDim::Zero());
183 defGradients.resize(
triangles.size(),MatrixDim::Identity());