Um aus einer Reihe von Punkten zu interpolieren (z. B. Gitter auf reguläre Gitter), wird Delaunay_triangulation_2 zum Erstellen des Dreiecksnetzes verwendet, wobei natural_neigbor_coordinates_2() und linear_interpolation() für die Interpolation verwendet werden.CGAL-Interpolation auf Dreiecksgitter bleibt hängen
Ein Problem, das ich fand, ist, dass, wenn die Eingabepunkte aus einigen regulären Grids stammen, der Interpolationsprozess an einigen Ausgabestellen "stecken bleiben" kann: Der Prozess wird von natürlich_newighbor_coordinates_2() belegt, aber er kehrt nie zurück. Es wird durchlaufen, wenn zufälliges Rauschen zu den Koordinaten der Eingabepunkte hinzugefügt wird.
Frage mich, ob auch jemand dieses Problem hatte und was die Lösung ist. Hinzufügen von Zufallsrauschen ist OK, beeinflusst aber die Genauigkeit der Interpolation.
Die Skripte für die Interpolation wie unten (I Armadillo bin mit für Matrix)
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.
Also ist es ein Fehler in CGAL immer noch nicht behoben ... danke. Ich könnte zu diesem Zweck QHULL verwenden. –