【问题标题】:How to get the source and target points from Edge_iterator in CGAL如何从 CGAL 中的 Edge_iterator 获取源点和目标点
【发布时间】:2011-06-17 08:25:11
【问题描述】:

我对某些点进行了 Delaunay 三角剖分,并希望按长度升序迭代其中的所有边以构建最小跨度线程。

我尝试了以下方法,但无法编译:

typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Delaunay_triangulation_2<K> T;
typedef K::Point_2 P;
typedef T::Vertex_handle Vh;
typedef T::Vertex_iterator Vi;
typedef T::Edge_iterator Ei;

bool sortFunction (Ei a, Ei b) {
    K::FT la, lb;
    la = CGAL::squared_distance(a.source().point(), a.target().point());
    lb = CGAL::squared_distance(b.source().point(), b.target().point());
    return la < lb;
}

...
T g;
...
std::vector<Ei> edges;
for (Ei ei = g.edges_begin(); ei != g.edges_end(); ei++) {
    edges.push_back(ei);
}
std::sort(edges.begin(), edges.end(), sortFunction);
...

sortFunction编译失败,说source不是Edge_iterator的成员。但是,这里的文档让我感到困惑。

CGAL documentation 表示边迭代器的值类型是半边。 There据说可以使用source()target()来获取积分。

但是,情况似乎并非如此。我在这里搞砸了什么?

【问题讨论】:

    标签: c++ compiler-errors cgal


    【解决方案1】:

    edge_iterator 是一个面和一个顶点索引的std::pair。可以通过此面参考访问边的源顶点和目标顶点。 edge_iterator 中的顶点索引符合相反的顶点。所以,另外两个有 id 的 (i+2)%3(i+1)%3

    其他一些解决方案是通过triangulation.segment(edge_iterator) 到达段,然后使用source()target() 函数直接到达点。但是,您无法通过这种方式访问​​顶点句柄。

    【讨论】:

      【解决方案2】:
      Triangulation::Edge e;
      //TODO: get e
      Triangulation::Vertex_handle v1 = e.first->vertex((e.second + 1) % 3);
      Triangulation::Vertex_handle v2 = e.first->vertex((e.second + 2) % 3);
      K::FT squared_distance = CGAL::squared_distance(v1->point(), v2->point());
      

      【讨论】:

        【解决方案3】:

        您可以通过

        访问端点的 vertex_handle

        T::Vertex_handle sVertex = a->first->vertex(T::cw(a->second));

        T::Vertex_handle fVertex = a->first->vertex(T::ccw(a->second));

        以此类推..从每个 Vertex_handle 中,您可以使用 point 方法恢复点的坐标..

        希望对你有帮助

        【讨论】:

          【解决方案4】:

          迭代器应该有点像指向实际元素的指针,所以你需要在访问任何成员之前取消引用它。试试改成a-&gt;source().point()

          编辑:我猜句柄也是指针式的。看看它喜不喜欢这个。

          la = CGAL::squared_distance(a->source()->point(), a->target()->point());
          lb = CGAL::squared_distance(b->source()->point(), b->target()->point());
          

          【讨论】:

          • @Etan 啊,source返回一个顶点句柄,句柄也是指针式的。我将编辑我的答案以反映这一点。
          • "没有名为source的成员"
          猜你喜欢
          • 1970-01-01
          • 2011-06-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-26
          相关资源
          最近更新 更多