2016-03-24 5 views
0

Wie kann ich einen 3D-Strahl mit einer 2D-Constrained-Delaunay-Triangulation schneiden, die aus 3D-Punkten mithilfe der project_xy-Merkmale erstellt wurde?Schnittpunkt einer Strahlen- und Delaunay-Triangulation

In einem cgal-discuss post kommentieren sie mit einem Baum, wenn ich viele Abfragen machen muss. Ich habe nicht viele, dachte ich, ungefähr 200 von ihnen. Ich könnte jedoch viele Punkte haben,> 200 Millionen.

Sie äußern auch einen anderen Ansatz:

Eine dritte Alternative ist ein Endpunkt in der Triangulation zu lokalisieren und in Richtung des anderen Endpunktes zu gehen um die Zellen zu sammeln Sie durchqueren.

Aber ich verstehe nicht, wie können wir testen, dass wir die Triangulation durchlaufen haben. In meinem Fall ist das 3D-Triangulationsnetz ein Modell eines Geländes, das nahe einer Ebene ist, was bedeutet, dass meistens nur ein Schnittpunkt existiert und ich den Strahl gegebenenfalls als Segment begrenzen kann.

Lohnt es sich einen Baum zu bauen? Welchen anderen Ansatz könnte ich verfolgen? Iterieren über alle Gesichter scheint sehr ineffizient.

Einige typedefs ich habe, etwas Kontext zu geben:

typedef CGAL::Exact_predicates_inexact_constructions_kernel K; 
typedef CGAL::Projection_traits_xy_3<K> Gt; 
typedef K::Point_3 Point3; 

typedef CGAL::Triangulation_vertex_base_2<Gt> Vb; 
typedef CGAL::Delaunay_mesh_face_base_2<Gt> Fb; 
typedef CGAL::Triangulation_data_structure_2<Vb, Fb> Tds; 
typedef CGAL::Constrained_Delaunay_triangulation_2<Gt, Tds> CDT; 

Antwort

0

Sie können die line_walk() Funktion verwenden, um alle Zellen in zwei durch den Strahl durchlaufen zu bekommen. Dann müssen Sie sie einfach in 3D herausfiltern, indem Sie die Segment-Dreieck-Funktion do_intersect() verwenden.