void load_scene5_objects(t_scene *scene) { add_object(scene, new_object(CONE, new_cone(new_vector(0, 1, -0.5), new_vector(8, 4, -5), 30), new_color(LIGHT_BLUE), 100)); add_object(scene, new_object(CYLINDER, new_cylinder(new_vector(0, 1, -0.3), new_vector(-10, 0, -5), 2), new_color(PASTEL_BLUE), 100)); add_object(scene, new_object(SPHERE, new_sphere(-1, 3, 2, 2), new_color(BLUE), 100)); add_object(scene, new_object(PLANE, new_plane(0, -1, 0, 0), new_color(DARK_GREY), 100)); }
std::vector<std::tuple<boost::dynamic_bitset<>, unsigned, boost::dynamic_bitset<>>> mig_cuts_paged::enumerate_local_cuts( mig_node n1, mig_node n2, mig_node n3, unsigned max_cut_size ) { std::vector<std::tuple<boost::dynamic_bitset<>, unsigned, boost::dynamic_bitset<>>> local_cuts; for ( const auto& c1 : boost::combine( cuts( n1 ), cut_cones( n1 ) ) ) { for ( const auto& c2 : boost::combine( cuts( n2 ), cut_cones( n2 ) ) ) { for ( const auto& c3 : boost::combine( cuts( n3 ), cut_cones( n3 ) ) ) { auto min_level = std::numeric_limits<unsigned>::max(); boost::dynamic_bitset<> new_cut( max_cut_size ); auto f = [&new_cut, &min_level, this]( unsigned pos ) { new_cut.set( pos ); min_level = std::min( min_level, this->_levels[pos].second ); }; std::for_each( boost::get<0>( c1 ).begin(), boost::get<0>( c1 ).end(), f ); std::for_each( boost::get<0>( c2 ).begin(), boost::get<0>( c2 ).end(), f ); std::for_each( boost::get<0>( c3 ).begin(), boost::get<0>( c3 ).end(), f ); boost::dynamic_bitset<> new_cone( max_cut_size ); auto f2 = [&new_cone]( unsigned pos ) { new_cone.set( pos ); }; std::for_each( boost::get<1>( c1 ).begin(), boost::get<1>( c1 ).end(), f2 ); std::for_each( boost::get<1>( c2 ).begin(), boost::get<1>( c2 ).end(), f2 ); std::for_each( boost::get<1>( c3 ).begin(), boost::get<1>( c3 ).end(), f2 ); /* too large? */ if ( new_cut.count() > _k ) { continue; } auto first_subsume = true; auto add = true; auto l = 0u; while ( l < local_cuts.size() ) { auto cut = std::get<0>( local_cuts[l] ); /* same cut */ if ( cut == new_cut ) { add = false; break; } /* cut subsumes new_cut */ if ( ( cut & new_cut ) == new_cut ) { add = false; break; } /* new_cut subsumes cut */ if ( ( cut & new_cut ) == cut ) { add = false; if ( first_subsume ) { local_cuts[l] = std::make_tuple( new_cut, min_level, new_cone ); first_subsume = false; } else { local_cuts[l] = local_cuts.back(); local_cuts.pop_back(); } } ++l; } if ( add ) { local_cuts += std::make_tuple( new_cut, min_level, new_cone ); } } } } boost::sort( local_cuts, []( const std::tuple<boost::dynamic_bitset<>, unsigned, boost::dynamic_bitset<>>& e1, const std::tuple<boost::dynamic_bitset<>, unsigned, boost::dynamic_bitset<>>& e2 ) { return ( std::get<1>( e1 ) > std::get<1>( e2 ) ) || ( std::get<1>( e1 ) == std::get<1>( e2 ) && std::get<0>( e1 ).count() < std::get<0>( e2 ).count() ); } ); if ( local_cuts.size() > _priority ) { local_cuts.resize( _priority ); } return local_cuts; }