xref: /aosp_15_r20/external/eigen/unsupported/Eigen/AlignedVector3 (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
1*bf2c3715SXin Li// This file is part of Eigen, a lightweight C++ template library
2*bf2c3715SXin Li// for linear algebra.
3*bf2c3715SXin Li//
4*bf2c3715SXin Li// Copyright (C) 2009 Gael Guennebaud <[email protected]>
5*bf2c3715SXin Li//
6*bf2c3715SXin Li// This Source Code Form is subject to the terms of the Mozilla
7*bf2c3715SXin Li// Public License v. 2.0. If a copy of the MPL was not distributed
8*bf2c3715SXin Li// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9*bf2c3715SXin Li
10*bf2c3715SXin Li#ifndef EIGEN_ALIGNED_VECTOR3
11*bf2c3715SXin Li#define EIGEN_ALIGNED_VECTOR3
12*bf2c3715SXin Li
13*bf2c3715SXin Li#include "../../Eigen/Geometry"
14*bf2c3715SXin Li
15*bf2c3715SXin Li#include "../../Eigen/src/Core/util/DisableStupidWarnings.h"
16*bf2c3715SXin Li
17*bf2c3715SXin Linamespace Eigen {
18*bf2c3715SXin Li
19*bf2c3715SXin Li/**
20*bf2c3715SXin Li  * \defgroup AlignedVector3_Module Aligned vector3 module
21*bf2c3715SXin Li  *
22*bf2c3715SXin Li  * \code
23*bf2c3715SXin Li  * #include <unsupported/Eigen/AlignedVector3>
24*bf2c3715SXin Li  * \endcode
25*bf2c3715SXin Li  */
26*bf2c3715SXin Li  //@{
27*bf2c3715SXin Li
28*bf2c3715SXin Li
29*bf2c3715SXin Li/** \class AlignedVector3
30*bf2c3715SXin Li  *
31*bf2c3715SXin Li  * \brief A vectorization friendly 3D vector
32*bf2c3715SXin Li  *
33*bf2c3715SXin Li  * This class represents a 3D vector internally using a 4D vector
34*bf2c3715SXin Li  * such that vectorization can be seamlessly enabled. Of course,
35*bf2c3715SXin Li  * the same result can be achieved by directly using a 4D vector.
36*bf2c3715SXin Li  * This class makes this process simpler.
37*bf2c3715SXin Li  *
38*bf2c3715SXin Li  */
39*bf2c3715SXin Li// TODO specialize Cwise
40*bf2c3715SXin Litemplate<typename _Scalar> class AlignedVector3;
41*bf2c3715SXin Li
42*bf2c3715SXin Linamespace internal {
43*bf2c3715SXin Litemplate<typename _Scalar> struct traits<AlignedVector3<_Scalar> >
44*bf2c3715SXin Li  : traits<Matrix<_Scalar,3,1,0,4,1> >
45*bf2c3715SXin Li{
46*bf2c3715SXin Li};
47*bf2c3715SXin Li}
48*bf2c3715SXin Li
49*bf2c3715SXin Litemplate<typename _Scalar> class AlignedVector3
50*bf2c3715SXin Li  : public MatrixBase<AlignedVector3<_Scalar> >
51*bf2c3715SXin Li{
52*bf2c3715SXin Li    typedef Matrix<_Scalar,4,1> CoeffType;
53*bf2c3715SXin Li    CoeffType m_coeffs;
54*bf2c3715SXin Li  public:
55*bf2c3715SXin Li
56*bf2c3715SXin Li    typedef MatrixBase<AlignedVector3<_Scalar> > Base;
57*bf2c3715SXin Li    EIGEN_DENSE_PUBLIC_INTERFACE(AlignedVector3)
58*bf2c3715SXin Li    using Base::operator*;
59*bf2c3715SXin Li
60*bf2c3715SXin Li    inline Index rows() const { return 3; }
61*bf2c3715SXin Li    inline Index cols() const { return 1; }
62*bf2c3715SXin Li
63*bf2c3715SXin Li    Scalar* data() { return m_coeffs.data(); }
64*bf2c3715SXin Li    const Scalar* data() const { return m_coeffs.data(); }
65*bf2c3715SXin Li    Index innerStride() const { return 1; }
66*bf2c3715SXin Li    Index outerStride() const { return 3; }
67*bf2c3715SXin Li
68*bf2c3715SXin Li    inline const Scalar& coeff(Index row, Index col) const
69*bf2c3715SXin Li    { return m_coeffs.coeff(row, col); }
70*bf2c3715SXin Li
71*bf2c3715SXin Li    inline Scalar& coeffRef(Index row, Index col)
72*bf2c3715SXin Li    { return m_coeffs.coeffRef(row, col); }
73*bf2c3715SXin Li
74*bf2c3715SXin Li    inline const Scalar& coeff(Index index) const
75*bf2c3715SXin Li    { return m_coeffs.coeff(index); }
76*bf2c3715SXin Li
77*bf2c3715SXin Li    inline Scalar& coeffRef(Index index)
78*bf2c3715SXin Li    { return m_coeffs.coeffRef(index);}
79*bf2c3715SXin Li
80*bf2c3715SXin Li
81*bf2c3715SXin Li    inline AlignedVector3()
82*bf2c3715SXin Li    {}
83*bf2c3715SXin Li
84*bf2c3715SXin Li    inline AlignedVector3(const Scalar& x, const Scalar& y, const Scalar& z)
85*bf2c3715SXin Li      : m_coeffs(x, y, z, Scalar(0))
86*bf2c3715SXin Li    {}
87*bf2c3715SXin Li
88*bf2c3715SXin Li    inline AlignedVector3(const AlignedVector3& other)
89*bf2c3715SXin Li      : Base(), m_coeffs(other.m_coeffs)
90*bf2c3715SXin Li    {}
91*bf2c3715SXin Li
92*bf2c3715SXin Li    template<typename XprType, int Size=XprType::SizeAtCompileTime>
93*bf2c3715SXin Li    struct generic_assign_selector {};
94*bf2c3715SXin Li
95*bf2c3715SXin Li    template<typename XprType> struct generic_assign_selector<XprType,4>
96*bf2c3715SXin Li    {
97*bf2c3715SXin Li      inline static void run(AlignedVector3& dest, const XprType& src)
98*bf2c3715SXin Li      {
99*bf2c3715SXin Li        dest.m_coeffs = src;
100*bf2c3715SXin Li      }
101*bf2c3715SXin Li    };
102*bf2c3715SXin Li
103*bf2c3715SXin Li    template<typename XprType> struct generic_assign_selector<XprType,3>
104*bf2c3715SXin Li    {
105*bf2c3715SXin Li      inline static void run(AlignedVector3& dest, const XprType& src)
106*bf2c3715SXin Li      {
107*bf2c3715SXin Li        dest.m_coeffs.template head<3>() = src;
108*bf2c3715SXin Li        dest.m_coeffs.w() = Scalar(0);
109*bf2c3715SXin Li      }
110*bf2c3715SXin Li    };
111*bf2c3715SXin Li
112*bf2c3715SXin Li    template<typename Derived>
113*bf2c3715SXin Li    inline AlignedVector3(const MatrixBase<Derived>& other)
114*bf2c3715SXin Li    {
115*bf2c3715SXin Li      generic_assign_selector<Derived>::run(*this,other.derived());
116*bf2c3715SXin Li    }
117*bf2c3715SXin Li
118*bf2c3715SXin Li    inline AlignedVector3& operator=(const AlignedVector3& other)
119*bf2c3715SXin Li    { m_coeffs = other.m_coeffs; return *this; }
120*bf2c3715SXin Li
121*bf2c3715SXin Li    template <typename Derived>
122*bf2c3715SXin Li    inline AlignedVector3& operator=(const MatrixBase<Derived>& other)
123*bf2c3715SXin Li    {
124*bf2c3715SXin Li      generic_assign_selector<Derived>::run(*this,other.derived());
125*bf2c3715SXin Li      return *this;
126*bf2c3715SXin Li    }
127*bf2c3715SXin Li
128*bf2c3715SXin Li    inline AlignedVector3 operator+(const AlignedVector3& other) const
129*bf2c3715SXin Li    { return AlignedVector3(m_coeffs + other.m_coeffs); }
130*bf2c3715SXin Li
131*bf2c3715SXin Li    inline AlignedVector3& operator+=(const AlignedVector3& other)
132*bf2c3715SXin Li    { m_coeffs += other.m_coeffs; return *this; }
133*bf2c3715SXin Li
134*bf2c3715SXin Li    inline AlignedVector3 operator-(const AlignedVector3& other) const
135*bf2c3715SXin Li    { return AlignedVector3(m_coeffs - other.m_coeffs); }
136*bf2c3715SXin Li
137*bf2c3715SXin Li    inline AlignedVector3 operator-() const
138*bf2c3715SXin Li    { return AlignedVector3(-m_coeffs); }
139*bf2c3715SXin Li
140*bf2c3715SXin Li    inline AlignedVector3 operator-=(const AlignedVector3& other)
141*bf2c3715SXin Li    { m_coeffs -= other.m_coeffs; return *this; }
142*bf2c3715SXin Li
143*bf2c3715SXin Li    inline AlignedVector3 operator*(const Scalar& s) const
144*bf2c3715SXin Li    { return AlignedVector3(m_coeffs * s); }
145*bf2c3715SXin Li
146*bf2c3715SXin Li    inline friend AlignedVector3 operator*(const Scalar& s,const AlignedVector3& vec)
147*bf2c3715SXin Li    { return AlignedVector3(s * vec.m_coeffs); }
148*bf2c3715SXin Li
149*bf2c3715SXin Li    inline AlignedVector3& operator*=(const Scalar& s)
150*bf2c3715SXin Li    { m_coeffs *= s; return *this; }
151*bf2c3715SXin Li
152*bf2c3715SXin Li    inline AlignedVector3 operator/(const Scalar& s) const
153*bf2c3715SXin Li    { return AlignedVector3(m_coeffs / s); }
154*bf2c3715SXin Li
155*bf2c3715SXin Li    inline AlignedVector3& operator/=(const Scalar& s)
156*bf2c3715SXin Li    { m_coeffs /= s; return *this; }
157*bf2c3715SXin Li
158*bf2c3715SXin Li    inline Scalar dot(const AlignedVector3& other) const
159*bf2c3715SXin Li    {
160*bf2c3715SXin Li      eigen_assert(m_coeffs.w()==Scalar(0));
161*bf2c3715SXin Li      eigen_assert(other.m_coeffs.w()==Scalar(0));
162*bf2c3715SXin Li      return m_coeffs.dot(other.m_coeffs);
163*bf2c3715SXin Li    }
164*bf2c3715SXin Li
165*bf2c3715SXin Li    inline void normalize()
166*bf2c3715SXin Li    {
167*bf2c3715SXin Li      m_coeffs /= norm();
168*bf2c3715SXin Li    }
169*bf2c3715SXin Li
170*bf2c3715SXin Li    inline AlignedVector3 normalized() const
171*bf2c3715SXin Li    {
172*bf2c3715SXin Li      return AlignedVector3(m_coeffs / norm());
173*bf2c3715SXin Li    }
174*bf2c3715SXin Li
175*bf2c3715SXin Li    inline Scalar sum() const
176*bf2c3715SXin Li    {
177*bf2c3715SXin Li      eigen_assert(m_coeffs.w()==Scalar(0));
178*bf2c3715SXin Li      return m_coeffs.sum();
179*bf2c3715SXin Li    }
180*bf2c3715SXin Li
181*bf2c3715SXin Li    inline Scalar squaredNorm() const
182*bf2c3715SXin Li    {
183*bf2c3715SXin Li      eigen_assert(m_coeffs.w()==Scalar(0));
184*bf2c3715SXin Li      return m_coeffs.squaredNorm();
185*bf2c3715SXin Li    }
186*bf2c3715SXin Li
187*bf2c3715SXin Li    inline Scalar norm() const
188*bf2c3715SXin Li    {
189*bf2c3715SXin Li      using std::sqrt;
190*bf2c3715SXin Li      return sqrt(squaredNorm());
191*bf2c3715SXin Li    }
192*bf2c3715SXin Li
193*bf2c3715SXin Li    inline AlignedVector3 cross(const AlignedVector3& other) const
194*bf2c3715SXin Li    {
195*bf2c3715SXin Li      return AlignedVector3(m_coeffs.cross3(other.m_coeffs));
196*bf2c3715SXin Li    }
197*bf2c3715SXin Li
198*bf2c3715SXin Li    template<typename Derived>
199*bf2c3715SXin Li    inline bool isApprox(const MatrixBase<Derived>& other, const RealScalar& eps=NumTraits<Scalar>::dummy_precision()) const
200*bf2c3715SXin Li    {
201*bf2c3715SXin Li      return m_coeffs.template head<3>().isApprox(other,eps);
202*bf2c3715SXin Li    }
203*bf2c3715SXin Li
204*bf2c3715SXin Li    CoeffType& coeffs() { return m_coeffs; }
205*bf2c3715SXin Li    const CoeffType& coeffs() const { return m_coeffs; }
206*bf2c3715SXin Li};
207*bf2c3715SXin Li
208*bf2c3715SXin Linamespace internal {
209*bf2c3715SXin Li
210*bf2c3715SXin Litemplate<typename _Scalar>
211*bf2c3715SXin Listruct eval<AlignedVector3<_Scalar>, Dense>
212*bf2c3715SXin Li{
213*bf2c3715SXin Li typedef const AlignedVector3<_Scalar>& type;
214*bf2c3715SXin Li};
215*bf2c3715SXin Li
216*bf2c3715SXin Litemplate<typename Scalar>
217*bf2c3715SXin Listruct evaluator<AlignedVector3<Scalar> >
218*bf2c3715SXin Li  : evaluator<Matrix<Scalar,4,1> >
219*bf2c3715SXin Li{
220*bf2c3715SXin Li  typedef AlignedVector3<Scalar> XprType;
221*bf2c3715SXin Li  typedef evaluator<Matrix<Scalar,4,1> > Base;
222*bf2c3715SXin Li
223*bf2c3715SXin Li  evaluator(const XprType &m) : Base(m.coeffs()) {}
224*bf2c3715SXin Li};
225*bf2c3715SXin Li
226*bf2c3715SXin Li}
227*bf2c3715SXin Li
228*bf2c3715SXin Li//@}
229*bf2c3715SXin Li
230*bf2c3715SXin Li}
231*bf2c3715SXin Li
232*bf2c3715SXin Li#include "../../Eigen/src/Core/util/ReenableStupidWarnings.h"
233*bf2c3715SXin Li
234*bf2c3715SXin Li#endif // EIGEN_ALIGNED_VECTOR3
235