// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
// SPDX-License-Identifier: MPL-2.0

#ifndef EIGEN_ANGLEAXIS_H
#define EIGEN_ANGLEAXIS_H

// IWYU pragma: private
#include "./InternalHeaderCheck.h"

namespace Eigen {

/** \geometry_module \ingroup Geometry_Module
 *
 * \class AngleAxis
 *
 * \brief Represents a 3D rotation as a rotation angle around an arbitrary 3D axis
 *
 * \param Scalar_ the scalar type, i.e., the type of the coefficients.
 *
 * \warning When setting up an AngleAxis object, the axis vector \b must \b be \b normalized.
 *
 * The following two typedefs are provided for convenience:
 * \li \c AngleAxisf for \c float
 * \li \c AngleAxisd for \c double
 *
 * Combined with MatrixBase::Unit{X,Y,Z}, AngleAxis can be used to easily
 * mimic Euler-angles. Here is an example:
 * \include AngleAxis_mimic_euler.cpp
 * Output: \verbinclude AngleAxis_mimic_euler.out
 *
 * \note This class is not aimed to be used to store a rotation transformation,
 * but rather to make easier the creation of other rotation (Quaternion, rotation Matrix)
 * and transformation objects.
 *
 * \sa class Quaternion, class Transform, MatrixBase::UnitX()
 */

namespace internal {
template <typename Scalar_>
struct traits<AngleAxis<Scalar_> > {
  using Scalar = Scalar_;
};
}  // namespace internal

template <typename Scalar_>
class AngleAxis : public RotationBase<AngleAxis<Scalar_>, 3> {
  using Base = RotationBase<AngleAxis<Scalar_>, 3>;

 public:
  using Base::operator*;

  enum { Dim = 3 };
  /** the scalar type of the coefficients */
  using Scalar = Scalar_;
  using Matrix3 = Matrix<Scalar, 3, 3>;
  using Vector3 = Matrix<Scalar, 3, 1>;
  using QuaternionType = Quaternion<Scalar>;

 protected:
  Vector3 m_axis;
  Scalar m_angle;

 public:
  /** Default constructor without initialization. */
  EIGEN_DEVICE_FUNC AngleAxis() {}
  /** Constructs and initialize the angle-axis rotation from an \a angle in radian
   * and an \a axis which \b must \b be \b normalized.
   *
   * \warning If the \a axis vector is not normalized, then the angle-axis object
   *          represents an invalid rotation. */
  template <typename Derived>
  EIGEN_DEVICE_FUNC inline AngleAxis(const Scalar& angle, const MatrixBase<Derived>& axis)
      : m_axis(axis), m_angle(angle) {}
  /** Constructs and initialize the angle-axis rotation from a quaternion \a q.
   * This function implicitly normalizes the quaternion \a q.
   */
  template <typename QuatDerived>
  EIGEN_DEVICE_FUNC inline explicit AngleAxis(const QuaternionBase<QuatDerived>& q) {
    *this = q;
  }
  /** Constructs and initialize the angle-axis rotation from a 3x3 rotation matrix. */
  template <typename Derived>
  EIGEN_DEVICE_FUNC inline explicit AngleAxis(const MatrixBase<Derived>& m) {
    *this = m;
  }

  /** \returns the value of the rotation angle in radian */
  EIGEN_DEVICE_FUNC Scalar angle() const { return m_angle; }
  /** \returns a read-write reference to the stored angle in radian */
  EIGEN_DEVICE_FUNC Scalar& angle() { return m_angle; }

  /** \returns the rotation axis */
  EIGEN_DEVICE_FUNC const Vector3& axis() const { return m_axis; }
  /** \returns a read-write reference to the stored rotation axis.
   *
   * \warning The rotation axis must remain a \b unit vector.
   */
  EIGEN_DEVICE_FUNC Vector3& axis() { return m_axis; }

  /** Concatenates two rotations */
  EIGEN_DEVICE_FUNC inline QuaternionType operator*(const AngleAxis& other) const {
    return QuaternionType(*this) * QuaternionType(other);
  }

