如何从 CGAL 中的坐标和拓扑列表创建Polyhedron_3数据结构
How to create a Polyhedron_3 data structure from list of coordinates and topology in CGAL
我有一个坐标列表(一个 n x 3 矩阵,其中 n 是点数)和一个拓扑连通性(一个 m x 3 矩阵,其中 m 是三角形的数量)。
我希望使用此信息在 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 数据结构吗?我无法找到有关如何正确执行此操作的好例子。
根据文档,如果 h
的连接组件是三角形(如果面是三角形,则函数is_triangle(h)
返回 true。您可以使用函数is_pure_triangle()
。
相关文章:
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- C++ 双向链表:使用矩阵类成员创建和填充列表
- 创建一个棋盘格或"Interweave"两个链接列表。IE 更改两个链表的指针
- 使用 SWI-cpp.h 创建列表
- 我如何创建一个列表,然后从中创建两个列表,其中一个用于偶数,另一个用于奇数?
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素
- 基于数组的列表 - 动态数组创建时出错
- 如何从一组派生类创建列表?
- 创建列表视图后无法更改列表视图中的列宽
- 如何在两个包含指针的地图中创建列表
- 在 C++ 中创建列表列表
- 在QT中启动程序时如何创建列表或对象
- 创建列表中的第一个元素始终是0
- 根据网络消息c++创建列表
- C++从两个迭代器创建列表对
- <int> 使用 STIL 创建列表
- 使用 C++ QT 创建列表视图
- 在 MFC 中创建列表视图,而无需对话框
- 在boost python中创建列表列表