¿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;
}
CGAL tiene una implementación del algoritmo Bently-Ottmann. Puede encontrar más información al respecto en la sección Línea de barrido 2D de curvas planas del manual.