// Copyright (c) 1999 // Utrecht University (The Netherlands), // ETH Zurich (Switzerland), // INRIA Sophia-Antipolis (France), // Max-Planck-Institute Saarbruecken (Germany), // 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; either version 3 of the License, // or (at your option) any later version. // // 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$ // SPDX-License-Identifier: LGPL-3.0+ // // // Author(s) : Stefan Schirra #ifndef CGAL_RAYH3_H #define CGAL_RAYH3_H #include #include #include #include namespace CGAL { template < class R_ > class RayH3 { typedef typename R_::RT RT; typedef typename R_::FT FT; typedef typename R_::Point_3 Point_3; typedef typename R_::Line_3 Line_3; typedef typename R_::Direction_3 Direction_3; typedef typename R_::Vector_3 Vector_3; typedef std::pair Rep; typedef typename R_::template Handle::type Base; Base base; public: typedef R_ R; RayH3() {} RayH3( const Point_3& sp, const Point_3& secondp) : base(sp, secondp-sp) {} RayH3( const Point_3& sp, const Vector_3& v) : base(sp, v) {} RayH3( const Point_3& sp, const Direction_3& d) : base(sp, d.to_vector()) {} RayH3( const Point_3& sp, const Line_3& l) : base(sp, l.to_vector()) {} const Point_3 & start() const; const Point_3 & source() const; Point_3 second_point() const; Point_3 point(int i) const; Direction_3 direction() const; const Vector_3 & to_vector() const; Line_3 supporting_line() const; RayH3 opposite() const; bool has_on(const Point_3& p) const; bool collinear_has_on(const Point_3 &p) const; bool is_degenerate() const; bool operator==(const RayH3& r) const; bool operator!=(const RayH3& r) const; }; template < class R > inline const typename RayH3::Point_3 & RayH3::source() const { return get_pointee_or_identity(base).first; } template < class R > inline const typename RayH3::Point_3 & RayH3::start() const { return get_pointee_or_identity(base).first; } template < class R > inline const typename RayH3::Vector_3 & RayH3::to_vector() const { return get_pointee_or_identity(base).second; } template < class R > inline typename RayH3::Direction_3 RayH3::direction() const { return to_vector().direction(); } template < class R > CGAL_KERNEL_INLINE typename RayH3::Point_3 RayH3::second_point() const { return start() + to_vector(); } template < class R > CGAL_KERNEL_INLINE typename RayH3::Point_3 RayH3::point(int i) const { CGAL_kernel_precondition( i >= 0 ); return start() + RT(i)*to_vector(); } template < class R > CGAL_KERNEL_INLINE typename RayH3::Line_3 RayH3::supporting_line() const { CGAL_kernel_precondition( !is_degenerate() ); return Line_3(start(), second_point() ); } template < class R > CGAL_KERNEL_INLINE RayH3 RayH3::opposite() const { return RayH3( start(), - direction() ); } template < class R > CGAL_KERNEL_INLINE bool RayH3::has_on(const typename RayH3::Point_3 &p) const { return ( ( p == start() ) ||( Direction_3(p - start()) == direction() ) ); } template < class R > inline /* XXX */ bool RayH3::collinear_has_on(const typename RayH3::Point_3 &p) const { return has_on(p); } template < class R > inline bool RayH3::is_degenerate() const { return to_vector() == NULL_VECTOR; } template < class R > CGAL_KERNEL_INLINE bool RayH3::operator==(const RayH3& r) const { return ( (start() == r.start() )&&( direction() == r.direction() ) ); } template < class R > CGAL_KERNEL_INLINE bool RayH3::operator!=( const RayH3& r) const { return !operator==(r); } } //namespace CGAL #endif // CGAL_RAYH3_H