// Copyright (c) 1998 Max-Planck-Institute Saarbruecken (Germany). // All rights reserved. // // This file is part of CGAL (www.cgal.org). // // $URL: https://github.com/CGAL/cgal/blob/v5.1/Convex_hull_2/include/CGAL/segment_intersection_points_2.h $ // $Id: segment_intersection_points_2.h 0779373 2020-03-26T13:31:46+01:00 Sébastien Loriot // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // // // Author(s) : Stefan Schirra #ifndef CGAL_SEGMENT_INTERSECTION_POINTS_2_H #define CGAL_SEGMENT_INTERSECTION_POINTS_2_H #include #include #include #include namespace CGAL { /* #include template OutputIterator si_brute_force(ForwardIterator first, ForwardIterator last, OutputIterator result, const R& ) { typedef Point_2 Point; ForwardIterator inner, outer; Object i_obj; Point p; for ( outer = first; outer != last; ++outer) for ( inner = successor(outer); inner != last; ++inner) { i_obj = intersection( *outer, *inner); if ( assign( p, i_obj) ) result++ = p; } return result; } */ template OutputIterator si_brute_force_II(ForwardIterator first, ForwardIterator last, OutputIterator result, const Traits& traits) { typedef typename Traits::Point_2 Point; typedef typename Traits::Line_2 Line; typedef typename Traits::Orientation_2 Orientation; Orientation orientation = traits.orientation_2_object(); for ( ForwardIterator outer = first; outer != last; ++outer) for ( ForwardIterator inner = std::next(outer); inner != last; ++inner) { Point s1 = (*outer).source(); Point e1 = (*outer).target(); Point s2 = (*inner).source(); Point e2 = (*inner).target(); if ( (orientation( s1, e1, s2) != orientation( s1, e1, e2)) &&(orientation( s2, e2, s1) != orientation( s2, e2, e1))) { Line l1( s1, e1); Line l2( s2, e2); result++ = Point( l1.b()*l2.c() - l2.b()*l1.c(), l2.a()*l1.c() - l1.a()*l2.c(), l1.a()*l2.b() - l2.a()*l1.b()); } } return result; } template OutputIterator segment_intersection_points_2(ForwardIterator first, ForwardIterator last, OutputIterator result, const Traits& traits) { return si_brute_force_II( first, last, result, traits); } template OutputIterator segment_intersection_points_2(ForwardIterator first, ForwardIterator last, OutputIterator result) { typedef std::iterator_traits ITraits; typedef typename ITraits::value_type value_type; typedef CGAL::Kernel_traits KTraits; typedef typename KTraits::Kernel Kernel; return segment_intersection_points_2( first, last, result, Kernel()); } } // namespace CGAL #endif // CGAL_SEGMENT_INTERSECTION_POINTS_2_H