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

Method cascadeIter_

source/MRMesh/MRMultiwayICP.cpp:1014–1077  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1012}
1013
1014bool MultiwayICP::cascadeIter_( bool p2pl /*= true */ )
1015{
1016 for ( ICPLayer l = 0; l < pairsGridPerLayer_.size(); ++l )
1017 {
1018 updateLayerPairs_( l );
1019
1020 const auto& pairsOnLayer = pairsGridPerLayer_[l];
1021 auto numHyperGroups = cascadeIndexer_->getNumElements( l + 1 );
1022
1023 for ( ICPElementId hgI( 0 ); hgI < numHyperGroups; ++hgI )
1024 {
1025 auto nodes = cascadeIndexer_->getElementNodes( l + 1, hgI );
1026 assert( nodes.any() );
1027 auto numNodes = nodes.count();
1028 if ( numNodes == 1 )
1029 continue;
1030
1031 int indI = 0;
1032 MultiwayAligningTransform mat;
1033 mat.reset( int( numNodes ) );
1034 for ( auto nodeI : nodes )
1035 {
1036 int indJ = 0;
1037 for ( auto nodeJ : nodes )
1038 {
1039 if ( nodeI == nodeJ )
1040 {
1041 ++indJ;
1042 continue;
1043 }
1044 const auto& pairs = pairsOnLayer[nodeI][nodeJ];
1045 for ( auto idx : pairs.active )
1046 {
1047 const auto& data = pairs.vec[idx];
1048 if ( p2pl )
1049 mat.add( indI, data.srcPoint, indJ, data.tgtPoint, data.tgtNorm, data.weight );
1050 else
1051 mat.add( indI, data.srcPoint, indJ, data.tgtPoint, data.weight );
1052 }
1053 ++indJ;
1054 }
1055 ++indI;
1056 }
1057
1058 MultiwayAligningTransform::Stabilizer stabilizer;
1059 stabilizer.rot = samplingSize_;
1060 stabilizer.shift = 1e-2f;
1061 auto res = mat.solve( stabilizer );
1062 indI = 0;
1063 for ( auto nodeI : nodes )
1064 {
1065 auto resI = res[indI].rigidXf();
1066 if ( std::isnan( resI.b.x ) )
1067 return false;
1068 const auto& leaves = cascadeIndexer_->getElementLeaves( l, nodeI );
1069 for ( auto objId : leaves )
1070 objs_[objId].xf = AffineXf3f( resI * AffineXf3d( objs_[objId].xf ) );
1071

Callers

nothing calls this directly

Calls 10

countMethod · 0.80
rigidXfMethod · 0.80
sizeMethod · 0.45
getNumElementsMethod · 0.45
getElementNodesMethod · 0.45
anyMethod · 0.45
resetMethod · 0.45
addMethod · 0.45
solveMethod · 0.45
getElementLeavesMethod · 0.45

Tested by

no test coverage detected