[英]How do I iterate over faces in CGAL
我正在嘗試使用CGAL做一些Delaunay三角測量。 我使用其中一個CGAL樣本來計算包含高度字段屬性的三角測量。
我遇到的問題是我不知道如何得到最終的三角測量。 我想出了如何獲得face_iterator,但我不知道該怎么做。 我希望得到的是每個三角形上3個點中每個點的點數組的索引。
我無法瀏覽所有嵌套模板:
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Triangulation_euclidean_traits_xy_3.h>
#include <CGAL/Delaunay_triangulation_2.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Triangulation_euclidean_traits_xy_3<K> Gt;
typedef CGAL::Delaunay_triangulation_2<Gt> Delaunay;
typedef K::Point_3 Point;
int main()
{
//initialize the points with some trivial data
std::vector<Point> pts;
pts.push_back(Point(1., 2., 3.));
pts.push_back(Point(2., 2., 3.));
pts.push_back(Point(1., 3., 3.));
pts.push_back(Point(4., 2., 3.));
//create a delaunay triangulation
Delaunay dt;
dt.insert(pts.begin(), pts.end());
//iterate through the faces
Delaunay::Finite_faces_iterator it;
for (it = dt.finite_faces_begin(); it != dt.finite_faces_end(); it++)
{
//What do I do here??
}
return 0;
}
您可以使用Delaunay :: triangle從面(迭代器)轉換為相應的三角形。 這是在CGAL 3.8下測試的:
// points.cin contains point pairs, e.g.,
// 3 5
// 0 0
// 1 9
// ...
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Delaunay_triangulation_2.h>
#include <fstream>
typedef CGAL::Exact_predicates_exact_constructions_kernel K;
typedef CGAL::Delaunay_triangulation_2<K> Delaunay;
typedef K::Point_2 Point;
int main()
{
std::ifstream in("points.cin");
std::istream_iterator<Point> begin(in);
std::istream_iterator<Point> end;
Delaunay dt;
dt.insert(begin, end);
Delaunay::Finite_faces_iterator it;
for (it = dt.finite_faces_begin(); it != dt.finite_faces_end(); it++)
{
std::cout << dt.triangle(it) << std::endl;
}
return 0;
}
可以使用dt.triangle(it)[idx]訪問三角形的頂點,其中它是面迭代器, idx是頂點數(0,1或2)。 在下面的示例中,頂點是Point_2對象,可以使用x()和y()方法訪問其笛卡爾坐標。
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Triangulation_euclidean_traits_2.h>
#include <CGAL/Delaunay_triangulation_2.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Triangulation_euclidean_traits_2<K> Gt;
typedef CGAL::Delaunay_triangulation_2<Gt> Delaunay;
typedef K::Point_2 Point_2;
typedef std::vector<Point_2> Points;
int main()
{
Points points;
points.push_back(Point_2(0,0));
points.push_back(Point_2(0,7));
points.push_back(Point_2(7,0));
points.push_back(Point_2(7,7));
Delaunay dt(points.begin(), points.end());
// Print Cartesian coordinates of vertices of triangles in 2D Delaunay triangulation
for (Delaunay::Finite_faces_iterator it = dt.finite_faces_begin(); it != dt.finite_faces_end(); it++)
{
std::cout << " " << dt.triangle(it)[0].x() << " " << dt.triangle(it)[0].y() << " ";
std::cout << " " << dt.triangle(it)[1].x() << " " << dt.triangle(it)[1].y() << " ";
std::cout << " " << dt.triangle(it)[2].x() << " " << dt.triangle(it)[2].y() << " ";
std::cout << std::endl << "-------------------" << std::endl;
}
return 0;
}
以下是Google的一個示例。 Finite_faces_iterator是typedefed。
Interval_skip_list isl;
for(Finite_faces_iterator fh = dt.finite_faces_begin();
fh != dt.finite_faces_end();
++fh){
isl.insert(Interval(fh));
}
std::list<Interval> level;
isl.find_intervals(50, std::back_inserter(level));
for(std::list<Interval>::iterator it = level.begin();
it != level.end();
++it){
std::cout << dt.triangle(it->face_handle()) << std::endl;
}
這不是你想要的,但給你一個例子,說明迭代器可以做些什么。
如果你想要一個如何完全按照你想要的方式進行擴展的示例,請從這里查看X-Plane場景工具的源代碼: http : //scenery.x-plane.com/code.php
通過擴展示例,我的意思是幾十萬行,但幾乎所有CGAL都可以使用Delaunay三角測量和擴展屬性。
我剛剛遇到了類似的問題,我做了很多研究(主要是因為我對C ++沒有任何了解)。 我希望能夠通過它的頂點整數表示來打印三角形。 這是它的外觀:
#include <CGAL/Surface_mesh_default_triangulation_3.h>
#include <CGAL/Complex_2_in_triangulation_3.h>
#include <CGAL/make_surface_mesh.h>
#include <CGAL/Implicit_surface_3.h>
// This is the file where you can look for an example of iterating, geting basic vertex positions, outputing triangles
// #include <CGAL/IO/Complex_2_in_triangulation_3_file_writer.h>
// default triangulation for Surface_mesher
typedef CGAL::Surface_mesh_default_triangulation_3 Tr;
// c2t3
typedef CGAL::Complex_2_in_triangulation_3<Tr> C2t3;
typedef Tr::Geom_traits GT;
typedef GT::Sphere_3 Sphere_3;
typedef GT::Point_3 Point_3;
typedef GT::FT FT;
typedef FT (*Function)(Point_3);
typedef CGAL::Implicit_surface_3<GT, Function> Surface_3;
// This already have been defined
//typedef typename C2t3::Triangulation Tr;
typedef typename Tr::Vertex_handle Vertex_handle;
typedef typename Tr::Finite_vertices_iterator Finite_vertices_iterator;
typedef typename Tr::Finite_facets_iterator Finite_facets_iterator;
typedef typename Tr::Point Point;
FT sphere_function (Point_3 p) {
const FT x = p.x();
const FT y = p.y();
const FT z = p.z();
//const FT x2=p.x()*p.x(), y2=p.y()*p.y(), z2=p.z()*p.z();
const FT a = 2;
const FT b = 1;
const FT c = 1.5;
return x*x/a/a + y*y/b/b + z*z/c/c -1;
}
int main() {
Tr tr; // 3D-Delaunay triangulation
C2t3 c2t3 (tr); // 2D-complex in 3D-Delaunay triangulation
// defining the surface
Surface_3 surface(sphere_function, // pointer to function
Sphere_3(CGAL::ORIGIN, 2.)); // bounding sphere
// Note that "2." above is the *squared* radius of the bounding sphere!
// defining meshing criteria
CGAL::Surface_mesh_default_criteria_3<Tr> criteria(30., // angular bound
0.1, // radius bound
0.1); // distance bound
// meshing surface
CGAL::make_surface_mesh(c2t3, surface, criteria, CGAL::Non_manifold_tag());
std::cout << "Final number of points: " << tr.number_of_vertices() << "\n";
// Here should be the main code
Tr& tr2 = c2t3.triangulation();
std::map<Vertex_handle, int> V;
int inum = 0;
Finite_vertices_iterator vit = tr2.finite_vertices_begin();
while(vit != tr2.finite_vertices_end()) {
// making an integer representation of vertex pointers
V[vit] = inum++;
// obtaining vertex positions from vertex pointer vit
Point p = static_cast<Point>(vit->point());
std::cout << p.x() << " " << p.y() << " " << p.z() << std::endl;
++vit;
}
Finite_facets_iterator fit = tr2.finite_facets_begin();
while (fit != tr2.finite_facets_end()) {
typename Tr::Cell_handle cell = fit->first;
const int& index = fit->second;
int index1 = V[cell->vertex(tr.vertex_triple_index(index, 0))];
int index2 = V[cell->vertex(tr.vertex_triple_index(index, 1))];
int index3 = V[cell->vertex(tr.vertex_triple_index(index, 2))];
std::cout << index1 << " " << index2 << " " << index3 << std::endl;
++fit;
}
}
編譯它(如果mesh_implicit_function
是源,目標文件和可執行文件):
c++ -DCGAL_USE_GMP -DCGAL_USE_MPFR -DCGAL_USE_ZLIB -frounding-math -o mesh_an_implicit_function.cpp.o -c mesh_an_implicit_function.cpp
c++ mesh_an_implicit_function.cpp.o -o mesh_an_implicit_function -lmpfr -lgmp -lCGAL -lboost_thread
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.