vcglib/vcg/math/matrix.h

185 lines
5.4 KiB
C++
Raw Blame History

/****************************************************************************
* VCGLib o o *
* Visual and Computer Graphics Library o o *
* _ O _ *
* Copyright(C) 2004 \/)\/ *
* Visual Computing Lab /\/| *
* ISTI - Italian National Research Council | *
* \ *
* All rights reserved. *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) *
* for more details. *
* *
****************************************************************************/
#ifndef VCG_USE_EIGEN
#include "deprecated_matrix.h"
#else
#ifndef MATRIX_VCGLIB
#define MATRIX_VCGLIB
#include "eigen.h"
#include <vcg/space/point.h>
namespace vcg{
namespace ndim{
template<class Scalar> class Matrix;
}
}
namespace Eigen{
template<typename Scalar>
struct ei_traits<vcg::ndim::Matrix<Scalar> > : ei_traits<Eigen::Matrix<Scalar,Dynamic,Dynamic> > {};
template<typename XprType> struct ei_to_vcgtype<XprType,Dynamic,Dynamic,RowMajor,Dynamic,Dynamic>
{ typedef vcg::ndim::Matrix<typename XprType::Scalar> type; };
}
namespace vcg{
namespace ndim{
/** \addtogroup math */
/* @{ */
/*!
* \deprecated use Matrix<Scalar,Rows,Cols> or Matrix<Scalar,Dynamic,Dynamic> or any typedef
* This class represent a generic <I>m</I><3E><I>n</I> matrix. The class is templated over the scalar type field.
* @param Scalar (Templete Parameter) Specifies the ScalarType field.
*/
template<class _Scalar>
class Matrix : public Eigen::Matrix<_Scalar,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor> // FIXME col or row major ?
{
typedef Eigen::Matrix<_Scalar,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor> _Base;
public:
_EIGEN_GENERIC_PUBLIC_INTERFACE(Matrix,_Base);
typedef _Scalar ScalarType;
VCG_EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Matrix)
/*!
* Default constructor
* All the elements are initialized to zero.
* \param m the number of matrix rows
* \param n the number of matrix columns
*/
Matrix(int m, int n)
: Base(m,n)
{
memset(Base::data(), 0, m*n*sizeof(Scalar));
}
/*!
* Constructor
* The matrix elements are initialized with the values of the elements in \i values.
* \param m the number of matrix rows
* \param n the number of matrix columns
* \param values the values of the matrix elements
*/
Matrix(int m, int n, Scalar *values)
: Base(m,n)
{
*this = Eigen::Map<Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor> >(values, m , n);
}
/*!
* Empty constructor
* Just create the object
*/
Matrix() : Base() {}
/*!
* Copy constructor
* The matrix elements are initialized with the value of the corresponding element in \i m
* \param m the matrix to be copied
*/
Matrix(const Matrix<Scalar> &m) : Base(m) {}
template<typename OtherDerived>
Matrix(const Eigen::MatrixBase<OtherDerived> &m) : Base(m) {}
/*!
* Default destructor
*/
~Matrix() {}
/*!
* \deprecated use *this.row(i)
* Subscript operator:
* \param i the index of the row
* \return a reference to the <I>i</I>-th matrix row
*/
inline typename Base::RowXpr operator[](const unsigned int i)
{ return Base::row(i); }
/*!
* \deprecated use *this.row(i)
* Const subscript operator
* \param i the index of the row
* \return a reference to the <I>i</I>-th matrix row
*/
inline const typename Base::RowXpr operator[](const unsigned int i) const
{ return Base::row(i); }
/*!
* Matrix multiplication: calculates the cross product.
* \param reference to the matrix to multiply by
* \return the matrix product
*/
// FIXME what the hell is that !
/*template <int N,int M>
void DotProduct(Point<N,Scalar> &m,Point<M,Scalar> &result)
{
unsigned int i, j, p, r;
for (i=0, p=0, r=0; i<M; i++)
{ result[i]=0;
for (j=0; j<N; j++)
result[i]+=(*this)[i][j]*m[j];
}
};*/
/*!
* \deprecated use *this.resize(); *this.setZero();
* Resize the current matrix.
* \param m the number of matrix rows.
* \param n the number of matrix columns.
*/
void Resize(const unsigned int m, const unsigned int n)
{
assert(m>=2);
assert(n>=2);
Base::resize(m,n);
memset(Base::data(), 0, m*n*sizeof(Scalar));
};
};
typedef vcg::ndim::Matrix<double> MatrixMNd;
typedef vcg::ndim::Matrix<float> MatrixMNf;
/*! @} */
template <class MatrixType>
void Invert(MatrixType & m)
{
m = m.inverse();
}
}
} // end of namespace
#endif
#endif