35 #ifndef AIMS_MOMENT_MOMENT_H 36 #define AIMS_MOMENT_MOMENT_H 51 std::ostream& operator << ( std::ostream&, const Moment< T >& );
98 double cx()
const {
return _cx; }
99 double cy()
const {
return _cy; }
113 const double&
m0()
const {
return _m0; }
116 const double *
m1()
const {
return &
_m1[ 0 ]; }
118 const double *
m2()
const {
return &
_m2[ 0 ]; }
120 const double *
m3()
const {
return &
_m3[ 0 ]; }
127 virtual void update(
double,
double,
double,
int );
161 template<
class T >
inline 168 template<
class T >
inline 177 for ( i=0; i<3; i++ )
180 _m1[ i ] = other.
m1()[ i ];
182 for ( i=0; i<6; i++ )
_m2[ i ] = other.
m2()[ i ];
183 for ( i=0; i<9; i++ )
_m3[ i ] = other.
m3()[ i ];
187 template<
class T >
inline 219 #pragma GCC diagnostic push 220 #pragma GCC diagnostic ignored "-Woverloaded-virtual" 221 template<
class T >
inline 224 update( (
double)pt[ 0 ], (
double)pt[ 1 ], (
double)pt[ 2 ], dir );
228 template<
class T >
inline 231 update( pt[ 0 ], pt[ 1 ], pt[ 2 ], dir );
235 template<
class T >
inline 240 #pragma GCC diagnostic pop 243 template<
class T >
inline 261 template<
class T >
inline 262 std::ostream& operator << ( std::ostream& out , const Moment< T >& mom )
266 out <<
"Image geometry: (" << mom.cx() <<
"x" << mom.cy() <<
"x" << mom.cz();
267 out <<
")" << std::endl <<
"Volume : " << mom.m0() <<
"mm3" << std::endl;
268 out <<
"Number of points : " << mom.sum() << std::endl;
269 out <<
"Volume (mm3) : " << mom.m0() << std::endl;
270 out <<
"Order 1 moments : ";
271 for ( i=0; i<3; i++ ) out << mom.m1()[ i ] <<
" ";
272 out << std::endl <<
"Order 2 moments : ";
273 for ( i=0; i<6; i++ ) out << mom.m2()[ i ] <<
" ";
274 out << std::endl <<
"Order 3 moments : ";
275 for ( i=0; i<10; i++ ) out << mom.m3()[ i ] <<
" ";
276 out << std::endl <<
"Center of Mass : (" << mom.gravity()[ 0 ] <<
",";
277 out << mom.gravity()[ 1 ] <<
"," << mom.gravity()[ 2 ] <<
")" << std::endl;
278 out <<
"Orientation :" << std::endl <<
" Inerty : ";
279 out << mom.eigenValue()( 0, 0 ) <<
" ; " << mom.eigenValue()( 1, 1 );
280 out <<
" ; " << mom.eigenValue()( 2, 2 );
281 out << std::endl <<
" V1 : (" << mom.eigenVector()( 0, 0 ) <<
",";
282 out << mom.eigenVector()( 1, 0 ) <<
"," << mom.eigenVector()( 2, 0 ) <<
")";
283 out << std::endl <<
" V2 : (" << mom.eigenVector()( 0, 1 ) <<
",";
284 out << mom.eigenVector()( 1, 1 ) <<
"," << mom.eigenVector()( 2, 1 ) <<
")";
285 out << std::endl <<
" V3 : (" << mom.eigenVector()( 0, 2 ) <<
",";
286 out << mom.eigenVector()( 1, 2 ) <<
"," << mom.eigenVector()( 2, 2 ) <<
")";
292 template<
class T >
inline 302 else if( m.
_sum == 0 )
310 _m3[1] +=
_m0*g1*g1*g1 + g1*_m2[1]*3;
311 _m3[2] +=
_m0*g2*g2*g2 + g2*_m2[2]*3;
312 _m3[3] +=
_m0*g0*g0*g1 + g0*_m2[3]*2 + g1*_m2[0];
313 _m3[4] +=
_m0*g0*g0*g2 + g0*_m2[4]*2 + g2*_m2[0];
314 _m3[5] +=
_m0*g0*g1*g1 + g0*_m2[1] + g1*_m2[3]*2;
315 _m3[6] +=
_m0*g1*g1*g2 + g1*_m2[5]*2 + g2*_m2[1];
316 _m3[7] +=
_m0*g0*g2*g2 + g0*_m2[2] + g2*_m2[4]*2;
317 _m3[8] +=
_m0*g1*g2*g2 + g1*_m2[2] + g2*_m2[5]*2;
318 _m3[9] +=
_m0*g0*g1*g2 + g0*_m2[5] + g1*_m2[4] +g2*_m2[3];
320 _m2[0] +=
_m0 * g0*g0;
321 _m2[1] +=
_m0 * g1*g1;
322 _m2[2] +=
_m0 * g2*g2;
323 _m2[3] +=
_m0 * g0*g1;
324 _m2[4] +=
_m0 * g0*g2;
325 _m2[5] +=
_m0 * g1*g2;
327 double m20 = m.
_m2[0];
328 double m21 = m.
_m2[1];
329 double m22 = m.
_m2[2];
330 double m23 = m.
_m2[3];
331 double m24 = m.
_m2[4];
332 double m25 = m.
_m2[5];
334 double h0 = m.
_m1[0] / m.
_m0;
335 double h1 = m.
_m1[1] / m.
_m0;
336 double h2 = m.
_m1[2] / m.
_m0;
344 _m3[0] += m.
_m3[0] + m.
_m0*h0*h0*h0 + h0*m20*3;
345 _m3[1] += m.
_m3[1] + m.
_m0*h1*h1*h1 + h1*m21*3;
346 _m3[2] += m.
_m3[2] + m.
_m0*h2*h2*h2 + h2*m22*3;
347 _m3[3] += m.
_m3[3] + m.
_m0*h0*h0*h1 + h0*m23*2 + h1*m20;
348 _m3[4] += m.
_m3[4] + m.
_m0*h0*h0*h2 + h0*m24*2 + h2*m20;
349 _m3[5] += m.
_m3[5] + m.
_m0*h0*h1*h1 + h0*m21 + h1*m23*2;
350 _m3[6] += m.
_m3[6] + m.
_m0*h1*h1*h2 + h1*m25*2 + h2*m21;
351 _m3[7] += m.
_m3[7] + m.
_m0*h0*h2*h2 + h0*m22 + h2*m24*2;
352 _m3[8] += m.
_m3[8] + m.
_m0*h1*h2*h2 + h1*m22 + h2*m25*2;
353 _m3[9] += m.
_m3[9] + m.
_m0*h0*h1*h2 + h0*m25 + h1*m24 +h2*m23;
355 _m2[0] += m.
_m2[0] + m.
_m0 * h0*h0;
356 _m2[1] += m.
_m2[1] + m.
_m0 * h1*h1;
357 _m2[2] += m.
_m2[2] + m.
_m0 * h2*h2;
358 _m2[3] += m.
_m2[3] + m.
_m0 * h0*h1;
359 _m2[4] += m.
_m2[4] + m.
_m0 * h0*h2;
360 _m2[5] += m.
_m2[5] + m.
_m0 * h1*h2;
373 _m2[0] -=
_m0 * g0*g0;
374 _m2[1] -=
_m0 * g1*g1;
375 _m2[2] -=
_m0 * g2*g2;
376 _m2[3] -=
_m0 * g0*g1;
377 _m2[4] -=
_m0 * g0*g2;
378 _m2[5] -=
_m0 * g1*g2;
380 _m3[0] -=
_m0*g0*g0*g0 + g0*_m2[0]*3;
381 _m3[1] -=
_m0*g1*g1*g1 + g1*_m2[1]*3;
382 _m3[2] -=
_m0*g2*g2*g2 + g2*_m2[2]*3;
383 _m3[3] -=
_m0*g0*g0*g1 + g0*_m2[3]*2 + g1*_m2[0];
384 _m3[4] -=
_m0*g0*g0*g2 + g0*_m2[4]*2 + g2*_m2[0];
385 _m3[5] -=
_m0*g0*g1*g1 + g0*_m2[1] + g1*_m2[3]*2;
386 _m3[6] -=
_m0*g1*g1*g2 + g1*_m2[5]*2 + g2*_m2[1];
387 _m3[7] -=
_m0*g0*g2*g2 + g0*_m2[2] + g2*_m2[4]*2;
388 _m3[8] -=
_m0*g1*g2*g2 + g1*_m2[2] + g2*_m2[5]*2;
389 _m3[9] -=
_m0*g0*g1*g2 + g0*_m2[5] + g1*_m2[4] +g2*_m2[3];
396 template<
class T >
inline 405 #pragma GCC diagnostic push 406 #pragma GCC diagnostic ignored "-Woverloaded-virtual" 410 std::clog <<
"PROGRAMMING ERROR: called unimplemented base method" 411 " Moment<T>::doit( AimsData< T >&, T, int )" 414 throw std::logic_error(
"called unimplemented base method" 415 " Moment<T>::doit( AimsData< T >&, T, int )");
422 std::clog <<
"PROGRAMMING ERROR: called unimplemented base method" 423 " Moment<T>::doit( AimsSurfaceTriangle& )" 426 throw std::logic_error(
"called unimplemented base method" 427 " Moment<T>::doit( AimsSurfaceTriangle& )");
434 std::clog <<
"PROGRAMMING ERROR: called unimplemented base method" 435 " Moment<T>::doit( const aims::BucketMap<Void> & )" 438 throw std::logic_error(
"called unimplemented base method" 439 " Moment<T>::doit( const aims::BucketMap<Void> & )");
442 #pragma GCC diagnostic pop AimsData< double > _eigenVector
const double * m2() const
AIMSDATA_API AimsTimeSurface< 3, Void > AimsSurfaceTriangle
const double * m3() const
const double * m1() const
Moment< T > & operator+=(const Moment< T > &)
const double & m0() const
AimsData< double > _eigenValue
virtual void update(Point3df &, int)
Moment< T > operator+(const Moment< T > &)
Moment()
doesn't necessarily clear all moments to 0. Call clear() to be sure
AimsData< T > doit(AimsData< T > &, AimsData< T > *wi=NULL)
Eigen system resolution function.
virtual void orientation()
virtual void doit(AimsData< T > &, T, int)
const double & sum() const
const AimsData< double > & eigenValue() const
void sort(AimsData< T > &eigenvectors, AimsData< T > &eigenvalues, AimsData< T > *wi=NULL)
Sort the eigenvectors and eigenvalues in decreasing order.
const double * gravity() const
const AimsData< double > & eigenVector() const