Program Listing for File sbg_matrix3.h

Return to documentation for file (include/sbg_driver/sbg_matrix3.h)

#ifndef SBG_MATRIX_3_H
#define SBG_MATRIX_3_H

// Sbg headers
#include <sbgDefines.h>
#include "sbg_vector3.h"

namespace sbg
{

template <class T>
class SbgMatrix3
{
private:

  //---------------------------------------------------------------------//
  //- Private variables                                                 -//
  //---------------------------------------------------------------------//

  std::array<T, 9> data_;

public:

  //---------------------------------------------------------------------//
  //- Constructor                                                       -//
  //---------------------------------------------------------------------//

  SbgMatrix3()
  {
    data_[0] = static_cast<T>(0.0);
    data_[1] = static_cast<T>(0.0);
    data_[2] = static_cast<T>(0.0);
    data_[3] = static_cast<T>(0.0);
    data_[4] = static_cast<T>(0.0);
    data_[5] = static_cast<T>(0.0);
    data_[6] = static_cast<T>(0.0);
    data_[7] = static_cast<T>(0.0);
    data_[8] = static_cast<T>(0.0);
  }

  SbgMatrix3(T value00, T value01, T value02, T value10, T value11, T value12, T value20, T value21, T value22)
  {
    data_[0] = value00;
    data_[1] = value01;
    data_[2] = value02;
    data_[3] = value10;
    data_[4] = value11;
    data_[5] = value12;
    data_[6] = value20;
    data_[7] = value21;
    data_[8] = value22;
  };

  SbgMatrix3(const T* p_raw_data, size_t array_size)
  {
    assert(array_size == 9);

    data_[0] = p_raw_data[0];
    data_[1] = p_raw_data[1];
    data_[2] = p_raw_data[2];
    data_[3] = p_raw_data[3];
    data_[4] = p_raw_data[4];
    data_[5] = p_raw_data[5];
    data_[6] = p_raw_data[6];
    data_[7] = p_raw_data[7];
    data_[8] = p_raw_data[8];
  };

  //---------------------------------------------------------------------//
  //- Parameters                                                        -//
  //---------------------------------------------------------------------//

  //---------------------------------------------------------------------//
  //- Operations                                                        -//
  //---------------------------------------------------------------------//

  const T operator() (int i, int j) const
  {
    assert(i * 3 + j < 9);

    return data_[i * 3 + j];
  }

  const T *data() const
  {
    return static_cast<const T*>(data_.data());
  };

  const SbgVector3<T> operator*(const SbgVector3<T>& vect) const
  {
    T x = data_[0] * vect(0) + data_[1] * vect(1) + data_[2] * vect(2);
    T y = data_[3] * vect(0) + data_[4] * vect(1) + data_[5] * vect(2);
    T z = data_[6] * vect(0) + data_[7] * vect(1) + data_[8] * vect(2);

    return SbgVector3<T>(x, y, z);
  }

  void transpose()
  {
    T swap = data_[1];
    data_[1] = data_[3];
    data_[3] = swap;

    swap = data_[2];
    data_[2] = data_[6];
    data_[6] = swap;

    swap = data_[5];
    data_[5] = data_[7];
    data_[7] = swap;
  }

  void makeDcm(const SbgVector3f& euler)
  {
    float cr = cosf(euler(0));
    float sr = sinf(euler(0));
    float cp = cosf(euler(1));
    float sp = sinf(euler(1));
    float cy = cosf(euler(2));
    float sy = sinf(euler(2));

    data_[0] = cp * cy;
    data_[3] = cp * sy;
    data_[6] = -sp;

    data_[1] = (sr * sp * cy) - (cr * sy);
    data_[4] = (sr * sp * sy) + (cr * cy);
    data_[7] = sr * cp;

    data_[2] = (cr * sp * cy) + (sy * sr);
    data_[5] = (cr * sp * sy) - (sr * cy);
    data_[8] = cr * cp;

  }

  void makeDcm(float w, float x, float y, float z)
  {
    float wx = w * x;
    float wy = w * y;
    float wz = w * z;
    float xy = x * y;
    float xz = x * z;
    float yz = y * z;

    data_[0] = (2 * powf(w, 2)) + (2 * powf(x, 2)) - 1;
    data_[3] = (2 * xy) + (2 * wz);
    data_[6] = (2 * xz) - (2 * wy);

    data_[1] = (2 * xy) - (2 * wz);
    data_[4] = (2 * powf(w, 2)) + (2 * powf(y, 2)) - 1;
    data_[7] = (2 * yz) + (2 * wx);

    data_[2] = (2 * wy) + (2 * xz);
    data_[5] = (2 * yz) - (2 * wx);
    data_[8] = (2 * powf(w, 2)) + (2 * powf(z, 2)) - 1;
  }

};


typedef SbgMatrix3<float>  SbgMatrix3f;
typedef SbgMatrix3<double> SbgMatrix3d;

}

#endif // SBG_MATRIX_3_H