13 std::vector<int> FindSpawnVerts(
const mesh &meshin, vector<int> &vertList, vector<int> &voluOutList,
int outerBorder)
23 int ii, ni, jj, nj, surfSurb, vert_i;
24 vector<int> offBorderVert, internalSurf, voluIndIntern;
28 meshin.GetOffBorderVert(offBorderVert, voluOutList, 1);
29 meshin.ElmOnParentBound(internalSurf, voluIndIntern,
false,
true);
31 else if (outerBorder == 0)
33 meshin.GetOffBorderVert(offBorderVert, voluOutList, 0);
34 meshin.ElmOnParentBound(internalSurf, voluIndIntern,
false,
false);
40 ni = meshin.verts.size();
43 ni = internalSurf.size();
45 cout <<
"Vertices : " << ni <<
" (interal), ";
46 for (ii = 0; ii < ni; ++ii)
48 surfSurb = meshin.surfs.find(internalSurf[ii]);
49 nj = meshin.surfs(surfSurb)->edgeind.size();
50 for (jj = 0; jj < nj; jj++)
52 vert_i = meshin.edges.isearch(meshin.surfs(surfSurb)->edgeind[jj])->vertind[0];
53 if (!meshin.verts.isearch(vert_i)->isBorder)
55 vertList.push_back(meshin.verts.isearch(vert_i)->index);
57 vert_i = meshin.edges.isearch(meshin.surfs(surfSurb)->edgeind[jj])->vertind[1];
58 if (!meshin.verts.isearch(vert_i)->isBorder)
60 vertList.push_back(meshin.verts.isearch(vert_i)->index);
66 unique(offBorderVert);
67 ni = offBorderVert.size();
68 cout << ni <<
" (border); " << endl;
69 for (ii = 0; ii < ni; ++ii)
71 vertList.push_back(offBorderVert[ii]);
77 ni = voluIndIntern.size();
78 for (ii = 0; ii < ni; ++ii)
80 voluOutList.push_back(voluIndIntern[ii]);
85 return (offBorderVert);
88 void SpawnSnakeAndMove(
snake &snakein, std::vector<int> vertSpawn)
93 snakein.snakeconn.size(nVe, nE, nS, nVo);
94 int nNew = vertSpawn.size();
96 snakein.reserve(nVe + nNew * 15, nE + nNew * 15, nS + nNew * 15, nVo + nNew * 1);
97 for (
int ii = 0; ii < nNew; ++ii)
99 SpawnAtVertex(snakein, vertSpawn[ii]);
104 int nTotSnax = snakein.snaxs.size();
105 for (
int ii = 0; ii < nVe; ++ii)
107 snakein.snaxs[ii].v = 0.0;
108 snakein.snaxs[ii].d = 0.5;
110 for (
int ii = nVe; ii < nTotSnax; ++ii)
112 snakein.snaxs[ii].v = 1.0;
114 snakein.CalculateTimeStep(dt, 0.51);
115 snakein.UpdateDistance(dt);
116 snakein.PrepareForUse();
117 snakein.UpdateCoord();
118 snakein.PrepareForUse();
119 snakein.SnaxImpactDetection(isImpact);
120 MergeAllContactVertices(snakein, isImpact);
121 snakein.PrepareForUse();
122 CleanupSnakeConnec(snakein);
123 snakein.PrepareForUse();
126 void SpawnRSVS(
snake &snakein,
int outerBorder)
138 vector<int> vertSpawn, borderVertSpawn;
139 vector<int> voluSnaxDelete;
140 vector<int> isImpact;
142 snakein.snakemesh()->SetBorders();
144 borderVertSpawn = FindSpawnVerts(*(snakein.snakemesh()), vertSpawn, voluSnaxDelete, outerBorder);
145 ni = vertSpawn.size();
147 snakein.reserve(ni * 15, ni * 15, ni * 15, ni * 15);
148 for (ii = 0; ii < ni; ++ii)
150 SpawnAtVertex(snakein, vertSpawn[ii]);
155 ni = snakein.snaxs.size();
156 for (ii = 0; ii < ni; ++ii)
158 snakein.snaxs[ii].v = 1.0;
160 snakein.CalculateTimeStep(dt, 0.6);
161 snakein.UpdateDistance(dt);
162 snakein.PrepareForUse();
163 snakein.UpdateCoord();
164 snakein.PrepareForUse();
167 snakein.SnaxImpactDetection(isImpact);
168 MergeAllContactVertices(snakein, isImpact);
169 snakein.PrepareForUse();
170 CleanupSnakeConnec(snakein);
171 snakein.PrepareForUse();
174 if (snakein.Check3D())
176 RemoveSnakeInVolu(snakein, voluSnaxDelete, outerBorder);
180 RemoveSnakeInSurf(snakein, voluSnaxDelete, outerBorder);
182 snakein.PrepareForUse();
185 if (outerBorder == 1)
187 SpawnSnakeAndMove(snakein, borderVertSpawn);
190 snakein.OrientFaces();
191 cout <<
"Initialisation DONE!" << endl;
194 void RemoveSnakeInVolu(
snake &snakein, vector<int> &voluInd,
int outerBorder)
196 int ii, ni, jj, nj, nBlocks;
197 vector<int> delSurf, delEdge, delSnax, tempSurf, tempEdge, tempSnax, subSurf, subEdge, vertBlocks;
198 vector<bool> isBlockDel;
200 delSurf.reserve(snakein.snaxsurfs.size());
201 delEdge.reserve(snakein.snaxedges.size());
202 delSnax.reserve(snakein.snaxs.size());
206 for (ii = 0; ii < ni; ++ii)
209 snakein.snaxsurfs.findsiblings(voluInd[ii], tempSurf);
210 tempEdge = ConcatenateVectorField(snakein.snakeconn.surfs, &surf::edgeind, tempSurf);
211 subEdge = snakein.snakeconn.edges.find_list(tempEdge);
213 tempSnax = ConcatenateVectorField(snakein.snakeconn.edges, &edge::vertind, subEdge);
214 nj = tempSnax.size();
215 for (jj = 0; jj < nj; ++jj)
217 delSnax.push_back(tempSnax[jj]);
224 bool delVertInVolu = outerBorder > 0;
225 isBlockDel.assign(nBlocks, !delVertInVolu);
227 for (ii = 0; ii < ni; ++ii)
229 isBlockDel[vertBlocks[snakein.snakeconn.verts.find(delSnax[ii])] - 1] = delVertInVolu;
235 ni = vertBlocks.size();
237 for (ii = 0; ii < ni; ++ii)
239 if (isBlockDel[vertBlocks[ii] - 1])
241 delSnax.push_back(snakein.snaxs(ii)->index);
243 subEdge = snakein.snakeconn.edges.find_list(snakein.snakeconn.verts(ii)->edgeind);
244 nj = snakein.snakeconn.verts(ii)->edgeind.size();
245 for (jj = 0; jj < nj; ++jj)
247 delEdge.push_back(snakein.snakeconn.verts(ii)->edgeind[jj]);
250 tempSurf = ConcatenateVectorField(snakein.snakeconn.edges, &edge::surfind, subEdge);
251 nj = tempSurf.size();
252 for (jj = 0; jj < nj; ++jj)
254 delSurf.push_back(tempSurf[jj]);
260 for (ii = 0; ii < ni; ++ii)
262 snakein.snakeconn.RemoveIndex(3, delSurf[ii]);
276 snakein.snaxs.remove(delSnax);
277 snakein.snaxedges.remove(delEdge);
278 snakein.snaxsurfs.remove(delSurf);
279 snakein.snakeconn.verts.remove(delSnax);
280 snakein.snakeconn.edges.remove(delEdge);
281 snakein.snakeconn.surfs.remove(delSurf);
283 snakein.snakeconn.TightenConnectivity();
285 snakein.snakeconn.TestConnectivityBiDir(__PRETTY_FUNCTION__);
286 snakein.ForceCloseContainers();
287 snakein.PrepareForUse();
294 snakein.AssignInternalVerts();
298 void RemoveSnakeInSurf(
snake &snakein, vector<int> &voluInd,
int outerBorder)
300 int ii, ni, jj, nj, nBlocks;
301 vector<int> delSurf, delEdge, delSnax, tempSurf, tempEdge, tempSnax, subSurf, subEdge, vertBlocks;
302 vector<bool> isBlockDel;
304 delSurf.reserve(snakein.snaxsurfs.size());
305 delEdge.reserve(snakein.snaxedges.size());
306 delSnax.reserve(snakein.snaxs.size());
310 for (ii = 0; ii < ni; ++ii)
313 snakein.snaxedges.findsiblings(voluInd[ii], subEdge);
318 tempSnax = ConcatenateVectorField(snakein.snakeconn.edges, &edge::vertind, subEdge);
319 nj = tempSnax.size();
320 for (jj = 0; jj < nj; ++jj)
322 delSnax.push_back(tempSnax[jj]);
329 bool delVertInVolu = outerBorder > 0;
330 isBlockDel.assign(nBlocks, !delVertInVolu);
332 for (ii = 0; ii < ni; ++ii)
334 isBlockDel[vertBlocks[snakein.snakeconn.verts.find(delSnax[ii])] - 1] = delVertInVolu;
340 ni = vertBlocks.size();
342 for (ii = 0; ii < ni; ++ii)
344 if (isBlockDel[vertBlocks[ii] - 1])
346 delSnax.push_back(snakein.snaxs(ii)->index);
348 subEdge = snakein.snakeconn.edges.find_list(snakein.snakeconn.verts(ii)->edgeind);
349 nj = snakein.snakeconn.verts(ii)->edgeind.size();
350 for (jj = 0; jj < nj; ++jj)
352 delEdge.push_back(snakein.snakeconn.verts(ii)->edgeind[jj]);
363 for (ii = 0; ii < ni; ++ii)
365 snakein.snakeconn.RemoveIndex(2, delEdge[ii]);
379 snakein.snaxs.remove(delSnax);
380 snakein.snaxedges.remove(delEdge);
382 snakein.snakeconn.verts.remove(delSnax);
383 snakein.snakeconn.edges.remove(delEdge);
386 snakein.snakeconn.TightenConnectivity();
388 snakein.snakeconn.TestConnectivityBiDir(__PRETTY_FUNCTION__);
389 snakein.ForceCloseContainers();
390 snakein.PrepareForUse();
397 snakein.AssignInternalVerts();
Functions which are part of the RSVS algorithm but not core to the snaking process.
int ConnectedVertex(std::vector< int > &vertBlock) const
Return in a vector for each vertex a block number which it is part of.
Provides the core restricted surface snake container.
Functions needed to evolve the r-surface snake.
Provides the error and warning system used by the RSVS3D project.
#define RSVS3D_ERROR_ARGUMENT(M)
Throw a invalid_argument.