void SCurve::ApplyEdgeSources( MSTree &es_tree, MSCloud &es_cloud, GridDensity* grid_den ) { double grm1 = grid_den->GetGrowRatio() - 1.0; double rmax = grid_den->GetBaseLen() / ( grid_den->GetGrowRatio() - 1.0 ); double r2max = rmax * rmax; SearchParams params; params.sorted = false; for ( int i = 0 ; i < num_segs ; i++ ) { double t = target_vec[i]; vec3d p1 = pnt_vec[i]; double *query_pt = p1.v; MSTreeResults es_matches; int nMatches = es_tree.radiusSearch( query_pt, r2max, es_matches, params ); for (int j = 0; j < nMatches; j++ ) { int imatch = es_matches[j].first; double r = sqrt( es_matches[j].second ); double str = *( es_cloud.sources[imatch].m_strptr ); double ts = str + grm1 * r; t = min( t, ts ); } target_vec[i] = t; } }
void Surf::LimitTargetMap( MSCloud &es_cloud, MSTree &es_tree, double minmap ) { double grm1 = m_GridDensityPtr->GetGrowRatio() - 1.0; double tmin = min( minmap, es_cloud.sources[0]->m_str ); SearchParams params; params.sorted = false; int nmapu = m_SrcMap.size(); int nmapw = m_SrcMap[0].size(); // Loop over surface evaluating source strength and curvature for( int i = 0; i < nmapu ; i++ ) { // double u = ( 1.0 * i ) / ( m_NumMap - 1 ); for( int j = 0; j < nmapw ; j++ ) { // double w = ( 1.0 * j ) / ( m_NumMap - 1 ); double *query_pt = m_SrcMap[i][j].m_pt.v; double t = m_SrcMap[i][j].m_str; double torig = t; double rmax = ( t - tmin ) / grm1; if( rmax > 0.0 ) { double r2max = rmax * rmax; MSTreeResults es_matches; int nMatches = es_tree.radiusSearch( query_pt, r2max, es_matches, params ); for (int k = 0; k < nMatches; k++ ) { int imatch = es_matches[k].first; double r = sqrt( es_matches[k].second ); double str = es_cloud.sources[imatch]->m_str; double ts = str + grm1 * r; t = min( t, ts ); } if( t < torig ) { m_SrcMap[i][j].m_str = t; pair< int, int > ijstart( i, j ); WalkMap( ijstart, ijstart ); } } } } }
void MSCloud::prune_map_sources( MSTree &ms_tree, GridDensity* grid_den ) { int nsrc = sources.size(); vector<bool> remove (nsrc, false); double grm1 = grid_den->GetGrowRatio() - 1.0; double tmin = *( sources[0].m_strptr ); SearchParams params; params.sorted = false; for ( int i = 0 ; i < nsrc ; i++ ) { double *query_pt = sources[i].m_pt.v; double localstr = *( sources[i].m_strptr ); MSTreeResults es_matches; double rmax = ( localstr - tmin ) / grm1; double r2max = rmax * rmax; int nMatches = ms_tree.radiusSearch( query_pt, r2max, es_matches, params ); for ( int j = 0; j < nMatches; j++ ) { int imatch = es_matches[j].first; double r = sqrt( es_matches[j].second ); double targetstr = *( sources[imatch].m_strptr ); double targetlocalstr = targetstr + grm1 * r; if( targetlocalstr < localstr ) { remove[i] = true; break; } } } vector< MapSource > new_sources; new_sources.reserve( nsrc ); for ( int i = 0 ; i < nsrc ; i++ ) { if( !remove[i] ) new_sources.push_back( sources[i] ); } sources.swap( new_sources ); }