2017-03-08 1 views
0

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. 

Antwort

0

Das erinnert mich an ein Problem mit random_polygon_2() stecken zu bleiben, wenn die Punkte ausgerichtet sind, die hier beschrieben: http://cgal-discuss.949826.n4.nabble.com/random-polygon-2-gets-stuck-possible-CGAL-bug-td4659470.html

Ich würde vorschlagen, versuchen Sie, Ihren Code mit der Menge von Punkten von Sebastien Antwort zu laufen. Ihr Problem könnte auch damit zusammenhängen, dass Punkte ausgerichtet sind (nur eine Schätzung).

+0

Also ist es ein Fehler in CGAL immer noch nicht behoben ... danke. Ich könnte zu diesem Zweck QHULL verwenden. –

Verwandte Themen