Ada*_*gen 15 c++ delaunay triangulation cgal computational-geometry
我正在尝试使用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;
}
Run Code Online (Sandbox Code Playgroud)
Iva*_*Siu 11
您可以使用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;
}
Run Code Online (Sandbox Code Playgroud)
小智 5
可以使用 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;
}
Run Code Online (Sandbox Code Playgroud)
这是谷歌的一个例子。Finite_faces_iterator 是类型定义的。
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;
}
Run Code Online (Sandbox Code Playgroud)
这不会执行您想要的操作,但为您提供了一个可以使用迭代器执行的操作的示例。