Диаграмма CGAL 2D APOLLONIUS для взвешенного Вороного - Как сгенерировать и получить грани и вершины?

Я пытаюсь сгенерировать взвешенный вороной на основе диаграммы Аполлония. Я использую библиотеку CGAL. Я не смог найти хорошего примера, как получить грани и вершины от аполлония. У меня есть следующие typedef:

typedef double                                                                  NT;
typedef CGAL::Cartesian< NT>                                                    KernelCartes;
typedef CGAL::Ray_2<KernelCartes>                                               Cartes_Ray;
typedef CGAL::Line_2<KernelCartes>                                              Cartes_Line;
typedef CGAL::Segment_2<KernelCartes>                                           Cartes_Segment;
typedef std::list<Cartes_Ray>                                                   Cartes_RayList;
typedef std::list<Cartes_Line>                                                  Cartes_LineList;
typedef std::list<Cartes_Segment>                                               Cartes_SegmentList;
typedef CGAL::Point_2<KernelCartes>                                             Cartes_Point;
typedef CGAL::Apollonius_graph_traits_2<KernelCartes>                           ApoTraits;
typedef CGAL::Apollonius_graph_2<ApoTraits>                                     Apo_Graph;
typedef Apo_Graph::Site_2                                                       Apo_Site;

Далее я пытаюсь создать диаграмму Аполлония. WVD - это взвешенная диаграмма Вороного (Apo_Graph).

    WVD.clear();
    double Weight;
    foreach(QPointF point,List_Nodes)
    {
        Weight = NewRandomNumber(1,10);
        Apo_Site k(Cartes_Point(point.x(),point.y()),Weight);
        WVD.insert(k);
    }

Теперь мне нужно знать, как я могу получить доступ к взвешенным вороноям и сгенерированным граням (и впоследствии вершинам для каждой грани).


person M4G    schedule 16.08.2013    source источник


Ответы (2)


В итоге у меня получилось вот так:

typedef CGAL::Apollonius_graph_traits_2<Kernel_Exact>             APT;
typedef CGAL::Apollonius_site_2<Kernel_Exact>                   Site
std::vector<Site_2_Apo> List_Nodes;
    for (int i = 0; i<= 100; i = i++)
    {
        for(int j = 0; j <= 100; j = j++)
        {
            List_Nodes.push_back(Site_2_Apo(Site_2_Point_2(i+NewRandomNumber(0,30),j+NewRandomNumber(0,30)),Site_2_Weight(NewRandomNumber(1,50))));
        }
    }
Apo; typedef Site
std::vector<Site_2_Apo> List_Nodes;
    for (int i = 0; i<= 100; i = i++)
    {
        for(int j = 0; j <= 100; j = j++)
        {
            List_Nodes.push_back(Site_2_Apo(Site_2_Point_2(i+NewRandomNumber(0,30),j+NewRandomNumber(0,30)),Site_2_Weight(NewRandomNumber(1,50))));
        }
    }
Apo::Point_2 Site
std::vector<Site_2_Apo> List_Nodes;
    for (int i = 0; i<= 100; i = i++)
    {
        for(int j = 0; j <= 100; j = j++)
        {
            List_Nodes.push_back(Site_2_Apo(Site_2_Point_2(i+NewRandomNumber(0,30),j+NewRandomNumber(0,30)),Site_2_Weight(NewRandomNumber(1,50))));
        }
    }
Point_2; typedef Site
std::vector<Site_2_Apo> List_Nodes;
    for (int i = 0; i<= 100; i = i++)
    {
        for(int j = 0; j <= 100; j = j++)
        {
            List_Nodes.push_back(Site_2_Apo(Site_2_Point_2(i+NewRandomNumber(0,30),j+NewRandomNumber(0,30)),Site_2_Weight(NewRandomNumber(1,50))));
        }
    }
Apo::Weight Site
std::vector<Site_2_Apo> List_Nodes;
    for (int i = 0; i<= 100; i = i++)
    {
        for(int j = 0; j <= 100; j = j++)
        {
            List_Nodes.push_back(Site_2_Apo(Site_2_Point_2(i+NewRandomNumber(0,30),j+NewRandomNumber(0,30)),Site_2_Weight(NewRandomNumber(1,50))));
        }
    }
Weight; typedef CGAL::Apollonius_graph_traits_2<Kernel_Exact> AGT2_K; typedef CGAL::Apollonius_graph_2<AGT2_K> AG2; typedef CGAL::Apollonius_graph_adaptation_traits_2<AG2> AG2_Trait; typedef CGAL::Apollonius_graph_caching_degeneracy_removal_policy_2<AG2> AG2_Policy; typedef CGAL::Voronoi_diagram_2<AG2,AG2_Trait,AG2_Policy> VD_AG2;

загрузка некоторых точек:

std::vector<Site_2_Apo> List_Nodes;
    for (int i = 0; i<= 100; i = i++)
    {
        for(int j = 0; j <= 100; j = j++)
        {
            List_Nodes.push_back(Site_2_Apo(Site_2_Point_2(i+NewRandomNumber(0,30),j+NewRandomNumber(0,30)),Site_2_Weight(NewRandomNumber(1,50))));
        }
    }

и остальные:

VD_AG2 VDA;      //Voronoi Apol 

    ///Voronoi Generation
    VDA.clear();
    VDA.insert(List_Nodes.begin(),List_Nodes.end());

и доступ к граням и вершинам:

  for(A_Bounded_faces_iterator f = VDA.bounded_faces_begin(); f != VDA.bounded_faces_end(); f++)
    {

        A_Ccb_halfedge_circulator ec_start = (f)->ccb();
        A_Ccb_halfedge_circulator ec = ec_start;
        poly.clear();
        do {
            x = ((A_Halfedge_handle)ec)->source()->point().x();
            y = ((A_Halfedge_handle)ec)->source()->point().y();
            poly.push_back(QPointF(x,y));
        } while ( ++ec != ec_start );        
        List_Poly.push_back(poly);
    }

и вот результат:

http://i.stack.imgur.com/Esv8c.png

person M4G    schedule 23.08.2013

Класс шаблона CGAL::Apollonius_graph_2 имеет большую часть своего API с триангуляциями Делоне CGAL 2D. Этот API обобщен в концепции DelaunayGraph_2. CGAL::Apollonius_graph_2<ApoTraits> является образцом этой концепции.

person lrineau    schedule 19.08.2013