c++ computational-geometry

¿Existe una implementación robusta en C++ del algoritmo Bentley-Ottmann?



cgal windows (3)

http://geomalgorithms.com/a09-_intersect-3.html tiene una discusión de los algoritmos de Bentley-Ottmann y Shamos-Hoey y su relación. Termina con una implementación de C ++ basada en árboles binarios. Material de referencia interesante si no desea vincular a CGAL o impulsar.

El algoritmo Bentley-Otomano encuentra todos los cruces en un conjunto de segmentos de línea. Para un algoritmo bien conocido e importante, parece bastante extraño que una implementación en C ++ del algoritmo Bentley-Ottmann, la implementación que puede manejar todos los casos degenerados (es decir, no haya una suposición especial sobre la línea de barrido y el número de puntos de intersección, y así en) - simplemente no está disponible. El único código que puedo encontrar está here , pero no parece manejar el caso generalizado .

¿El algoritmo de Bentley-Ottmann ya está implementado en una biblioteca bien probada, como Boost o LEDA? En caso afirmativo, ¿puedo tener la referencia a él?


CGAL tiene algo allí con la misma complejidad que Bentley-Ottmann, O((n + k)*log(n)) donde n es el número de segmentos y k es el número de intersecciones (no estoy seguro de qué algoritmo usaron):

//! /file examples/Arrangement_on_surface_2/sweep_line.cpp // Computing intersection points among curves using the sweep line. #include <CGAL/Cartesian.h> #include <CGAL/MP_Float.h> #include <CGAL/Quotient.h> #include <CGAL/Arr_segment_traits_2.h> #include <CGAL/Sweep_line_2_algorithms.h> #include <list> typedef CGAL::Quotient<CGAL::MP_Float> NT; typedef CGAL::Cartesian<NT> Kernel; typedef Kernel::Point_2 Point_2; typedef CGAL::Arr_segment_traits_2<Kernel> Traits_2; typedef Traits_2::Curve_2 Segment_2; int main() { // Construct the input segments. Segment_2 segments[] = {Segment_2 (Point_2 (1, 5), Point_2 (8, 5)), Segment_2 (Point_2 (1, 1), Point_2 (8, 8)), Segment_2 (Point_2 (3, 1), Point_2 (3, 8)), Segment_2 (Point_2 (8, 5), Point_2 (8, 8))}; // Compute all intersection points. std::list<Point_2> pts; CGAL::compute_intersection_points (segments, segments + 4, std::back_inserter (pts)); // Print the result. std::cout << "Found " << pts.size() << " intersection points: " << std::endl; std::copy (pts.begin(), pts.end(), std::ostream_iterator<Point_2>(std::cout, "/n")); // Compute the non-intersecting sub-segments induced by the input segments. std::list<Segment_2> sub_segs; CGAL::compute_subcurves(segments, segments + 4, std::back_inserter(sub_segs)); std::cout << "Found " << sub_segs.size() << " interior-disjoint sub-segments." << std::endl; CGAL_assertion (CGAL::do_curves_intersect (segments, segments + 4)); return 0; }

http://doc.cgal.org/latest/Sweep_line_2/index.html