23#ifndef VCL_ALGORITHMS_MESH_UPDATE_TOPOLOGY_H
24#define VCL_ALGORITHMS_MESH_UPDATE_TOPOLOGY_H
26#include <vclib/algorithms/mesh/sort.h>
28#include <vclib/mesh.h>
48template<u
int ELEM_ID, FaceMeshConcept MeshType>
49void clearPerElementAdjacentFaces(MeshType& mesh)
51 requirePerElementComponent<ELEM_ID, CompId::ADJACENT_FACES>(mesh);
53 using AdjacentFacesType = comp::ComponentTypeFromID<
54 CompId::ADJACENT_FACES,
55 typename MeshType::template ElementType<ELEM_ID>::Components>;
57 for (
auto& e : mesh.template elements<ELEM_ID>()) {
58 if constexpr (comp::IsTiedToVertexNumber<AdjacentFacesType>) {
59 for (uint i = 0; i < e.adjFacesNumber(); ++i) {
60 e.setAdjFace(i,
nullptr);
84template<u
int ELEM_ID, EdgeMeshConcept MeshType>
85void clearPerElementAdjacentEdges(MeshType& mesh)
87 requirePerElementComponent<ELEM_ID, CompId::ADJACENT_EDGES>(mesh);
89 using AdjacentEdgesType = comp::ComponentTypeFromID<
90 CompId::ADJACENT_EDGES,
91 typename MeshType::template ElementType<ELEM_ID>::Components>;
93 for (
auto& e : mesh.template elements<ELEM_ID>()) {
94 if constexpr (comp::IsTiedToVertexNumber<AdjacentEdgesType>) {
95 for (uint i = 0; i < e.adjEdgesNumber(); ++i) {
96 e.setAdjEdges(i,
nullptr);
117template<u
int ELEM_ID, MeshConcept MeshType>
118void clearPerElementAdjacentVertices(MeshType& mesh)
120 requirePerElementComponent<ELEM_ID, CompId::ADJACENT_VERTICES>(mesh);
122 for (
auto& e : mesh.template elements<ELEM_ID>()) {
123 e.clearAdjVertices();
138template<FaceMeshConcept MeshType>
139void clearPerVertexAdjacentFaces(MeshType& mesh)
141 clearPerElementAdjacentFaces<ElemId::VERTEX>(mesh);
152template<FaceMeshConcept MeshType>
153void updatePerVertexAdjacentFaces(MeshType& mesh)
155 clearPerVertexAdjacentFaces(mesh);
157 using VertexType = MeshType::VertexType;
158 using FaceType = MeshType::FaceType;
160 for (VertexType& v : mesh.
vertices()) {
164 for (FaceType& f : mesh.
faces()) {
165 for (VertexType* v : f.
vertices()) {
183template<MeshConcept MeshType>
184void clearPerVertexAdjacentVertices(MeshType& mesh)
186 clearPerElementAdjacentVertices<ElemId::VERTEX>(mesh);
200template<MeshConcept MeshType>
201void updatePerVertexAdjacentVertices(
203 bool includeOnlyFaces =
false)
205 clearPerVertexAdjacentVertices(mesh);
207 using VertexType = MeshType::VertexType;
209 if constexpr (FaceMeshConcept<MeshType>) {
215 std::vector<MeshEdgeUtil<MeshType>> vec =
216 fillAndSortMeshEdgeUtilVector(mesh);
219 VertexType* v1 =
nullptr;
220 VertexType* v2 =
nullptr;
221 for (uint i = 0; i < vec.size(); ++i) {
223 if (vec[i].v[0] != v1 || vec[i].v[1] != v2) {
227 v1->pushAdjVertex(v2);
228 v2->pushAdjVertex(v1);
233 if (!includeOnlyFaces) {
234 if constexpr (EdgeMeshConcept<MeshType>) {
235 using EdgeType = MeshType::EdgeType;
237 for (EdgeType& e : mesh.
edges()) {
239 if (!e.vertex(0)->containsAdjVertex(e.vertex(1)))
240 e.vertex(0)->pushAdjVertex(e.vertex(1));
241 if (!e.vertex(1)->containsAdjVertex(e.vertex(0)))
242 e.vertex(1)->pushAdjVertex(e.vertex(0));
259template<EdgeMeshConcept MeshType>
260void clearPerVertexAdjacentEdges(MeshType& mesh)
262 clearPerElementAdjacentEdges<ElemId::VERTEX>(mesh);
273template<EdgeMeshConcept MeshType>
274void updatePerVertexAdjacentEdges(MeshType& mesh)
276 clearPerVertexAdjacentEdges(mesh);
278 using EdgeType = MeshType::EdgeType;
280 for (EdgeType& e : mesh.
edges()) {
281 e.vertex(0)->pushAdjEdge(&e);
282 e.vertex(1)->pushAdjEdge(&e);
298template<FaceMeshConcept MeshType>
299void clearPerFaceAdjacentFaces(MeshType& mesh)
301 clearPerElementAdjacentFaces<ElemId::FACE>(mesh);
345template<FaceMeshConcept MeshType>
346void updatePerFaceAdjacentFaces(MeshType& mesh)
354 std::vector<MeshEdgeUtil<MeshType>> vec =
355 fillAndSortMeshEdgeUtilVector(mesh);
357 if (vec.size() > 0) {
361 for (
auto base = vec.begin(); base != vec.end();) {
369 if (j != vec.end()) {
372 i->f->setAdjFace(i->e,
nullptr);
375 while (j != vec.end() && *i == *j) {
376 i->f->setAdjFace(i->e, j->f);
381 i->f->setAdjFace(i->e, first->f);
409template<FaceMeshConcept MeshType>
410void clearPerFaceAdjacentEdges(MeshType& mesh)
411 requires EdgeMeshConcept<MeshType>
413 clearPerElementAdjacentEdges<ElemId::FACE>(mesh);
435template<FaceMeshConcept MeshType>
436void updatePerFaceAdjacentEdges(MeshType& mesh)
437 requires EdgeMeshConcept<MeshType>
439 using FaceType = MeshType::FaceType;
441 using AdjacentEdgesType = comp::ComponentTypeFromID<
442 CompId::ADJACENT_EDGES,
443 typename FaceType::Components>;
445 clearPerFaceAdjacentEdges(mesh);
448 std::vector<MeshEdgeUtil<MeshType>> vec =
449 fillAndSortMeshEdgeUtilVector(mesh);
451 for (
auto& e : mesh.
edges()) {
452 MeshEdgeUtil<MeshType> meu(e.vertex(0), e.vertex(1));
455 auto it = std::lower_bound(vec.begin(), vec.end(), meu);
457 while (it != vec.end() && *it == meu) {
459 if constexpr (comp::IsTiedToVertexNumber<AdjacentEdgesType>) {
460 f->setAdjEdges(it->e, &e);
481template<EdgeMeshConcept MeshType>
482void clearPerEdgeAdjacentFaces(MeshType& mesh)
483 requires FaceMeshConcept<MeshType>
485 clearPerElementAdjacentFaces<ElemId::EDGE>(mesh);
499template<EdgeMeshConcept MeshType>
500void updatePerEdgeAdjacentFaces(MeshType& mesh)
501 requires FaceMeshConcept<MeshType>
503 clearPerEdgeAdjacentFaces(mesh);
506 std::vector<MeshEdgeUtil<MeshType>> vec =
507 fillAndSortMeshEdgeUtilVector(mesh);
509 for (
auto& e : mesh.
edges()) {
510 MeshEdgeUtil<MeshType> meu(e.vertex(0), e.vertex(1));
513 auto it = std::lower_bound(vec.begin(), vec.end(), meu);
515 while (it != vec.end() && *it == meu) {
534template<EdgeMeshConcept MeshType>
535void clearPerEdgeAdjacentEdges(MeshType& mesh)
537 clearPerElementAdjacentEdges<ElemId::EDGE>(mesh);
547template<EdgeMeshConcept MeshType>
548void updatePerEdgeAdjacentEdges(MeshType& mesh)
550 using EdgeType = MeshType::EdgeType;
553 std::vector<std::list<EdgeType*>> edgeMap(mesh.vertexContainerSize());
555 clearPerEdgeAdjacentEdges(mesh);
557 for (EdgeType& e : mesh.
edges()) {
558 edgeMap[e.vertex(0)->index()].push_back(&e);
559 edgeMap[e.vertex(1)->index()].push_back(&e);
562 for (
const std::list<EdgeType*>& edges : edgeMap) {
564 for (
auto it1 =
edges.begin(); it1 !=
edges.end(); ++it1) {
565 for (
auto it2 = std::next(it1); it2 !=
edges.end(); ++it2) {
566 (*it1)->pushAdjEdge(*it2);
567 (*it2)->pushAdjEdge(*it1);
void requirePerFaceAdjacentFaces(const MeshType &m)
This function asserts that a Mesh has a FaceContainer, the Face has a AdjacentFaces Component,...
Definition face_requirements.h:1037
constexpr detail::FacesView faces
A view that allows to iterate overt the Face elements of an object.
Definition face.h:84
constexpr detail::EdgesView edges
A view that allows to iterate overt the Edge elements of an object.
Definition edge.h:84
constexpr detail::VerticesView vertices
A view that allows to iterate over the Vertex elements of an object.
Definition vertex.h:92