33 if (M.type == MeshType::TET)
36 idx.element_patch = 0;
37 idx.face = M.HF(0, hi);
39 idx.vertex = M.FV(0, idx.face);
40 idx.edge = M.FE(0, idx.face);
42 if (M.elements[hi].fs_flag[idx.element_patch])
43 idx.edge = M.FE(2, idx.face);
46 else if (M.elements[hi].hex)
56 vector<uint32_t> fvs, fvs_;
57 fvs.insert(fvs.end(), M.elements[hi].vs.begin(), M.elements[hi].vs.begin() + 4);
58 sort(fvs.begin(), fvs.end());
59 idx.element_patch = -1;
61 for (uint32_t i = 0; i < 6; i++)
63 idx.element_patch = i;
64 fvs_ = M.faces[M.elements[hi].fs[i]].vs;
65 sort(fvs_.begin(), fvs_.end());
66 if (std::equal(fvs.begin(), fvs.end(), fvs_.begin()))
69 idx.face = M.elements[hi].fs[idx.element_patch];
71 idx.vertex = M.elements[hi].vs[0];
72 idx.face_corner =
find(M.faces[idx.face].vs.begin(), M.faces[idx.face].vs.end(), idx.vertex) - M.faces[idx.face].vs.begin();
74 int v0 = idx.vertex, v1 = M.elements[hi].vs[1];
75 const vector<uint32_t> &ves0 = M.vertices[v0].neighbor_es, &ves1 = M.vertices[v1].neighbor_es;
76 std::array<uint32_t, 2> sharedes;
79 idx.edge = sharedes[0];
95 if (hi >= M.elements.size())
96 hi = hi % M.elements.size();
99 if (lf >= M.elements[hi].fs.size())
100 lf = lf % M.elements[hi].fs.size();
101 idx.element_patch = lf;
102 idx.face = M.elements[hi].fs[idx.element_patch];
104 if (lv >= M.faces[idx.face].vs.size())
105 lv = lv % M.faces[idx.face].vs.size();
106 idx.face_corner = lv;
107 idx.vertex = M.faces[idx.face].vs[idx.face_corner];
109 int ei = idx.face_corner;
110 if (M.elements[hi].fs_flag[idx.element_patch])
111 ei = (idx.face_corner + M.faces[idx.face].vs.size() - 1) % M.faces[idx.face].vs.size();
112 idx.edge = M.faces[idx.face].es[ei];
129 if (M.type == MeshType::TET)
131 for (
int i = 0; i < 4; i++)
133 const auto &fid = M.HF(i, idx.element);
134 for (
int j = 0; j < 3; j++)
136 const auto &eid = M.FE(j, fid);
137 assert(M.EV(0, eid) < M.EV(1, eid));
138 if (M.EV(0, eid) == v0 && M.EV(1, eid) == v1)
140 idx.element_patch = i;
143 if (M.FV(0, fid) == idx.vertex)
145 else if (M.FV(1, fid) == idx.vertex)
150 assert(idx.vertex == v0i);
152 assert(idx.element == hi);
161 for (
int i = 0; i < M.elements[hi].fs.size(); i++)
163 const auto &fid = M.elements[hi].fs[i];
164 for (
int j = 0; j < M.faces[fid].es.size(); j++)
166 const auto &eid = M.faces[fid].es[j];
167 assert(M.edges[eid].vs[0] < M.edges[eid].vs[1]);
168 if (M.edges[eid].vs[0] == v0 && M.edges[eid].vs[1] == v1)
170 idx.element_patch = i;
173 for (
int k = 0; k < M.faces[fid].vs.size(); k++)
174 if (M.faces[fid].vs[k] == idx.vertex)
177 assert(idx.vertex == v0i);
179 assert(idx.element == hi);
200 int v0_ = v0, v1_ = v1;
215 if (M.type == MeshType::TET)
217 for (
int i = 0; i < 4; i++)
219 const auto &fid = M.HF(i, idx.element);
220 int fv0 = M.FV(0, fid), fv1 = M.FV(1, fid), fv2 = M.FV(2, fid);
232 if (v0 != fv0 || v1 != fv1 || v2 != fv2)
236 idx.element_patch = i;
238 for (
int j = 0; j < 3; j++)
240 const auto &eid = M.FE(j, fid);
241 assert(M.EV(0, eid) < M.EV(1, eid));
242 if (M.EV(0, eid) == v0_ && M.EV(1, eid) == v1_)
245 if (M.FV(0, fid) == idx.vertex)
247 else if (M.FV(1, fid) == idx.vertex)
252 assert(idx.vertex == v0i);
262 assert(M.elements[idx.element].fs.size() == 4 || M.elements[idx.element].fs.size() == 5);
263 for (
int i = 0; i < M.elements[idx.element].fs.size(); i++)
265 const auto fid = M.elements[idx.element].fs[i];
266 const auto &fvid = M.faces[fid].vs;
267 if (fvid.size() != 3)
269 int fv0 = fvid[0], fv1 = fvid[1], fv2 = fvid[2];
281 if (v0 != fv0 || v1 != fv1 || v2 != fv2)
285 idx.element_patch = i;
287 for (
int j = 0; j < 3; j++)
289 const auto eid = M.faces[fid].es[j];
290 const auto &veid = M.edges[eid].vs;
291 assert(veid[0] < veid[1]);
292 if (veid[0] == v0_ && veid[1] == v1_)
295 if (fvid[0] == idx.vertex)
297 else if (fvid[1] == idx.vertex)
302 assert(idx.vertex == v0i);
318 if (M.type == MeshType::TET)
320 if (idx.vertex == M.EV(0, idx.edge))
321 idx.vertex = M.EV(1, idx.edge);
323 idx.vertex = M.EV(0, idx.edge);
325 if (M.FV(0, idx.face) == idx.vertex)
327 else if (M.FV(1, idx.face) == idx.vertex)
334 if (idx.vertex == M.edges[idx.edge].vs[0])
335 idx.vertex = M.edges[idx.edge].vs[1];
337 idx.vertex = M.edges[idx.edge].vs[0];
339 int &corner = idx.face_corner, n = M.faces[idx.face].vs.size(), corner_1 = (corner - 1 + n) % n, corner1 = (corner + 1) % n;
340 if (M.faces[idx.face].vs[corner1] == idx.vertex)
341 idx.face_corner = corner1;
342 else if (M.faces[idx.face].vs[corner_1] == idx.vertex)
343 idx.face_corner = corner_1;
353 if (M.type == MeshType::TET)
355 if (idx.edge == M.FE(idx.face_corner, idx.face))
356 idx.edge = M.FE((idx.face_corner + 2) % 3, idx.face);
358 idx.edge = M.FE(idx.face_corner, idx.face);
362 int n = M.faces[idx.face].vs.size();
363 if (idx.edge == M.faces[idx.face].es[idx.face_corner])
364 idx.edge = M.faces[idx.face].es[(idx.face_corner - 1 + n) % n];
366 idx.edge = M.faces[idx.face].es[idx.face_corner];
375 if (M.type == MeshType::TET)
377 for (
int i = 0; i < 4; i++)
379 const auto &fid = M.HF(i, idx.element);
382 if (M.FE(0, fid) == idx.edge || M.FE(1, fid) == idx.edge || M.FE(2, fid) == idx.edge)
385 idx.element_patch = i;
386 if (M.FV(0, fid) == idx.vertex)
388 else if (M.FV(1, fid) == idx.vertex)
398 const vector<uint32_t> &efs = M.edges[idx.edge].neighbor_fs, &hfs = M.elements[idx.element].fs;
399 std::array<uint32_t, 2> sharedfs;
402 if (sharedfs[0] == idx.face)
403 idx.face = sharedfs[1];
405 idx.face = sharedfs[0];
406 for (
int i = 0; i < hfs.size(); i++)
407 if (idx.face == hfs[i])
409 idx.element_patch = i;
413 const vector<uint32_t> &fvs = M.faces[idx.face].vs;
414 for (
int i = 0; i < fvs.size(); i++)
415 if (idx.vertex == fvs[i])
431 if (M.type == MeshType::TET)
433 if (M.FH(1, idx.face) == -1)
438 if (M.FH(0, idx.face) == idx.element)
440 idx.element = M.FH(1, idx.face);
441 idx.element_patch = M.FHi(1, idx.face);
445 idx.element = M.FH(0, idx.face);
446 idx.element_patch = M.FHi(0, idx.face);
451 if (M.faces[idx.face].neighbor_hs.size() == 1)
458 if (M.faces[idx.face].neighbor_hs[0] == idx.element)
459 idx.element = M.faces[idx.face].neighbor_hs[1];
461 idx.element = M.faces[idx.face].neighbor_hs[0];
463 const vector<uint32_t> &fs = M.elements[idx.element].fs;
464 for (
int i = 0; i < fs.size(); i++)
465 if (idx.face == fs[i])
467 idx.element_patch = i;