1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_PARAMETRIZEDLINE_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_PARAMETRIZEDLINE_H
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \geometry_module \ingroup Geometry_Module
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \class ParametrizedLine
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \brief A parametrized line
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * A parametrized line is defined by an origin point \f$ \mathbf{o} \f$ and a unit
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * direction vector \f$ \mathbf{d} \f$ such that the line corresponds to
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * the set \f$ l(t) = \mathbf{o} + t \mathbf{d} \f$, \f$ t \in \mathbf{R} \f$.
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \tparam _Scalar the scalar type, i.e., the type of the coefficients
272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \tparam _AmbientDim the dimension of the ambient space, can be a compile time value or Dynamic.
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename _Scalar, int _AmbientDim, int _Options>
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass ParametrizedLine
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathpublic:
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim)
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  enum {
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    AmbientDimAtCompileTime = _AmbientDim,
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Options = _Options
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  };
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef _Scalar Scalar;
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename NumTraits<Scalar>::Real RealScalar;
402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<Scalar,AmbientDimAtCompileTime,1,Options> VectorType;
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  /** Default constructor without initialization */
442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC inline ParametrizedLine() {}
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  template<int OtherOptions>
472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC ParametrizedLine(const ParametrizedLine<Scalar,AmbientDimAtCompileTime,OtherOptions>& other)
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   : m_origin(other.origin()), m_direction(other.direction())
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {}
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  /** Constructs a dynamic-size line with \a _dim the dimension
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    * of the ambient space */
532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC inline explicit ParametrizedLine(Index _dim) : m_origin(_dim), m_direction(_dim) {}
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  /** Initializes a parametrized line of direction \a direction and origin \a origin.
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    * \warning the vector direction is assumed to be normalized.
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    */
582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC ParametrizedLine(const VectorType& origin, const VectorType& direction)
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    : m_origin(origin), m_direction(direction) {}
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  template <int OtherOptions>
622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit ParametrizedLine(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane);
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  /** Constructs a parametrized line going from \a p0 to \a p1. */
652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC static inline ParametrizedLine Through(const VectorType& p0, const VectorType& p1)
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  { return ParametrizedLine(p0, (p1-p0).normalized()); }
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC ~ParametrizedLine() {}
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  /** \returns the dimension in which the line holds */
712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC inline Index dim() const { return m_direction.size(); }
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC const VectorType& origin() const { return m_origin; }
742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC VectorType& origin() { return m_origin; }
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC const VectorType& direction() const { return m_direction; }
772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC VectorType& direction() { return m_direction; }
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  /** \returns the squared distance of a point \a p to its projection onto the line \c *this.
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    * \sa distance()
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    */
822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC RealScalar squaredDistance(const VectorType& p) const
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VectorType diff = p - origin();
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return (diff - direction().dot(diff) * direction()).squaredNorm();
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  /** \returns the distance of a point \a p to its projection onto the line \c *this.
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    * \sa squaredDistance()
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    */
902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC RealScalar distance(const VectorType& p) const { EIGEN_USING_STD_MATH(sqrt) return sqrt(squaredDistance(p)); }
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  /** \returns the projection of a point \a p onto the line \c *this. */
932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC VectorType projection(const VectorType& p) const
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  { return origin() + direction().dot(p-origin()) * direction(); }
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC VectorType pointAt(const Scalar& t) const;
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  template <int OtherOptions>
992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC Scalar intersectionParameter(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane) const;
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  template <int OtherOptions>
1022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC Scalar intersection(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane) const;
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  template <int OtherOptions>
1052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC VectorType intersectionPoint(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane) const;
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  /** \returns \c *this with scalar type casted to \a NewScalarType
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    *
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    * then this function smartly returns a const reference to \c *this.
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    */
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  template<typename NewScalarType>
1132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC inline typename internal::cast_return_type<ParametrizedLine,
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath           ParametrizedLine<NewScalarType,AmbientDimAtCompileTime,Options> >::type cast() const
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return typename internal::cast_return_type<ParametrizedLine,
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    ParametrizedLine<NewScalarType,AmbientDimAtCompileTime,Options> >::type(*this);
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  /** Copy constructor with scalar type conversion */
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  template<typename OtherScalarType,int OtherOptions>
1222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC inline explicit ParametrizedLine(const ParametrizedLine<OtherScalarType,AmbientDimAtCompileTime,OtherOptions>& other)
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    m_origin = other.origin().template cast<Scalar>();
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    m_direction = other.direction().template cast<Scalar>();
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  /** \returns \c true if \c *this is approximately equal to \a other, within the precision
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    * determined by \a prec.
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    *
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    * \sa MatrixBase::isApprox() */
1322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC bool isApprox(const ParametrizedLine& other, const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  { return m_origin.isApprox(other.m_origin, prec) && m_direction.isApprox(other.m_direction, prec); }
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathprotected:
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VectorType m_origin, m_direction;
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** Constructs a parametrized line from a 2D hyperplane
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \warning the ambient space must have dimension 2 such that the hyperplane actually describes a line
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename _Scalar, int _AmbientDim, int _Options>
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <int OtherOptions>
1462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DEVICE_FUNC inline ParametrizedLine<_Scalar, _AmbientDim,_Options>::ParametrizedLine(const Hyperplane<_Scalar, _AmbientDim,OtherOptions>& hyperplane)
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(VectorType, 2)
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  direction() = hyperplane.normal().unitOrthogonal();
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  origin() = -hyperplane.normal()*hyperplane.offset();
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns the point at \a t along this line
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename _Scalar, int _AmbientDim, int _Options>
1562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DEVICE_FUNC inline typename ParametrizedLine<_Scalar, _AmbientDim,_Options>::VectorType
1577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos HernandezParametrizedLine<_Scalar, _AmbientDim,_Options>::pointAt(const _Scalar& t) const
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return origin() + (direction()*t);
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns the parameter value of the intersection between \c *this and the given \a hyperplane
163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename _Scalar, int _AmbientDim, int _Options>
165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <int OtherOptions>
1662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DEVICE_FUNC inline _Scalar ParametrizedLine<_Scalar, _AmbientDim,_Options>::intersectionParameter(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane) const
167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return -(hyperplane.offset()+hyperplane.normal().dot(origin()))
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          / hyperplane.normal().dot(direction());
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \deprecated use intersectionParameter()
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \returns the parameter value of the intersection between \c *this and the given \a hyperplane
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename _Scalar, int _AmbientDim, int _Options>
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <int OtherOptions>
1782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DEVICE_FUNC inline _Scalar ParametrizedLine<_Scalar, _AmbientDim,_Options>::intersection(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane) const
179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return intersectionParameter(hyperplane);
181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns the point of the intersection between \c *this and the given hyperplane
184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename _Scalar, int _AmbientDim, int _Options>
186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <int OtherOptions>
1872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangEIGEN_DEVICE_FUNC inline typename ParametrizedLine<_Scalar, _AmbientDim,_Options>::VectorType
188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathParametrizedLine<_Scalar, _AmbientDim,_Options>::intersectionPoint(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane) const
189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return pointAt(intersectionParameter(hyperplane));
191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_PARAMETRIZEDLINE_H
196