  /** Concatenates two rotations */
  EIGEN_DEVICE_FUNC inline QuaternionType operator*(const QuaternionType& other) const {
    return QuaternionType(*this) * other;
  }

  /** Concatenates two rotations */
  friend EIGEN_DEVICE_FUNC inline QuaternionType operator*(const QuaternionType& a, const AngleAxis& b) {
    return a * QuaternionType(b);
  }

  /** \returns the inverse rotation, i.e., an angle-axis with opposite rotation angle */
  EIGEN_DEVICE_FUNC AngleAxis inverse() const { return AngleAxis(-m_angle, m_axis); }

  template <class QuatDerived>
  EIGEN_DEVICE_FUNC AngleAxis& operator=(const QuaternionBase<QuatDerived>& q);
  template <typename Derived>
  EIGEN_DEVICE_FUNC AngleAxis& operator=(const MatrixBase<Derived>& m);

  template <typename Derived>
  EIGEN_DEVICE_FUNC AngleAxis& fromRotationMatrix(const MatrixBase<Derived>& m);
  EIGEN_DEVICE_FUNC Matrix3 toRotationMatrix(void) const;

  /** Applies the rotation to a 3D vector using Rodrigues' formula directly,
   * without constructing the full rotation matrix. */
  template <typename OtherVectorType>
  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Vector3 _transformVector(const OtherVectorType& v) const {
    EIGEN_USING_STD(sin)
    EIGEN_USING_STD(cos)
    EIGEN_INTERNAL_ASSERT_SAME_SIZE(v, m_axis);

    // Rodrigues' rotation formula: v' = v*cos(θ) + (k×v)*sin(θ) + k*(k·v)*(1-cos(θ))
    const Vector3 v3(v);
    const Scalar c = cos(m_angle);
    const Scalar s = sin(m_angle);
    return v3 * c + m_axis.cross(v3) * s + m_axis * (m_axis.dot(v3) * (Scalar(1) - c));
  }

  /** \returns \c *this with scalar type casted to \a NewScalarType
   *
   * Note that if \a NewScalarType is equal to the current scalar type of \c *this
   * then this function smartly returns a const reference to \c *this.
   */
  template <typename NewScalarType>
  EIGEN_DEVICE_FUNC inline typename internal::cast_return_type<AngleAxis, AngleAxis<NewScalarType> >::type cast()
      const {
    return typename internal::cast_return_type<AngleAxis, AngleAxis<NewScalarType> >::type(*this);
  }

  /** Copy constructor with scalar type conversion */
  template <typename OtherScalarType>
  EIGEN_DEVICE_FUNC inline explicit AngleAxis(const AngleAxis<OtherScalarType>& other) {
    m_axis = other.axis().template cast<Scalar>();
    m_angle = Scalar(other.angle());
  }

  EIGEN_DEVICE_FUNC static inline const AngleAxis Identity() { return AngleAxis(Scalar(0), Vector3::UnitX()); }

