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 sé qué algoritmo que utilizan):
//! \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
Disculpe, no se puede encontrar la referencia a un algoritmo (ligeramente) más rápido.
Ngu, he Una vez implementado Bentley-Ottmann en Java que maneja todos los casos de esquina. No se ha usado en el código de producción (AFAIK), pero escribí una cantidad decente de pruebas unitarias para él. Entonces, si está interesado, podría publicar un enlace a mi pequeña biblioteca que tiene este algoritmo. –
El hecho de que Boost y LEDA no proporcionen Bentley-Ottmann podría deberse a que existen algoritmos que superan a Bentley-Ottmann. AFAIK, Bentley-Ottmann es uno de los algoritmos "más fáciles" que encuentran todas las intersecciones de un conjunto de segmentos de línea. –
@Bart, le agradecería si pudiera proporcionarme el enlace de Java. Además, ¿cuáles son los otros algoritmos de intersección de línea implementados en Boost que superan a Bentley-Ottmann? – Graviton