三角形网格上的CGAL插值卡住了

时间:2017-03-08 17:57:02

标签: c++ interpolation cgal

要从一组散乱点进行插值(例如将它们网格化到常规网格上),使用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.

1 个答案:

答案 0 :(得分:0)

这让我想起了如果点对齐,random_polygon_2()卡住的问题,在这里讨论: http://cgal-discuss.949826.n4.nabble.com/random-polygon-2-gets-stuck-possible-CGAL-bug-td4659470.html

我建议尝试使用Sebastien的回答中的一组点来运行您的代码。你的问题也可能与被对齐的点有关(只是一个猜测)。