170 lines
4.0 KiB
C++
170 lines
4.0 KiB
C++
// 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)
|
|
//
|
|
// $URL: https://github.com/CGAL/cgal/blob/v5.1/Homogeneous_kernel/include/CGAL/Homogeneous/RayH3.h $
|
|
// $Id: RayH3.h 0779373 2020-03-26T13:31:46+01:00 Sébastien Loriot
|
|
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
|
|
//
|
|
//
|
|
// Author(s) : Stefan Schirra
|
|
|
|
#ifndef CGAL_RAYH3_H
|
|
#define CGAL_RAYH3_H
|
|
|
|
#include <utility>
|
|
#include <CGAL/kernel_config.h>
|
|
#include <CGAL/assertions.h>
|
|
#include <CGAL/Origin.h>
|
|
|
|
namespace CGAL {
|
|
|
|
template < class R_ >
|
|
class RayH3
|
|
{
|
|
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<Point_3, Vector_3> Rep;
|
|
typedef typename R_::template Handle<Rep>::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(const FT i) const;
|
|
Direction_3 direction() const;
|
|
const Vector_3 & to_vector() const;
|
|
Line_3 supporting_line() const;
|
|
RayH3<R> 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>& r) const;
|
|
bool operator!=(const RayH3<R>& r) const;
|
|
};
|
|
|
|
template < class R >
|
|
inline
|
|
const typename RayH3<R>::Point_3 &
|
|
RayH3<R>::source() const
|
|
{ return get_pointee_or_identity(base).first; }
|
|
|
|
template < class R >
|
|
inline
|
|
const typename RayH3<R>::Point_3 &
|
|
RayH3<R>::start() const
|
|
{ return get_pointee_or_identity(base).first; }
|
|
|
|
template < class R >
|
|
inline
|
|
const typename RayH3<R>::Vector_3 &
|
|
RayH3<R>::to_vector() const
|
|
{
|
|
return get_pointee_or_identity(base).second;
|
|
}
|
|
|
|
template < class R >
|
|
inline
|
|
typename RayH3<R>::Direction_3
|
|
RayH3<R>::direction() const
|
|
{
|
|
return to_vector().direction();
|
|
}
|
|
|
|
template < class R >
|
|
CGAL_KERNEL_INLINE
|
|
typename RayH3<R>::Point_3
|
|
RayH3<R>::second_point() const
|
|
{ return start() + to_vector(); }
|
|
|
|
template < class R >
|
|
CGAL_KERNEL_INLINE
|
|
typename RayH3<R>::Point_3
|
|
RayH3<R>::point(const FT i) const
|
|
{
|
|
CGAL_kernel_precondition( i >= FT(0) );
|
|
if (i == FT(0)) return source();
|
|
return start() + i * to_vector();
|
|
}
|
|
|
|
template < class R >
|
|
CGAL_KERNEL_INLINE
|
|
typename RayH3<R>::Line_3
|
|
RayH3<R>::supporting_line() const
|
|
{
|
|
CGAL_kernel_precondition( !is_degenerate() );
|
|
return Line_3(start(), second_point() );
|
|
}
|
|
|
|
template < class R >
|
|
CGAL_KERNEL_INLINE
|
|
RayH3<R>
|
|
RayH3<R>::opposite() const
|
|
{ return RayH3<R>( start(), - direction() ); }
|
|
|
|
|
|
template < class R >
|
|
CGAL_KERNEL_INLINE
|
|
bool
|
|
RayH3<R>::has_on(const typename RayH3<R>::Point_3 &p) const
|
|
{
|
|
return ( ( p == start() )
|
|
||( Direction_3(p - start()) == direction() ) );
|
|
}
|
|
|
|
template < class R >
|
|
inline /* XXX */
|
|
bool
|
|
RayH3<R>::collinear_has_on(const typename RayH3<R>::Point_3 &p) const
|
|
{ return has_on(p); }
|
|
|
|
template < class R >
|
|
inline
|
|
bool
|
|
RayH3<R>::is_degenerate() const
|
|
{ return to_vector() == NULL_VECTOR; }
|
|
|
|
template < class R >
|
|
CGAL_KERNEL_INLINE
|
|
bool
|
|
RayH3<R>::operator==(const RayH3<R>& r) const
|
|
{ return ( (start() == r.start() )&&( direction() == r.direction() ) ); }
|
|
|
|
template < class R >
|
|
CGAL_KERNEL_INLINE
|
|
bool
|
|
RayH3<R>::operator!=( const RayH3<R>& r) const
|
|
{ return !operator==(r); }
|
|
|
|
} //namespace CGAL
|
|
|
|
#endif // CGAL_RAYH3_H
|