From 10c7d94825bb0d8dec3733a0269dcebfe44306ea Mon Sep 17 00:00:00 2001 From: Pierre Kraemer Date: Fri, 11 Feb 2011 14:27:52 +0100 Subject: [PATCH] =?UTF-8?q?ImplicitMaps=20->=20simplification=20coarsenEdg?= =?UTF-8?q?e=20+=20collapseEdge=20retourne=20un=20brin=20du=20sommet=20r?= =?UTF-8?q?=C3=A9sultat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/Algo/ImplicitHierarchicalMesh/ihm.hpp | 4 ++ .../ImplicitHierarchicalMesh/subdivision.hpp | 8 ++-- include/Container/attribmv.hpp | 5 +-- include/Topology/generic/embeddedMap2.h | 2 +- include/Topology/generic/embeddedMap2.hpp | 10 ++--- include/Topology/gmap/gmap2.h | 3 +- include/Topology/map/map2.h | 5 ++- src/Algo/ImplicitHierarchicalMesh/ihm.cpp | 9 ++++- src/Topology/gmap/gmap2.cpp | 39 +++++++++++++++---- src/Topology/map/map2.cpp | 39 +++++++++++++++---- 10 files changed, 91 insertions(+), 33 deletions(-) diff --git a/include/Algo/ImplicitHierarchicalMesh/ihm.hpp b/include/Algo/ImplicitHierarchicalMesh/ihm.hpp index 7e64938b7..36a718d92 100644 --- a/include/Algo/ImplicitHierarchicalMesh/ihm.hpp +++ b/include/Algo/ImplicitHierarchicalMesh/ihm.hpp @@ -333,6 +333,10 @@ inline unsigned int ImplicitHierarchicalMap::edgeLevel(Dart d) return ld < ldd ? ldd : ld ; // insertion levels of its two darts } +/*************************************************** + * ATTRIBUTE HANDLER * + ***************************************************/ + template T& AttributeHandler_IHM::operator[](Dart d) { diff --git a/include/Algo/ImplicitHierarchicalMesh/subdivision.hpp b/include/Algo/ImplicitHierarchicalMesh/subdivision.hpp index 4cf8fba3a..9cbe9ccc5 100644 --- a/include/Algo/ImplicitHierarchicalMesh/subdivision.hpp +++ b/include/Algo/ImplicitHierarchicalMesh/subdivision.hpp @@ -149,11 +149,9 @@ void coarsenEdge(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position) unsigned int cur = map.getCurrentLevel() ; Dart d2 = map.phi2(d) ; map.setCurrentLevel(cur + 1) ; - map.unsewFaces(d) ; - map.unsewFaces(d2) ; - map.collapseEdge(map.phi1(d)) ; - map.collapseEdge(map.phi1(d2)) ; - map.sewFaces(d, d2) ; + unsigned int dl = map.getDartLevel(d2) ; + map.setDartLevel(map.phi1(d2), dl) ; + map.collapseEdge(d2) ; map.setCurrentLevel(cur) ; } diff --git a/include/Container/attribmv.hpp b/include/Container/attribmv.hpp index e3bf58a92..026a26dea 100644 --- a/include/Container/attribmv.hpp +++ b/include/Container/attribmv.hpp @@ -173,13 +173,13 @@ void AttribMultiVect::addBlock() template void AttribMultiVect::initElt(unsigned int id) { - m_tableData[id/_BLOCKSIZE_][id%_BLOCKSIZE_] = T(0); + m_tableData[id/_BLOCKSIZE_][id%_BLOCKSIZE_] = T(0); } template void AttribMultiVect::copyElt(unsigned int dst, unsigned int src) { - m_tableData[dst/_BLOCKSIZE_][dst%_BLOCKSIZE_] = m_tableData[src/_BLOCKSIZE_][src%_BLOCKSIZE_]; + m_tableData[dst/_BLOCKSIZE_][dst%_BLOCKSIZE_] = m_tableData[src/_BLOCKSIZE_][src%_BLOCKSIZE_]; } template @@ -192,7 +192,6 @@ void AttribMultiVect::setNbBlocks(unsigned int nbb) // T* ptr = new T[_BLOCKSIZE_]; // m_tableData.push_back( ptr ); addBlock(); - } } else diff --git a/include/Topology/generic/embeddedMap2.h b/include/Topology/generic/embeddedMap2.h index af934a229..820da6a72 100644 --- a/include/Topology/generic/embeddedMap2.h +++ b/include/Topology/generic/embeddedMap2.h @@ -76,7 +76,7 @@ public: * See 'collapseDegeneratedFace' to see what can happen to edges attributes * Nothing has to be done for the faces (some degenerate ones can be deleted) */ - virtual void collapseEdge(Dart d, bool delDegenerateFaces = true) ; + virtual Dart collapseEdge(Dart d, bool delDegenerateFaces = true) ; /** * No cell is created or deleted diff --git a/include/Topology/generic/embeddedMap2.hpp b/include/Topology/generic/embeddedMap2.hpp index c87e1bc0b..87deb0a33 100644 --- a/include/Topology/generic/embeddedMap2.hpp +++ b/include/Topology/generic/embeddedMap2.hpp @@ -184,22 +184,22 @@ bool EmbeddedMap2::edgeCanCollapse(Dart d) } template -void EmbeddedMap2::collapseEdge(Dart d, bool delDegenerateFaces) +Dart EmbeddedMap2::collapseEdge(Dart d, bool delDegenerateFaces) { - Dart dPrev2 = MAP2::phi2(MAP2::phi_1(d)) ; - unsigned int vEmb = EMBNULL ; if (MAP2::isOrbitEmbedded(VERTEX_ORBIT)) { vEmb = MAP2::getEmbedding(d, VERTEX_ORBIT) ; } - MAP2::collapseEdge(d, delDegenerateFaces); + Dart dV = MAP2::collapseEdge(d, delDegenerateFaces); if (MAP2::isOrbitEmbedded(VERTEX_ORBIT)) { - MAP2::embedOrbit(VERTEX_ORBIT, dPrev2, vEmb) ; + MAP2::embedOrbit(VERTEX_ORBIT, dV, vEmb) ; } + + return dV ; } template diff --git a/include/Topology/gmap/gmap2.h b/include/Topology/gmap/gmap2.h index 9a6e7ec0f..75f82df49 100644 --- a/include/Topology/gmap/gmap2.h +++ b/include/Topology/gmap/gmap2.h @@ -120,8 +120,9 @@ public: * was the only link between two border faces * @param d a dart in the deleted edge * @param delDegenerateFaces a boolean (default to true) + * @return a dart of the resulting vertex */ - virtual void collapseEdge(Dart d, bool delDegenerateFaces); + virtual Dart collapseEdge(Dart d, bool delDegenerateFaces); /** * Flip the edge of d. (rotation in phi1 order) diff --git a/include/Topology/map/map2.h b/include/Topology/map/map2.h index fc23efd81..ce4a141f0 100644 --- a/include/Topology/map/map2.h +++ b/include/Topology/map/map2.h @@ -132,14 +132,15 @@ public: //! Collapse an edge (that is deleted) possibly merging its vertices /*! If delDegenerateFaces is true, the method checks that no degenerate - * faces are build (faces with less than 3 edges). If it occurs the faces + * faces are built (faces with less than 3 edges). If it occurs the faces * are deleted and the adjacencies are updated (see collapseDegeneratedFace). * \warning This may produce two distinct vertices if the edge * was the only link between two border faces * @param d a dart in the deleted edge * @param delDegenerateFaces a boolean (default to true) + * @return a dart of the resulting vertex */ - virtual void collapseEdge(Dart d, bool delDegenerateFaces = true); + virtual Dart collapseEdge(Dart d, bool delDegenerateFaces = true); /** * Flip the edge of d. (rotation in phi1 order) diff --git a/src/Algo/ImplicitHierarchicalMesh/ihm.cpp b/src/Algo/ImplicitHierarchicalMesh/ihm.cpp index e52c0bb1e..10c4b5745 100644 --- a/src/Algo/ImplicitHierarchicalMesh/ihm.cpp +++ b/src/Algo/ImplicitHierarchicalMesh/ihm.cpp @@ -147,8 +147,13 @@ unsigned int ImplicitHierarchicalMap::faceLevel(Dart d) ++nbSubd ; // is treated here it = phi1(it) ; } while(m_edgeId[it] == eId) ; -// fLevel -= (unsigned int)(log2(nbSubd)) ; // PB WINDOWS log2 n'existe pas sous Visual 2010 !! - fLevel -= (unsigned int)(log((double)nbSubd)/log(2.0)) ; + + while(nbSubd > 1) + { + nbSubd /= 2 ; + --fLevel ; + } + m_curLevel = cur ; return fLevel ; diff --git a/src/Topology/gmap/gmap2.cpp b/src/Topology/gmap/gmap2.cpp index f738f0ecd..fe3e813de 100644 --- a/src/Topology/gmap/gmap2.cpp +++ b/src/Topology/gmap/gmap2.cpp @@ -86,14 +86,24 @@ void GMap2::cutEdge(Dart d) } } -void GMap2::collapseEdge(Dart d, bool delDegenerateFaces = true) +Dart GMap2::collapseEdge(Dart d, bool delDegenerateFaces = true) { - Dart f; // A dart in the face to check - Dart e = phi2(d); // Test if an opposite edge exists - if (e != d) + Dart resV ; + + Dart e = phi2(d); + if (e != d) // Test if an opposite edge exists { - f = phi1(e); // A dart in the face of e - phi2unsew(d); // Unlink the opposite edges + phi2unsew(d); // Unlink the opposite edges + Dart f = phi1(e) ; + Dart g = phi_1(e) ; + + if(!isFaceTriangle(e)) + resV = f ; + else if(phi2(g) != g) + resV = phi2(g) ; + else if(phi2(f) != f) + resV = phi1(phi2(f)) ; + if (f != e && delDegenerateFaces) { GMap1::collapseEdge(e); // Collapse edge e @@ -102,7 +112,20 @@ void GMap2::collapseEdge(Dart d, bool delDegenerateFaces = true) else GMap1::collapseEdge(e); // Just collapse edge e } - f = phi1(d); // A dart in the face of d + + Dart f = phi1(d) ; + Dart g = phi_1(d) ; + + if(resV == Dart::nil()) + { + if(!isFaceTriangle(d)) + resV = f ; + else if(phi2(g) != g) + resV = phi2(g) ; + else if(phi2(f) != f) + resV = phi1(phi2(f)) ; + } + if (f != d && delDegenerateFaces) { GMap1::collapseEdge(d); // Collapse edge d @@ -110,6 +133,8 @@ void GMap2::collapseEdge(Dart d, bool delDegenerateFaces = true) } else GMap1::collapseEdge(d); // Just collapse edge d + + return resV ; } bool GMap2::flipEdge(Dart d) diff --git a/src/Topology/map/map2.cpp b/src/Topology/map/map2.cpp index 3a5407401..e611910eb 100644 --- a/src/Topology/map/map2.cpp +++ b/src/Topology/map/map2.cpp @@ -88,14 +88,24 @@ void Map2::cutEdge(Dart d) } } -void Map2::collapseEdge(Dart d, bool delDegenerateFaces) +Dart Map2::collapseEdge(Dart d, bool delDegenerateFaces) { - Dart f; // A dart in the face to check - Dart e = phi2(d); // Test if an opposite edge exists - if (e != d) + Dart resV ; + + Dart e = phi2(d); + if (e != d) // Test if an opposite edge exists { - f = phi1(e); // A dart in the face of e - phi2unsew(d); // Unlink the opposite edges + phi2unsew(d); // Unlink the opposite edges + Dart f = phi1(e) ; + Dart g = phi_1(e) ; + + if(!isFaceTriangle(e)) + resV = f ; + else if(phi2(g) != g) + resV = phi2(g) ; + else if(phi2(f) != f) + resV = phi1(phi2(f)) ; + if (f != e && delDegenerateFaces) { Map1::collapseEdge(e); // Collapse edge e @@ -104,7 +114,20 @@ void Map2::collapseEdge(Dart d, bool delDegenerateFaces) else Map1::collapseEdge(e); // Just collapse edge e } - f = phi1(d); // A dart in the face of d + + Dart f = phi1(d) ; + Dart g = phi_1(d) ; + + if(resV == Dart::nil()) + { + if(!isFaceTriangle(d)) + resV = f ; + else if(phi2(g) != g) + resV = phi2(g) ; + else if(phi2(f) != f) + resV = phi1(phi2(f)) ; + } + if (f != d && delDegenerateFaces) { Map1::collapseEdge(d); // Collapse edge d @@ -112,6 +135,8 @@ void Map2::collapseEdge(Dart d, bool delDegenerateFaces) } else Map1::collapseEdge(d); // Just collapse edge d + + return resV ; } bool Map2::flipEdge(Dart d) -- GitLab