void C3DPlotCanvas::apply_camera() { int w, h; GetClientSize(&w, &h); float aspect = (float)w / (float)h; Vec3 d_min(bb_min[0], bb_min[1], bb_min[2]); Vec3 d_max(bb_max[0], bb_max[1], bb_max[2]); Vec3 up(0, 1, 0); double fovy = 60.0; Vec3 at = (d_max+d_min)/2.0; double radius = sqrt((d_max[0]-at[0])*(d_max[0]-at[0]) +(d_max[1]-at[1])*(d_max[1]-at[1]) +(d_max[2]-at[2])*(d_max[2]-at[2])); double d = 3*radius / tan(fovy * M_PI/180.0); Vec3 from = at; from[2] += d; double znear = d/20; double zfar = 10*d; glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(fovy, aspect, znear, zfar); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(from[0], from[1], from[2], at[0], at[1], at[2], up[0], up[1], up[2]); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); }
const DBSCAN::DistanceMatrix DBSCAN::calc_dist_matrix( const DBSCAN::ClusterData& C, const DBSCAN::FeaturesWeights& W ) { DBSCAN::ClusterData cl_d = C; omp_set_dynamic( 0 ); omp_set_num_threads( m_num_threads ); #pragma omp parallel for for ( size_t i = 0; i < cl_d.size2(); ++i ) { ublas::matrix_column< DBSCAN::ClusterData > col( cl_d, i ); const auto r = minmax_element( col.begin(), col.end() ); double data_min = *r.first; double data_range = *r.second - *r.first; if ( data_range == 0.0 ) { data_range = 1.0; } const double scale = 1 / data_range; const double min = -1.0 * data_min * scale; col *= scale; col.plus_assign( ublas::scalar_vector< typename ublas::matrix_column< DBSCAN::ClusterData >::value_type >( col.size(), min ) ); } // rows x rows DBSCAN::DistanceMatrix d_m( cl_d.size1(), cl_d.size1() ); ublas::vector< double > d_max( cl_d.size1() ); ublas::vector< double > d_min( cl_d.size1() ); omp_set_dynamic( 0 ); omp_set_num_threads( m_num_threads ); #pragma omp parallel for for ( size_t i = 0; i < cl_d.size1(); ++i ) { for ( size_t j = i; j < cl_d.size1(); ++j ) { d_m( i, j ) = 0.0; if ( i != j ) { ublas::matrix_row< DBSCAN::ClusterData > U( cl_d, i ); ublas::matrix_row< DBSCAN::ClusterData > V( cl_d, j ); int k = 0; for ( const auto e : ( U - V ) ) { d_m( i, j ) += fabs( e ) * W[k++]; } d_m( j, i ) = d_m( i, j ); } } const auto cur_row = ublas::matrix_row< DBSCAN::DistanceMatrix >( d_m, i ); const auto mm = minmax_element( cur_row.begin(), cur_row.end() ); d_max( i ) = *mm.second; d_min( i ) = *mm.first; } m_dmin = *( min_element( d_min.begin(), d_min.end() ) ); m_dmax = *( max_element( d_max.begin(), d_max.end() ) ); m_eps = ( m_dmax - m_dmin ) * m_eps + m_dmin; return d_m; }
int main() { printf ("%f\n", d_max (1.2, 3.4)); printf ("%f\n", d_max (5.6, -4)); };