// Copyright (c) 2000 Utrecht University (The Netherlands), // ETH Zurich (Switzerland), Freie Universitaet Berlin (Germany), // INRIA Sophia-Antipolis (France), Martin-Luther-University Halle-Wittenberg // (Germany), Max-Planck-Institute Saarbruecken (Germany), RISC Linz (Austria), // and Tel-Aviv University (Israel). All rights reserved. // // This file is part of CGAL (www.cgal.org); you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License as // published by the Free Software Foundation; version 2.1 of the License. // See the file LICENSE.LGPL distributed with CGAL. // // Licensees holding a valid commercial license may use this file in // accordance with the commercial license agreement provided with the software. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // $URL$ // $Id$ // // // Author(s) : Geert-Jan Giezeman #ifndef CGAL_SEGMENT_2_LINE_2_INTERSECTION_H #define CGAL_SEGMENT_2_LINE_2_INTERSECTION_H #include #include #include #include #include #include #include CGAL_BEGIN_NAMESPACE namespace CGALi { template class Segment_2_Line_2_pair { public: enum Intersection_results {NO_INTERSECTION, POINT, SEGMENT}; Segment_2_Line_2_pair() ; Segment_2_Line_2_pair(typename K::Segment_2 const *seg, typename K::Line_2 const *line); Intersection_results intersection_type() const; bool intersection(typename K::Point_2 &result) const; bool intersection(typename K::Segment_2 &result) const; protected: typename K::Segment_2 const*_seg; typename K::Line_2 const * _line; mutable bool _known; mutable Intersection_results _result; mutable typename K::Point_2 _intersection_point; }; template inline bool do_intersect( const typename CGAL_WRAP(K)::Segment_2 &p1, const typename CGAL_WRAP(K)::Line_2 &p2, const K&) { typedef Segment_2_Line_2_pair pair_t; pair_t pair(&p1, &p2); return pair.intersection_type() != pair_t::NO_INTERSECTION; } template Object intersection(const typename CGAL_WRAP(K)::Segment_2 &seg, const typename CGAL_WRAP(K)::Line_2 &line, const K&) { typedef Segment_2_Line_2_pair is_t; is_t ispair(&seg, &line); switch (ispair.intersection_type()) { case is_t::NO_INTERSECTION: default: return Object(); case is_t::POINT: { typename K::Point_2 pt; ispair.intersection(pt); return make_object(pt); } case is_t::SEGMENT: return make_object(seg); } } template Object intersection(const typename CGAL_WRAP(K)::Line_2 &line, const typename CGAL_WRAP(K)::Segment_2 &seg, const K& k) { return CGALi::intersection(seg, line, k); } template class Line_2_Segment_2_pair: public Segment_2_Line_2_pair { public: Line_2_Segment_2_pair( typename K::Line_2 const *line, typename K::Segment_2 const *seg) : Segment_2_Line_2_pair(seg, line) {} }; template inline bool do_intersect( const typename CGAL_WRAP(K)::Line_2 &p1, const typename CGAL_WRAP(K)::Segment_2 &p2, const K&) { typedef Line_2_Segment_2_pair pair_t; pair_t pair(&p1, &p2); return pair.intersection_type() != pair_t::NO_INTERSECTION; } template Segment_2_Line_2_pair::Segment_2_Line_2_pair() { _seg = 0; _line = 0; _known = false; } template Segment_2_Line_2_pair::Segment_2_Line_2_pair( typename K::Segment_2 const *seg, typename K::Line_2 const *line) { _seg = seg; _line = line; _known = false; } template typename Segment_2_Line_2_pair::Intersection_results Segment_2_Line_2_pair::intersection_type() const { if (_known) return _result; // The non const this pointer is used to cast away const. _known = true; const typename K::Line_2 &l1 = _seg->supporting_line(); Line_2_Line_2_pair linepair(&l1, _line); switch ( linepair.intersection_type()) { case Line_2_Line_2_pair::NO_INTERSECTION: _result = NO_INTERSECTION; break; case Line_2_Line_2_pair::POINT: linepair.intersection(_intersection_point); _result = (_seg->collinear_has_on(_intersection_point) ) ? POINT : NO_INTERSECTION; break; case Line_2_Line_2_pair::LINE: _result = SEGMENT; break; } return _result; } template bool Segment_2_Line_2_pair::intersection(typename K::Point_2 &result) const { if (!_known) intersection_type(); if (_result != POINT) return false; result = _intersection_point; return true; } template bool Segment_2_Line_2_pair::intersection(typename K::Segment_2 &result) const { if (!_known) intersection_type(); if (_result != SEGMENT) return false; result = *_seg; return true; } } // namespace CGALi template inline bool do_intersect(const Segment_2 &seg, const Line_2 &line) { typedef typename K::Do_intersect_2 Do_intersect; return Do_intersect()(seg, line); } template inline bool do_intersect(const Line_2 &line, const Segment_2 &seg) { typedef typename K::Do_intersect_2 Do_intersect; return Do_intersect()(line, seg); } template inline Object intersection(const Line_2 &line, const Segment_2 &seg) { typedef typename K::Intersect_2 Intersect; return Intersect()(seg, line); } template inline Object intersection(const Segment_2 &seg, const Line_2 &line) { typedef typename K::Intersect_2 Intersect; return Intersect()(line, seg); } CGAL_END_NAMESPACE #endif