2013-12-23 142 views
2

我想生成在CGAL安排每个面多边形(原因:看我related问题)CGAL设置面多边形

作为输入,我增加折线曲线与多个呼叫:

std::list<Point_2> points; 
(.. add points ..) 
Polyline_2 pi1 (points.begin(), points.end()); 
insert (arr, pi1); 

然而,当我输出的面部:

std::ofstream ofs ("cgal_output.txt", std::ofstream::out); 

template<class Arrangement> 
void print_ccb (typename Arrangement::Ccb_halfedge_const_circulator circ) 
{ 
    typename Arrangement::Ccb_halfedge_const_circulator curr = circ; 

    do 
    { 
    typename Arrangement::Halfedge_const_handle he = curr; 
    ofs << he->curve() << std::endl; 

    } while (++curr != circ); 

    ofs << "#" << std::endl; // end of face mark 
    return; 
} 

的曲线的点在某种程度上也不会运行,一个consistantly嗦多边形轮廓可以用坐标绘制秒。

我该如何解决这个问题?

回答

1

我认为在Arrangement_2演示中有代码可以做你想做的事情。创建从一个人的脸多边形的方法位于demo/Arrangement_on_surface_2/ArrangementGraphicsItem.h:311(只注意有正在使用的一些Qt的对象,你可以用std::vectorCGAL::Point_2替换):

QVector<QPointF> pts; // holds the points of the polygon 
    typename X_monotone_curve_2::const_iterator   pt_itr; 
    typename X_monotone_curve_2::const_reverse_iterator pt_rev_itr; 
    X_monotone_curve_2 cv; 

    /* running with around the outer of the face and generate from it 
    * polygon 
    */ 
    Ccb_halfedge_circulator cc = f->outer_ccb(); 
    do { 
    cv = cc->curve(); 
    bool curve_has_same_direction = 
     (*(cc->curve().begin()) == cc->source()->point()); 
    if (curve_has_same_direction) 
    {  
     for(pt_itr = cv.begin() , ++pt_itr ; pt_itr != cv.end(); ++pt_itr) 
     {  
     double x = CGAL::to_double((*pt_itr).x()); 
     double y = CGAL::to_double((*pt_itr).y()); 
     QPointF coord_source(x , y); 
     pts.push_back(coord_source); 
     }  
    }  
    else 
    {  
     for (pt_rev_itr = cv.rbegin() , ++pt_rev_itr; pt_rev_itr != cv.rend(); 
      ++pt_rev_itr) 
     {  
     double x = CGAL::to_double((*pt_rev_itr).x()); 
     double y = CGAL::to_double((*pt_rev_itr).y()); 
     QPointF coord_source(x , y); 
     pts.push_back(coord_source); 
     }  
    }  
    //created from the outer boundary of the face 
    } while (++cc != f->outer_ccb()); 

    // make polygon from the outer ccb of the face 'f' 
    QPolygonF pgn(pts); 

基本上,额外的工作,你需要做的是检查多段线中的线段是否相反,然后相应地反转点。