1、介绍
CGAL库中提供了各种用于几何对象的生成器。它们作为合成测试数据集非常有用,例如用于测试退化对象集上的算法和性能分析。
提供了两种点生成器:第一种是随机点生成器,第二种是确定性点生成器。大多数随机点生成器和少数确定性点生成器被提供作为输入迭代器。输入迭代器模拟无限序列的点。算法std::copy_n可用于复制有限序列。迭代器适配器Counting_iterator可用于创建有限迭代器范围。其他生成器作为函数提供,用于写入输出迭代器。其他函数添加退化或随机扰动。
在二维中,我们提供输入迭代器来生成圆盘中的随机点(Random_points_in_disc_2)、正方形中的随机点(Random_points_in_square_2)、圆上的随机点(Random_points_on_circle_2)、线段上的随机点(Random_points_on_segment)、正方形中的随机点(Random_points_on_square_2)、三角形中的随机点(Random_points_in_triangle_2)、三角形范围内的随机点(Random_points_in_triangles_2)和三角形网格中的随机点(Random_points_in_triangle_mesh_2)。为了生成网格点,我们提供了三个函数:points_on_segment_2()、points_on_square_grid_2(),它们可以写入输出迭代器和输入迭代器Points_on_segment_2。
对于三维点,提供了输入迭代器,用于在球体(Random_points_in_sphere_3)、三角形(Random_points_in_triangle_3)、三角形范围(Random_points_in_triangles_3)、四面体(Random_points_in_tetrahedron_3)、立方体(Random_points_in_cube_3)、球体边界(Random_points_on_sphere_3)、三角形网格(Random_points_in_triangle_mesh_3)、四面体网格(Random_points_in_tetrahedral_mesh_3)和四面体网格边界(Random_points_in_tetrahedral_mesh_boundary_3)中均匀分布的随机点。为了生成3D网格点,我们提供了函数points_on_cube_grid_3(),该函数将写入输出迭代器。
对于更高维,提供了输入迭代器,用于在d维立方体(Random_points_in_cube_d)或d维球体(Random_points_in_ball_d)中均匀分布的随机点,或在球体(Random_points_on_sphere_d)的边界上均匀分布的随机点。对于生成网格点,我们提供了函数points_on_cube_grid_d(),该函数会写入输出迭代器。
我们还提供了两个函数来生成更复杂的几何对象。函数 random_convex_set_2() 计算给定大小的随机凸平面点集,其中的点是从特定域中绘制的,而 random_polygon_2() 则从特定域中绘制的点生成一个随机简单多边形。函数 random_convex_hull_in_disc_2() 从圆内均匀生成的随机点计算一个随机多边形作为凸包。
1.1、随机扰动
像网格点这样的退化输入集可以被随机扰动一小部分,以产生准退化测试集。这挑战了使用不精确算术和精确谓词来计算略微偏离零的表达式符号的算法的数值稳定性。为此,提供了perturb_points_2()函数。
1.2、增加退化
对于给定的点集,可以通过添加新点来产生某些类型的退化。 random_selection() 函数对于生成相同点的多个副本非常有用。 random_collinear_points_2() 函数将共线添加到点集中。
1.3、生成器支持的功能和类
函数 random_selection() 从随机访问迭代器范围中随机选择 n 个项目,这对于生成具有多个相同项目的退化输入数据集很有用。
类 Combination_enumerator<CombinationElement> 用于枚举一系列元素的固定大小组合(子集)。在高维三角剖分的上下文中很有用,例如,用于枚举单形的面。
2、范例
2.1、生成退化点集的范例
std::copy_n( g, 600, std::back_inserter(points));
points_on_square_grid_2( 250.0, 200, std::back_inserter(points),Creator());
random_selection( points.begin(), points.end(), 100,
std::back_inserter(points));
random_collinear_points_2( points.begin(), points.end(), 100,
2.2、生成网格的点集
points_on_square_grid_2( 255.0, 250, std::back_inserter(points),Creator());
2.3、在三角形网格上生成随机点集
Polyhedron polyhedron;
polyhedron.make_tetrahedron(Point(-1,0,0), Point(0,1,0), Point(1,0,0), Point(0,0,-1));
Random_points_in_triangle_mesh_3<Polyhedron>
g(polyhedron);
2.4、从其他生成器生成组合对象
typedef Random_points_on_segment_2<Point,Pt_creator> P1;
P1 p1( Point(-100,0), Point(100,0));
typedef Random_points_on_circle_2<Point,Pt_creator> P2;
P2 p2( 250);
typedef Creator_uniform_2< Point, Segment> Seg_creator;
typedef Join_input_iterator_2< P1, P2, Seg_creator> Seg_iterator;
2.5、生成d维中的点集
CGAL::Random_points_in_cube_d<Point> gen (dim, size);
CGAL::points_on_cube_grid_d (dim, size, static_cast<std::size_t>(nb_points),
std::back_inserter(v), Creator_d(dim) );
2.6、产生在一定范围内个数为n的组合
CGAL::Combination_enumerator<int> combi(k, first, last + 1);
2.7、产生由多个字符串的组成
CGAL::Combination_enumerator<vector<string>::iterator>
combi(2, names.begin(), names.end());