Matrix33: make const the binary operators
This commit is contained in:
parent
4783ac9a62
commit
24ea4251a9
|
|
@ -8,7 +8,7 @@
|
||||||
* \ *
|
* \ *
|
||||||
* All rights reserved. *
|
* All rights reserved. *
|
||||||
* *
|
* *
|
||||||
* This program is free software; you can redistribute it and/or modify *
|
* 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 *
|
* it under the terms of the GNU General Public License as published by *
|
||||||
* the Free Software Foundation; either version 2 of the License, or *
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
* (at your option) any later version. *
|
* (at your option) any later version. *
|
||||||
|
|
@ -103,10 +103,10 @@ namespace vcg {
|
||||||
template <class S>
|
template <class S>
|
||||||
class Matrix33Diag:public Point3<S>{
|
class Matrix33Diag:public Point3<S>{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/** @name Matrix33
|
/** @name Matrix33
|
||||||
Class Matrix33Diag.
|
Class Matrix33Diag.
|
||||||
This is the class for definition of a diagonal matrix 3x3.
|
This is the class for definition of a diagonal matrix 3x3.
|
||||||
@param S (Templete Parameter) Specifies the ScalarType field.
|
@param S (Templete Parameter) Specifies the ScalarType field.
|
||||||
*/
|
*/
|
||||||
Matrix33Diag(const S & p0,const S & p1,const S & p2):Point3<S>(p0,p1,p2){};
|
Matrix33Diag(const S & p0,const S & p1,const S & p2):Point3<S>(p0,p1,p2){};
|
||||||
|
|
@ -116,14 +116,14 @@ public:
|
||||||
template<class S>
|
template<class S>
|
||||||
/** @name Matrix33
|
/** @name Matrix33
|
||||||
Class Matrix33.
|
Class Matrix33.
|
||||||
This is the class for definition of a matrix 3x3.
|
This is the class for definition of a matrix 3x3.
|
||||||
@param S (Templete Parameter) Specifies the ScalarType field.
|
@param S (Templete Parameter) Specifies the ScalarType field.
|
||||||
*/
|
*/
|
||||||
class Matrix33
|
class Matrix33
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef S ScalarType;
|
typedef S ScalarType;
|
||||||
|
|
||||||
/// Default constructor
|
/// Default constructor
|
||||||
inline Matrix33() {}
|
inline Matrix33() {}
|
||||||
|
|
||||||
|
|
@ -172,7 +172,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Operatore di indicizzazione
|
/// Operatore di indicizzazione
|
||||||
inline S * operator [] ( const int i )
|
inline S * operator [] ( const int i )
|
||||||
{
|
{
|
||||||
|
|
@ -183,7 +183,7 @@ public:
|
||||||
{
|
{
|
||||||
return a+i*3;
|
return a+i*3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Modificatore somma per matrici 3x3
|
/// Modificatore somma per matrici 3x3
|
||||||
Matrix33 & operator += ( const Matrix33 &m )
|
Matrix33 & operator += ( const Matrix33 &m )
|
||||||
|
|
@ -209,7 +209,7 @@ public:
|
||||||
a[i] -= m.a[i];
|
a[i] -= m.a[i];
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modificatore somma per matrici 3x3
|
/// Modificatore somma per matrici 3x3
|
||||||
Matrix33 & operator -= ( const Matrix33Diag<S> &p )
|
Matrix33 & operator -= ( const Matrix33Diag<S> &p )
|
||||||
{
|
{
|
||||||
|
|
@ -236,18 +236,18 @@ public:
|
||||||
int i,j;
|
int i,j;
|
||||||
for(i=0;i<3;++i)
|
for(i=0;i<3;++i)
|
||||||
for(j=0;j<3;++j)
|
for(j=0;j<3;++j)
|
||||||
r[i][j] = (*this)[i][0]*t[0][j] + (*this)[i][1]*t[1][j] + (*this)[i][2]*t[2][j];
|
r[i][j] = (*this)[i][0]*t[0][j] + (*this)[i][1]*t[1][j] + (*this)[i][2]*t[2][j];
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modificatore prodotto per matrice
|
/// Modificatore prodotto per matrice
|
||||||
void operator *=( const Matrix33< S> & t )
|
void operator *=( const Matrix33< S> & t )
|
||||||
{
|
{
|
||||||
int i,j;
|
int i,j;
|
||||||
for(i=0;i<3;++i)
|
for(i=0;i<3;++i)
|
||||||
for(j=0;j<3;++j)
|
for(j=0;j<3;++j)
|
||||||
(*this)[i][j] = (*this)[i][0]*t[0][j] + (*this)[i][1]*t[1][j] + (*this)[i][2]*t[2][j];
|
(*this)[i][j] = (*this)[i][0]*t[0][j] + (*this)[i][1]*t[1][j] + (*this)[i][2]*t[2][j];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -259,18 +259,18 @@ public:
|
||||||
int i,j;
|
int i,j;
|
||||||
for(i=0;i<3;++i)
|
for(i=0;i<3;++i)
|
||||||
for(j=0;j<3;++j)
|
for(j=0;j<3;++j)
|
||||||
r[i][j] = (*this)[i][j]*t[j];
|
r[i][j] = (*this)[i][j]*t[j];
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Dot product modifier with a diagonal matrix
|
/// Dot product modifier with a diagonal matrix
|
||||||
void operator *=( const Matrix33Diag< S> & t )
|
void operator *=( const Matrix33Diag< S> & t )
|
||||||
{
|
{
|
||||||
int i,j;
|
int i,j;
|
||||||
for(i=0;i<3;++i)
|
for(i=0;i<3;++i)
|
||||||
for(j=0;j<3;++j)
|
for(j=0;j<3;++j)
|
||||||
(*this)[i][j] = (*this)[i][j]*t[j];
|
(*this)[i][j] = (*this)[i][j]*t[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modificatore prodotto per costante
|
/// Modificatore prodotto per costante
|
||||||
|
|
@ -282,7 +282,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Operatore prodotto per costante
|
/// Operatore prodotto per costante
|
||||||
Matrix33 operator * ( const S t )
|
Matrix33 operator * ( const S t ) const
|
||||||
{
|
{
|
||||||
Matrix33<S> r;
|
Matrix33<S> r;
|
||||||
for(int i=0;i<9;++i)
|
for(int i=0;i<9;++i)
|
||||||
|
|
@ -292,7 +292,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Operatore sottrazione per matrici 3x3
|
/// Operatore sottrazione per matrici 3x3
|
||||||
Matrix33 operator - ( const Matrix33 &m )
|
Matrix33 operator - ( const Matrix33 &m ) const
|
||||||
{
|
{
|
||||||
Matrix33<S> r;
|
Matrix33<S> r;
|
||||||
for(int i=0;i<9;++i)
|
for(int i=0;i<9;++i)
|
||||||
|
|
@ -300,9 +300,9 @@ public:
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Operatore sottrazione di matrici 3x3 con matrici diagonali
|
/// Operatore sottrazione di matrici 3x3 con matrici diagonali
|
||||||
Matrix33 operator - ( const Matrix33Diag<S> &p )
|
Matrix33 operator - ( const Matrix33Diag<S> &p ) const
|
||||||
{
|
{
|
||||||
Matrix33<S> r=a;
|
Matrix33<S> r=a;
|
||||||
r[0][0] -= p[0];
|
r[0][0] -= p[0];
|
||||||
|
|
@ -312,7 +312,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Operatore sottrazione per matrici 3x3
|
/// Operatore sottrazione per matrici 3x3
|
||||||
Matrix33 operator + ( const Matrix33 &m )
|
Matrix33 operator + ( const Matrix33 &m ) const
|
||||||
{
|
{
|
||||||
Matrix33<S> r;
|
Matrix33<S> r;
|
||||||
for(int i=0;i<9;++i)
|
for(int i=0;i<9;++i)
|
||||||
|
|
@ -320,9 +320,9 @@ public:
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Operatore addizione di matrici 3x3 con matrici diagonali
|
/// Operatore addizione di matrici 3x3 con matrici diagonali
|
||||||
Matrix33 operator + ( const Matrix33Diag<S> &p )
|
Matrix33 operator + ( const Matrix33Diag<S> &p ) const
|
||||||
{
|
{
|
||||||
Matrix33<S> r=(*this);
|
Matrix33<S> r=(*this);
|
||||||
r[0][0] += p[0];
|
r[0][0] += p[0];
|
||||||
|
|
@ -502,10 +502,10 @@ S Trace() const
|
||||||
return a[0]+a[4]+a[8];
|
return a[0]+a[4]+a[8];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
compute the matrix generated by the product of a * b^T
|
compute the matrix generated by the product of a * b^T
|
||||||
*/
|
*/
|
||||||
void ExternalProduct(const Point3<S> &a, const Point3<S> &b)
|
void ExternalProduct(const Point3<S> &a, const Point3<S> &b)
|
||||||
{
|
{
|
||||||
for(int i=0;i<3;++i)
|
for(int i=0;i<3;++i)
|
||||||
for(int j=0;j<3;++j)
|
for(int j=0;j<3;++j)
|
||||||
|
|
@ -524,8 +524,8 @@ ScalarType Norm()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
It compute the covariance matrix of a set of 3d points. Returns the barycenter
|
It compute the covariance matrix of a set of 3d points. Returns the barycenter
|
||||||
*/
|
*/
|
||||||
template <class STLPOINTCONTAINER >
|
template <class STLPOINTCONTAINER >
|
||||||
void Covariance(const STLPOINTCONTAINER &points, Point3<S> &bp) {
|
void Covariance(const STLPOINTCONTAINER &points, Point3<S> &bp) {
|
||||||
|
|
@ -547,19 +547,19 @@ void Covariance(const STLPOINTCONTAINER &points, Point3<S> &bp) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
It compute the cross covariance matrix of two set of 3d points P and X;
|
It compute the cross covariance matrix of two set of 3d points P and X;
|
||||||
it returns also the barycenters of P and X.
|
it returns also the barycenters of P and X.
|
||||||
fonte:
|
fonte:
|
||||||
|
|
||||||
Besl, McKay
|
Besl, McKay
|
||||||
A method for registration o f 3d Shapes
|
A method for registration o f 3d Shapes
|
||||||
IEEE TPAMI Vol 14, No 2 1992
|
IEEE TPAMI Vol 14, No 2 1992
|
||||||
|
|
||||||
*/
|
*/
|
||||||
template <class STLPOINTCONTAINER >
|
template <class STLPOINTCONTAINER >
|
||||||
void CrossCovariance(const STLPOINTCONTAINER &P, const STLPOINTCONTAINER &X,
|
void CrossCovariance(const STLPOINTCONTAINER &P, const STLPOINTCONTAINER &X,
|
||||||
Point3<S> &bp, Point3<S> &bx)
|
Point3<S> &bp, Point3<S> &bx)
|
||||||
{
|
{
|
||||||
SetZero();
|
SetZero();
|
||||||
assert(P.size()==X.size());
|
assert(P.size()==X.size());
|
||||||
|
|
@ -582,10 +582,10 @@ void CrossCovariance(const STLPOINTCONTAINER &P, const STLPOINTCONTAINER &X,
|
||||||
|
|
||||||
template <class STLPOINTCONTAINER, class STLREALCONTAINER>
|
template <class STLPOINTCONTAINER, class STLREALCONTAINER>
|
||||||
void WeightedCrossCovariance(const STLREALCONTAINER & weights,
|
void WeightedCrossCovariance(const STLREALCONTAINER & weights,
|
||||||
const STLPOINTCONTAINER &P,
|
const STLPOINTCONTAINER &P,
|
||||||
const STLPOINTCONTAINER &X,
|
const STLPOINTCONTAINER &X,
|
||||||
Point3<S> &bp,
|
Point3<S> &bp,
|
||||||
Point3<S> &bx)
|
Point3<S> &bx)
|
||||||
{
|
{
|
||||||
SetZero();
|
SetZero();
|
||||||
assert(P.size()==X.size());
|
assert(P.size()==X.size());
|
||||||
|
|
@ -603,7 +603,7 @@ void WeightedCrossCovariance(const STLREALCONTAINER & weights,
|
||||||
bx/=X.size();
|
bx/=X.size();
|
||||||
|
|
||||||
for(pi=P.begin(),xi=X.begin(),pw = weights.begin();pi!=P.end();++pi,++xi,++pw){
|
for(pi=P.begin(),xi=X.begin(),pw = weights.begin();pi!=P.end();++pi,++xi,++pw){
|
||||||
|
|
||||||
tmp.ExternalProduct(((*pi)-(bp)),((*xi)-(bp)));
|
tmp.ExternalProduct(((*pi)-(bp)),((*xi)-(bp)));
|
||||||
|
|
||||||
(*this)+=tmp*(*pw);
|
(*this)+=tmp*(*pw);
|
||||||
|
|
@ -656,11 +656,11 @@ Matrix33<S> RotationMatrix(vcg::Point3<S> v0,vcg::Point3<S> v1,bool normalized=t
|
||||||
return rotM;
|
return rotM;
|
||||||
}
|
}
|
||||||
|
|
||||||
///find the axis of rotation
|
///find the axis of rotation
|
||||||
CoordType axis;
|
CoordType axis;
|
||||||
axis=v0^v1;
|
axis=v0^v1;
|
||||||
axis.Normalize();
|
axis.Normalize();
|
||||||
|
|
||||||
///construct rotation matrix
|
///construct rotation matrix
|
||||||
S u=axis.X();
|
S u=axis.X();
|
||||||
S v=axis.Y();
|
S v=axis.Y();
|
||||||
|
|
@ -668,7 +668,7 @@ Matrix33<S> RotationMatrix(vcg::Point3<S> v0,vcg::Point3<S> v1,bool normalized=t
|
||||||
S phi=acos(dot);
|
S phi=acos(dot);
|
||||||
S rcos = cos(phi);
|
S rcos = cos(phi);
|
||||||
S rsin = sin(phi);
|
S rsin = sin(phi);
|
||||||
|
|
||||||
rotM[0][0] = rcos + u*u*(1-rcos);
|
rotM[0][0] = rcos + u*u*(1-rcos);
|
||||||
rotM[1][0] = w * rsin + v*u*(1-rcos);
|
rotM[1][0] = w * rsin + v*u*(1-rcos);
|
||||||
rotM[2][0] = -v * rsin + w*u*(1-rcos);
|
rotM[2][0] = -v * rsin + w*u*(1-rcos);
|
||||||
|
|
@ -725,7 +725,7 @@ template <class S>
|
||||||
return M;
|
return M;
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
typedef Matrix33<short> Matrix33s;
|
typedef Matrix33<short> Matrix33s;
|
||||||
typedef Matrix33<int> Matrix33i;
|
typedef Matrix33<int> Matrix33i;
|
||||||
typedef Matrix33<float> Matrix33f;
|
typedef Matrix33<float> Matrix33f;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue