如何从CGAL中的坐标和拓扑列表创建Polyhedron_3数据结构

时间:2016-01-15 00:13:26

标签: c++ cgal

我有一个坐标列表(一个n乘3矩阵,其中n是点数)和拓扑连通性(m-by-3矩阵,其中m是三角形的数量)。< / p>

我希望使用此信息在CGAL中创建一个CGAL::Polyhedron_3类。我如何实现这一目标?

这是我目前的代码:

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <iterator>

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Random.h>
#include <CGAL/Polyhedron_3.h>
#include <CGAL/Polyhedron_items_with_id_3.h>
#include <CGAL/IO/Polyhedron_iostream.h>
#include <CGAL/Surface_mesh_shortest_path.h>
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
#include <CGAL/boost/graph/iterator.h>

typedef CGAL::Exact_predicates_inexact_constructions_kernel           Kernel;
typedef CGAL::Polyhedron_3<Kernel, CGAL::Polyhedron_items_with_id_3>  Polyhedron_3;
typedef Kernel::Point_3                                               Point_3;
typedef Polyhedron_3::HalfedgeDS                                      HalfedgeDS;
typedef Polyhedron_3::Vertex_iterator                                 Vertex_iterator;
typedef Polyhedron_3::Edge_iterator                                   Edge_iterator;
typedef Polyhedron_3::Facet_iterator                                  Facet_iterator;
typedef CGAL::Surface_mesh_shortest_path_traits<Kernel, Polyhedron_3> Traits;
typedef CGAL::Surface_mesh_shortest_path<Traits>                      Surface_mesh_shortest_path;
typedef boost::graph_traits<Polyhedron_3>                             Graph_traits;
typedef Graph_traits::vertex_iterator                                 vertex_iterator;
typedef Graph_traits::face_iterator                                   face_iterator;
typedef Polyhedron_3::Halfedge_around_facet_circulator                Halfedge_facet_circulator;

template <class HDS>
class Build_triangle : public CGAL::Modifier_base<HDS>
{
public:
    Build_triangle() {}
    void operator()(HDS & hds)
    {
        // Postcondition: hds is a valid polyhedral surface.
        CGAL::Polyhedron_incremental_builder_3<HDS> B(hds, true);
        B.begin_surface(5, 4, 16);
        typedef typename HDS::Vertex   Vertex;
        typedef typename Vertex::Point Point;

        B.add_vertex(Point(0.0, 0.0, 0.0));
        B.add_vertex(Point(1.0, 0.0, 0.0));
        B.add_vertex(Point(1.0, 1.0, 0.0));
        B.add_vertex(Point(0.0, 1.0, 0.0));
        B.add_vertex(Point(0.5, 0.5, 0.0));

        B.begin_facet();
        B.add_vertex_to_facet(0);
        B.add_vertex_to_facet(1);
        B.add_vertex_to_facet(4);
        B.end_facet();

        B.begin_facet();
        B.add_vertex_to_facet(1);
        B.add_vertex_to_facet(2);
        B.add_vertex_to_facet(4);
        B.end_facet();

        B.begin_facet();
        B.add_vertex_to_facet(2);
        B.add_vertex_to_facet(3);
        B.add_vertex_to_facet(4);
        B.end_facet();

        B.begin_facet();
        B.add_vertex_to_facet(3);
        B.add_vertex_to_facet(0);
        B.add_vertex_to_facet(4);
        B.end_facet();

        B.end_surface();
    }
};

int main(int argc, char *argv[])
{
    Polyhedron_3 P;
    Build_triangle<HalfedgeDS> triangle;
    P.delegate(triangle);

    CGAL_assertion(P.is_triangle(P.halfedges_begin()));

    return 0;
}

CGAL_assertion断言语句失败,这意味着我无法正确生成三角形。我是否需要更改HalfedgeDS数据结构?我无法找到一个如何正确做到这一点的好例子。

1 个答案:

答案 0 :(得分:1)

根据documentation,如果<android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" app:contentScrim="?attr/colorPrimary" app:expandedTitleMarginEnd="64dp" app:expandedTitleMarginStart="48dp" app:layout_scrollFlags="scroll|exitUntilCollapsed"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_scrollFlags="scroll|enterAlways"></android.support.v7.widget.Toolbar> </android.support.design.widget.CollapsingToolbarLayout> 的连通分量是三角形(而不是面是三角形),则函数is_triangle(h)返回true。您可以使用函数is_pure_triangle()