  /** \returns \c true if \c *this is approximately equal to \a other, within the precision
   * determined by \a prec.
   *
   * \sa MatrixBase::isApprox() */
  EIGEN_DEVICE_FUNC bool isApprox(const AngleAxis& other, const typename NumTraits<Scalar>::Real& prec =
                                                              NumTraits<Scalar>::dummy_precision()) const {
    return m_axis.isApprox(other.m_axis, prec) && internal::isApprox(m_angle, other.m_angle, prec);
  }
};

/** \ingroup Geometry_Module
 * single precision angle-axis type */
using AngleAxisf = AngleAxis<float>;
/** \ingroup Geometry_Module
 * double precision angle-axis type */
using AngleAxisd = AngleAxis<double>;

/** Set \c *this from a \b unit quaternion.
 *
 * The resulting axis is normalized, and the computed angle is in the [0,pi] range.
 *
 * This function implicitly normalizes the quaternion \a q.
 */
template <typename Scalar>
template <typename QuatDerived>
EIGEN_DEVICE_FUNC AngleAxis<Scalar>& AngleAxis<Scalar>::operator=(const QuaternionBase<QuatDerived>& q) {
  EIGEN_USING_STD(atan2)
  EIGEN_USING_STD(abs)
  Scalar n = q.vec().norm();
  if (n < NumTraits<Scalar>::epsilon()) n = q.vec().stableNorm();

  if (n != Scalar(0)) {
    m_angle = Scalar(2) * atan2(n, abs(q.w()));
    if (q.w() < Scalar(0)) n = -n;
    m_axis = q.vec() / n;
  } else {
    m_angle = Scalar(0);
    m_axis << Scalar(1), Scalar(0), Scalar(0);
  }
  return *this;
}

/** Set \c *this from a 3x3 rotation matrix \a mat.
 */
template <typename Scalar>
template <typename Derived>
EIGEN_DEVICE_FUNC AngleAxis<Scalar>& AngleAxis<Scalar>::operator=(const MatrixBase<Derived>& mat) {
  // A 4D vector holds quaternion coefficients; anything else is a 3x3 rotation matrix.
  if (mat.size() == 4) {
    return *this = QuaternionType(mat);
  }
  return fromRotationMatrix(mat);
}

/**
 * \brief Sets \c *this from a 3x3 rotation matrix.
 *
 * The resulting axis is normalized, and the computed angle is in the [0,pi] range.
 **/
template <typename Scalar>
template <typename Derived>
EIGEN_DEVICE_FUNC AngleAxis<Scalar>& AngleAxis<Scalar>::fromRotationMatrix(const MatrixBase<Derived>& mat) {
  EIGEN_STATIC_ASSERT(
      (std::is_same<Scalar, typename Derived::Scalar>::value),
      YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
  // operator= also instantiates this path for quaternion coefficients in C++14.
  // TODO(C++17): use fixed-size if constexpr dispatch in operator= before adding a static 3-by-3 check here.
  EIGEN_INTERNAL_SHAPE_ASSERT((internal::fixed_dimensions<Derived, 3, 3>::Proven), mat.cols() == 3 && mat.rows() == 3);

  // Compute a (non-unit) quaternion proportional to the rotation using
  // Shoemake's algorithm (shared with Quaternion::operator=(MatrixBase)),
  // skipping the intermediate normalization since AngleAxis::operator=(QuaternionBase)
  // normalizes the axis and uses atan2(|v|, |w|).
  QuaternionType q;
  internal::quaternionbase_assign_impl<Derived, 3, 3>::template run<false>(q, mat.derived());
  return *this = q;
}

/** Constructs and \returns an equivalent 3x3 rotation matrix.
 */
template <typename Scalar>
typename AngleAxis<Scalar>::Matrix3 EIGEN_DEVICE_FUNC AngleAxis<Scalar>::toRotationMatrix(void) const {
  EIGEN_USING_STD(sin)
  EIGEN_USING_STD(cos)
  Matrix3 res;
  Vector3 sin_axis = sin(m_angle) * m_axis;
  Scalar c = cos(m_angle);
  Vector3 cos1_axis = (Scalar(1) - c) * m_axis;

  Scalar tmp;
  tmp = cos1_axis.x() * m_axis.y();
  res.coeffRef(0, 1) = tmp - sin_axis.z();
  res.coeffRef(1, 0) = tmp + sin_axis.z();

  tmp = cos1_axis.x() * m_axis.z();
  res.coeffRef(0, 2) = tmp + sin_axis.y();
  res.coeffRef(2, 0) = tmp - sin_axis.y();

  tmp = cos1_axis.y() * m_axis.z();
  res.coeffRef(1, 2) = tmp - sin_axis.x();
  res.coeffRef(2, 1) = tmp + sin_axis.x();

  res.diagonal() = cos1_axis.cwiseProduct(m_axis).array() + c;

  return res;
}

}  // end namespace Eigen

#endif  // EIGEN_ANGLEAXIS_H
