예제 #1
0
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;
	}
}
예제 #2
0
파일: Surf.cpp 프로젝트: amgary/OpenVSP
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 );
				}
			}
		}
	}
}
예제 #3
0
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 );
}