Ejemplo n.º 1
0
void Scene_combinatorial_map_item::direct_draw() const {
  typedef Combinatorial_map_3::One_dart_per_cell_const_range<3> Volume_dart_range;
  typedef Combinatorial_map_3::One_dart_per_incident_cell_const_range<2,3> Facet_in_volume_drange;
  typedef Combinatorial_map_3::Dart_of_orbit_const_range<1> Dart_in_facet_range;
  Volume_dart_range dart_per_volume_range = combinatorial_map().one_dart_per_cell<3>();
  
  std::size_t index = 0;
  for (Volume_dart_range::const_iterator vit=dart_per_volume_range.begin();vit!=dart_per_volume_range.end();++vit)
  {
    if (++index!=volume_to_display && volume_to_display!=0) continue;
    Facet_in_volume_drange facet_range=combinatorial_map().one_dart_per_incident_cell<2,3>(vit);
    
    for(Facet_in_volume_drange::const_iterator fit=facet_range.begin();fit!=facet_range.end();++fit){
      Dart_in_facet_range vertices=combinatorial_map().darts_of_orbit<1>(fit);
      Kernel::Vector_3 normal = compute_face_normal(fit);
      
      ::glBegin(GL_POLYGON);  
      ::glNormal3d(normal.x(),normal.y(),normal.z());
    
      for (Dart_in_facet_range::const_iterator pit=vertices.begin();pit!=vertices.end();++pit ){
        const Kernel::Point_3& p= pit->attribute<0>()->point();
        ::glVertex3d(p.x(),p.y(),p.z());
      }      
      ::glEnd(); 
    }
  }
}
Ejemplo n.º 2
0
void Scene_combinatorial_map_item::export_as_polyhedron(Predicate pred,const QString& name) const {
    typedef Combinatorial_map_3::Dart_const_handle Dart_handle;
    typedef Combinatorial_map_3::One_dart_per_cell_const_range<3> One_dart_per_vol_range;
    typedef CGAL::internal::Import_volume_as_polyhedron<Polyhedron::HalfedgeDS> Volume_import_modifier;

    std::vector<Dart_handle> darts;
    One_dart_per_vol_range cell_range=combinatorial_map().template one_dart_per_cell<3>();


    for (One_dart_per_vol_range::const_iterator it = cell_range.begin();it!= cell_range.end() ; ++it )
        if ( pred(it) ){
            darts.push_back(it);
            if (Predicate::only_one_run) break;
        }

    if (!darts.empty())
    {
        Volume_import_modifier modifier=Predicate::swap_orientation?
                    Volume_import_modifier(combinatorial_map(),darts.begin(),darts.end(),Predicate::swap_orientation):
                    Volume_import_modifier(combinatorial_map(),darts.begin(),darts.end());

        Polyhedron* new_poly=new Polyhedron();
        new_poly->delegate(modifier);
        Scene_polyhedron_item* new_item = new Scene_polyhedron_item(new_poly);
        new_item->setName(name);
        last_known_scene->addItem(new_item);
    }
}
Ejemplo n.º 3
0
Kernel::Vector_3 Scene_combinatorial_map_item::compute_face_normal(Combinatorial_map_3::Dart_const_handle adart) const
{
    typedef Combinatorial_map_3::Dart_of_orbit_const_range<1> Dart_in_facet_range;
    typedef Kernel::Vector_3 Vector_3;
    Vector_3 normal = CGAL::NULL_VECTOR;

    Dart_in_facet_range vertices=combinatorial_map().darts_of_orbit<1>(adart);
    Kernel::Point_3 points[3];
    int index=0;
    Dart_in_facet_range::const_iterator pit=vertices.begin();
    for (;pit!=vertices.end() && index!=3;++pit,++index ){
        points[index]=pit->attribute<0>()->point();
    }

    if (index!=3) return normal;

    do{
        Vector_3 n = CGAL::cross_product(points[2]-points[1],points[0]-points[1]);
        if (n != Vector_3(0,0,0) )
            normal = normal + (n / std::sqrt(n*n));
        points[0]=points[1];
        points[1]=points[2];
        if ( pit==vertices.end() ) break;

        points[2]=pit->attribute<0>()->point();
        ++pit;
    }while(true);

    return normal == Vector_3(0,0,0)? normal : normal / std::sqrt(normal * normal);
}  
Ejemplo n.º 4
0
void Scene_combinatorial_map_item::set_next_volume(){
  ++volume_to_display;
  volume_to_display=volume_to_display%(combinatorial_map().attributes<3>().size()+1);
  emit itemChanged();

  if (exportSelectedVolume!=NULL && ( volume_to_display==1 || volume_to_display==0 ) )
    exportSelectedVolume->setEnabled(!exportSelectedVolume->isEnabled());
}
Ejemplo n.º 5
0
QString Scene_combinatorial_map_item::toolTip() const{ 
    if(!m_combinatorial_map)
        return QString();

    std::vector<unsigned int> cells(5);
    for (unsigned int i=0; i<=4; ++i)
        cells[i]=i;
    std::vector<unsigned int> res = combinatorial_map().count_cells(cells);
    if (volume_to_display==0)
        return QObject::tr("<p>Combinatorial_map_3 <b>%1</b> (mode: %8, color: %9)</p>"
                           "<p>Number of darts: %2<br />"
                           "Number of vertices: %3<br />"
                           "Number of edges: %4<br />"
                           "Number of facets: %5<br />"
                           "Number of volumes: %6<br />"
                           "Number of connected components: %7</p>")
                .arg(this->name())
                .arg(combinatorial_map().number_of_darts())
                .arg(res[0])
                .arg(res[1])
                .arg(res[2])
                .arg(res[3])
                .arg(res[4])
                .arg(this->renderingModeName())
                .arg(this->color().name());
    return QObject::tr("<p>Combinatorial_map_3 <b>%1</b> (mode: %8, color: %9)</p>"
                       "<p>Number of darts: %2<br />"
                       "Number of vertices: %3<br />"
                       "Number of edges: %4<br />"
                       "Number of facets: %5<br />"
                       "Number of volumes: %6<br />"
                       "Number of connected components: %7 <br />"
                       "Currently Displaying facets of volume: %10 </p>")
            .arg(this->name())
            .arg(combinatorial_map().number_of_darts())
            .arg(res[0])
            .arg(res[1])
            .arg(res[2])
            .arg(res[3])
            .arg(res[4])
            .arg(this->renderingModeName())
            .arg(this->color().name())
            .arg(volume_to_display-1);
}
Ejemplo n.º 6
0
Scene_combinatorial_map_item::Bbox 
Scene_combinatorial_map_item::bbox() const {
    typedef Combinatorial_map_3::Attribute_const_range<0>::type Point_range;
    const Point_range& points=combinatorial_map().attributes<0>();
    CGAL::Bbox_3 bbox=points.begin()->point().bbox();
    for(Point_range::const_iterator pit=boost::next(points.begin());pit!=points.end();++pit)
        bbox=bbox+pit->point().bbox();
    return Bbox(bbox.xmin(),bbox.ymin(),bbox.zmin(),
                bbox.xmax(),bbox.ymax(),bbox.zmax());
}
Ejemplo n.º 7
0
void Scene_combinatorial_map_item::draw_points() const{
  typedef Combinatorial_map_3::Attribute_const_range<0>::type Point_range;
  const Point_range& points=combinatorial_map().attributes<0>();
  ::glBegin(GL_POINTS);
  for(Point_range::const_iterator pit=boost::next(points.begin());pit!=points.end();++pit){
    const Kernel::Point_3& p=pit->point();
    ::glVertex3d(p.x(),p.y(),p.z());
  }
  ::glEnd();
}
Ejemplo n.º 8
0
void Scene_combinatorial_map_item::set_next_volume(){
    //Update des vectors faits ici
    ++volume_to_display;
    volume_to_display=volume_to_display%(combinatorial_map().attributes<3>().size()+1);
  are_buffers_filled = false;
  invalidate_buffers();
  Q_EMIT itemChanged();

    if (exportSelectedVolume!=NULL && ( volume_to_display==1 || volume_to_display==0 ) )
        exportSelectedVolume->setEnabled(!exportSelectedVolume->isEnabled());
}
Ejemplo n.º 9
0
void Scene_combinatorial_map_item::direct_draw_edges() const {
  typedef Combinatorial_map_3::One_dart_per_cell_const_range<1> Edge_darts;
  Edge_darts darts=combinatorial_map().one_dart_per_cell<1>();
  ::glBegin(GL_LINES);
  for (Edge_darts::const_iterator dit=darts.begin();dit!=darts.end();++dit){
    CGAL_assertion(!dit->is_free(1));
    const Kernel::Point_3& a = dit->attribute<0>()->point();
    const Kernel::Point_3& b = dit->beta(1)->attribute<0>()->point();
    ::glVertex3d(a.x(),a.y(),a.z());
    ::glVertex3d(b.x(),b.y(),b.z());  
  }
  ::glEnd();
}
Ejemplo n.º 10
0
bool Scene_combinatorial_map_item::isEmpty() const {return combinatorial_map().number_of_darts()==0;}
Ejemplo n.º 11
0
void Scene_combinatorial_map_item::compute_elements(void) const{

    positions_facets.resize(0);
    normals.resize(0);
    positions_lines.resize(0);
    positions_points.resize(0);

    //Facets
    {
    std::size_t index = 0;
    int voltreated = combinatorial_map().get_new_mark();
    int facetreated = combinatorial_map().get_new_mark();
    Combinatorial_map_3::Dart_const_range::const_iterator
            darts_it=combinatorial_map().darts().begin(), darts_end=combinatorial_map().darts().end();
    for( ; darts_it!=darts_end; ++darts_it)
    {
        if ( !combinatorial_map().is_marked(darts_it,voltreated) )
        {
            ++index;
            //iterate over all the darts of the volume
            Combinatorial_map_3::Dart_of_cell_const_range<3>::const_iterator
                    vol_it=combinatorial_map().darts_of_cell<3>(darts_it).begin(),
                    vol_end=combinatorial_map().darts_of_cell<3>(darts_it).end();
            if ( volume_to_display!=0 && index!=volume_to_display )
            {
                //only mark darts if the volume is not the one to display
                for ( ;vol_it!=vol_end; ++vol_it )
                {
                    combinatorial_map().mark(vol_it,facetreated);
                    combinatorial_map().mark(vol_it, voltreated);
                }
            }
            else
            {
                for ( ;vol_it!=vol_end; ++vol_it )
                {
                    if ( !combinatorial_map().is_marked(vol_it,facetreated) )
                    {
                        Kernel::Vector_3 normal = compute_face_normal(vol_it);
                        for(int i=0; i<3; i++)
                        {
                            normals.push_back(normal.x());
                            normals.push_back(normal.y());
                            normals.push_back(normal.z());
                        }

                        //iterate over all darts of facets
                        for ( Combinatorial_map_3::Dart_of_orbit_const_range<1>::const_iterator
                              face_it=combinatorial_map().darts_of_orbit<1>(vol_it).begin(),
                              face_end=combinatorial_map().darts_of_orbit<1>(vol_it).end();
                              face_it!=face_end; ++face_it)
                        {
                            const Kernel::Point_3& p= face_it->attribute<0>()->point();
                            positions_facets.push_back(p.x());
                            positions_facets.push_back(p.y());
                            positions_facets.push_back(p.z());
                            combinatorial_map().mark(face_it,facetreated);
                            combinatorial_map().mark(face_it, voltreated);
                        }
                    }
                }
            }
            if ( index==volume_to_display ) break;
        }
    }
    //mark remaining darts to have an O(1) free_mark
    for( ;  darts_it!=darts_end; ++darts_it)
    {
        combinatorial_map().mark(darts_it, facetreated);
        combinatorial_map().mark(darts_it, voltreated);
    }

    combinatorial_map().free_mark(facetreated);
    combinatorial_map().free_mark(voltreated);
    }

    //edges
    {

        typedef Combinatorial_map_3::One_dart_per_cell_const_range<1> Edge_darts;
        Edge_darts darts=combinatorial_map().one_dart_per_cell<1>();
        for (Edge_darts::const_iterator dit=darts.begin();dit!=darts.end();++dit){
            CGAL_assertion(!dit->is_free(1));
            const Kernel::Point_3& a = dit->attribute<0>()->point();
            const Kernel::Point_3& b = dit->beta(1)->attribute<0>()->point();
            positions_lines.push_back(a.x());
            positions_lines.push_back(a.y());
            positions_lines.push_back(a.z());

            positions_lines.push_back(b.x());
            positions_lines.push_back(b.y());
            positions_lines.push_back(b.z());

        }
    }

    //points
    {
        typedef Combinatorial_map_3::Attribute_const_range<0>::type Point_range;
        const Point_range& points=combinatorial_map().attributes<0>();
        for(Point_range::const_iterator pit=boost::next(points.begin());pit!=points.end();++pit){
            const Kernel::Point_3& p=pit->point();
            positions_points.push_back(p.x());
            positions_points.push_back(p.y());
            positions_points.push_back(p.z());
        }

    }

}