MCPcopy Create free account
hub / github.com/MeshInspector/MeshLib / merge

Method merge

source/MRMesh/MRGraph.cpp:44–109  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

42}
43
44void Graph::merge( VertId remnant, VertId dead, std::function<void(EdgeId, EdgeId)> onMergeEdges )
45{
46 assert( remnant.valid() && validVerts_.test( remnant ) );
47 assert( dead.valid() && validVerts_.test( dead ) );
48 assert( remnant != dead );
49 validVerts_.reset( dead );
50
51 struct NeiEdge
52 {
53 VertId nei;
54 EdgeId e;
55 auto operator<=>(const NeiEdge&) const = default;
56 };
57 std::vector<NeiEdge> neiEdges;
58 neiEdges.reserve( neighboursPerVertex_[remnant].size() + neighboursPerVertex_[dead].size() );
59 for ( auto e : neighboursPerVertex_[remnant] )
60 {
61 const auto ends = endsPerEdge_[e];
62 const auto nei = ends.otherEnd( remnant );
63 if ( nei == dead )
64 {
65 validEdges_.reset( e );
66 continue;
67 }
68 neiEdges.push_back( { nei, e } );
69 }
70 for ( auto e : neighboursPerVertex_[dead] )
71 {
72 auto & ends = endsPerEdge_[e];
73 const auto nei = ends.otherEnd( dead );
74 if ( nei == remnant )
75 {
76 validEdges_.reset( e );
77 continue;
78 }
79 ends.replaceEnd( dead, remnant );
80 neiEdges.push_back( { nei, e } );
81 }
82 std::sort( neiEdges.begin(), neiEdges.end() );
83
84 // reuse the memory for neighbors
85 Neighbours neis;
86 if ( neighboursPerVertex_[remnant].size() >= neighboursPerVertex_[dead].size() )
87 neis = std::move( neighboursPerVertex_[remnant] );
88 else
89 neis = std::move( neighboursPerVertex_[dead] );
90 neis.clear();
91 neighboursPerVertex_[dead] = {};
92
93 for ( const auto & x : neiEdges )
94 {
95 if ( neis.empty() || endsPerEdge_[neis.back()].otherEnd( remnant ) != x.nei )
96 {
97 assert( validEdges_.test( x.e ) );
98 neis.push_back( x.e );
99 continue;
100 }
101 validEdges_.reset( x.e );

Callers 3

joinMethod · 0.45
simulateOneMethod · 0.45
mergeNext_Method · 0.45

Calls 12

otherEndMethod · 0.80
push_backMethod · 0.80
replaceEndMethod · 0.80
validMethod · 0.45
testMethod · 0.45
resetMethod · 0.45
reserveMethod · 0.45
sizeMethod · 0.45
beginMethod · 0.45
endMethod · 0.45
clearMethod · 0.45
emptyMethod · 0.45

Tested by

no test coverage detected