一、主要函数
头文件
#include <CGAL/compute_average_spacing.h>
函数
FT CGAL::compute_average_spacing ( const PointRange & points,
unsigned int k,
const NamedParameters & np = parameters::default_values()
)
points
:输入点云k
:邻域点数,k需要大于2。
函数compute_average_spacing()
计算所有输入点到它们的k个最近邻点的平均间距,k
由用户指定。该函数提供了一个点集密度的阶数,用于曲面重构管道的下游,自动确定曲面重构的输出网格尺寸等参数。
二、代码实现
1、版本一
#include <vector>
#include <CGAL/Point_set_3.h>
#include <CGAL/Point_set_3/IO.h>
#include <CGAL/compute_average_spacing.h> // 计算平均密度
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
int main()
{
CGAL::Point_set_3<Kernel::Point_3> point_set; //创建一个三维点云容器
if (!CGAL::IO::read_XYZ("cgal//kitten.xyz", point_set))
{
std::cerr << "点云读取失败\n" << std::endl;
return -1;
}
std::cout << "加载点云的点数:" << point_set.size() << std::endl;
int k = 6; // 进行密度计算的邻域点数
double spacing = CGAL::compute_average_spacing<CGAL::Sequential_tag>(point_set, k);
std::cout << "点云的平均密度为:" << spacing << std::endl;
return 0;
}
2、版本二
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/compute_average_spacing.h>
#include <CGAL/IO/read_points.h>
#include <vector>
#include <fstream>
#include <boost/tuple/tuple.hpp>
// Types
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef Kernel::FT FT;
typedef Kernel::Point_3 Point;
// Data type := index, followed by the point, followed by three integers that
// define the Red Green Blue color of the point.
typedef boost::tuple<int, Point, int, int, int> IndexedPointWithColorTuple;
// Concurrency
typedef CGAL::Parallel_if_available_tag Concurrency_tag;
int main(int argc, char* argv[])
{
const std::string fname = (argc > 1) ? argv[1] : CGAL::data_file_path("points_3/sphere_20k.xyz");
// Reads a file in points.
// As the point is the second element of the tuple (that is with index 1)
// we use a property map that accesses the 1st element of the tuple.
std::vector<IndexedPointWithColorTuple> points;
if (!CGAL::IO::read_points(fname, std::back_inserter(points),
CGAL::parameters::point_map(CGAL::Nth_of_tuple_property_map<1, IndexedPointWithColorTuple>())))
{
std::cerr << "Error: cannot read file " << fname << std::endl;
return EXIT_FAILURE;
}
// Initialize index and RGB color fields in tuple.
// As the index and RGB color are respectively the first and third-fifth elements
// of the tuple we use a get function from the property map that accesses the 0
// and 2-4th elements of the tuple.
for (unsigned int i = 0; i < points.size(); i++)
{
points[i].get<0>() = i; // set index value of tuple to i
points[i].get<2>() = 0; // set RGB color to black
points[i].get<3>() = 0;
points[i].get<4>() = 0;
}
// Computes average spacing.
const unsigned int nb_neighbors = 6; // 1 ring
FT average_spacing = CGAL::compute_average_spacing<Concurrency_tag>(
points, nb_neighbors,
CGAL::parameters::point_map(CGAL::Nth_of_tuple_property_map<1, IndexedPointWithColorTuple>()));
std::cout << "Average spacing: " << average_spacing << std::endl;
return EXIT_SUCCESS;
}
三、结果展示
加载点云的点数:5210
点云的平均密度为:0.0168572