首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >加权Voronoi的CGAL二维阿波罗图-如何生成和获取人脸和顶点?

加权Voronoi的CGAL二维阿波罗图-如何生成和获取人脸和顶点?
EN

Stack Overflow用户
提问于 2013-08-16 13:32:54
回答 2查看 706关注 0票数 2

我试图根据阿波罗尼乌斯图生成加权voronoi。我在用CGAL库。我找不到一个很好的例子,说明如何从阿波罗尼乌斯那里得到面孔和顶点。我有以下几种类型:

代码语言:javascript
运行
复制
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为加权voronoi图(Apo_Graph)。

代码语言:javascript
运行
复制
    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);
    }

现在,我需要知道如何才能访问加权voronoi和生成的人脸(以及每个人脸的顶点)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-23 13:22:14

最后我就这样做了:

代码语言:javascript
运行
复制
typedef CGAL::Apollonius_graph_traits_2<Kernel_Exact>             APT;
typedef CGAL::Apollonius_site_2<Kernel_Exact>                   Site_2_Apo;
typedef Site_2_Apo::Point_2                                     Site_2_Point_2;
typedef Site_2_Apo::Weight                                      Site_2_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;

加载一些要点:

代码语言:javascript
运行
复制
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))));
        }
    }

其余的:

代码语言:javascript
运行
复制
VD_AG2 VDA;      //Voronoi Apol 

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

以及获取人脸和顶点的途径:

代码语言:javascript
运行
复制
  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

票数 2
EN

Stack Overflow用户

发布于 2013-08-19 09:46:56

模板类CGAL::Apollonius_graph_2与CGAL2DDelaunay三角剖分共享其大部分API。这个API是在2中总结的。CGAL::Apollonius_graph_2<ApoTraits>就是这个概念的一个模型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18274584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档