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