要从一组散乱点进行插值(例如将它们网格化到常规网格上),使用Delaunay_triangulation_2构建三角形网格,使用natural_neighbor_coordinates_2()和linear_interpolation()进行插值。
我遇到的一个问题是,当输入点来自某些常规网格时,插值过程可能会在某个输出位置“卡住”:该进程被natural_neighbor_coordinates_2()占用,但它永远不会返回。如果将随机噪声添加到输入点的坐标上,它将会运行。
不知道是否有人也有这个问题,解决方案是什么。添加随机噪声是可以的,但会影响插值的准确性。
插值脚本如下(我使用Armadillo作为矩阵)
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::FT Coord_type;
Delaunay_triangulation T;
arma::fmat points = ... ; //matrix saving point coordinates and function value
float output_x=...,output_y=...; //location for interpolation
std::map<Point, Coord_type, K::Less_xy_2> function_values;
// build mesh
for (long long i=0;i<points.n_cols;i++)
{
K::Point_2 p(points(0,i),points(1,i));
T.insert(p);
function_values.insert(std::make_pair(p,points(2,i)));
}
// interpolate
K::Point_2 p(output_x,output_y);
std::vector< std::pair< Point, Coord_type > > coords;
Coord_type norm = CGAL::natural_neighbor_coordinates_2(T, p, std::back_inserter(coords)).second;
Coord_type res = CGAL::linear_interpolation(coords.begin(), coords.end(), norm, Value_access(function_values)); //res is the interpolation result.
答案 0 :(得分:0)
这让我想起了如果点对齐,random_polygon_2()卡住的问题,在这里讨论: http://cgal-discuss.949826.n4.nabble.com/random-polygon-2-gets-stuck-possible-CGAL-bug-td4659470.html
我建议尝试使用Sebastien的回答中的一组点来运行您的代码。你的问题也可能与被对齐的点有关(只是一个猜测)。