35 #ifndef AIMS_MOMENT_MOMINCSTGY_H
36 #define AIMS_MOMENT_MOMINCSTGY_H
54 template<
class T >
inline
56 double y,
double z,
int dir )
64 (
sum < 2.0 ) ? ct : (
sum - 1.0 ) * ct;
66 double s = (double)dir;
67 double d1 = s - ct / d;
87 double xyz = x * y * z;
89 double mx = m->
m1()[ 0 ];
90 double my = m->
m1()[ 1 ];
91 double mz = m->
m1()[ 2 ];
96 double m2x = m->
m2()[ 0 ];
97 double m2y = m->
m2()[ 1 ];
98 double m2z = m->
m2()[ 2 ];
99 double m2xy = m->
m2()[ 3 ];
100 double m2xz = m->
m2()[ 4 ];
101 double m2yz = m->
m2()[ 5 ];
103 double xymz = xy * mz;
104 double xzmy = xz * my;
105 double yzmx = yz * mx;
111 double mxmy = mx * my;
112 double mxmz = mx * mz;
113 double mymz = my * mz;
114 double mxyzd = mxmy * mz / d;
116 double mxmyz = mxmy * z;
117 double mxymz = mxmz * y;
118 double xmymz = mymz * x;
120 m->
m3()[ 0 ] += s*(x3-3.0*(m2x*(x-mxd)+s*x3*ct+x2*mx)/d2+(2.0*x3*c2+
121 6.0*s*x2*mx*ct+3.0*x*mx2-mx2/d*(3.0*s*x*ct+mx-
123 m->
m3()[ 1 ] += s*(y3-3.0*(m2y*(y-myd)+s*y3*ct+y2*my)/d2+(2.0*y3*c2+
124 6.0*s*y2*my*ct+3.0*y*my2-my2/d*(3.0*s*y*ct+my-
126 m->
m3()[ 2 ] += s*(z3-3.0*(m2z*(z-mzd)+s*z3*ct+z2*mz)/d2+(2.0*z3*c2+
127 6.0*s*z2*mz*ct+3.0*z*mz2-mz2/d*(3.0*s*z*ct+mz-
129 m->
m3()[ 3 ] += s*(x2y-(2.0*m2xy*(x-mxd)+m2x*(y-myd)+2.0*xy*mx+3.0*s*
130 x2y*ct+x2*my)/d2+(2.0*x*mxmy+y*mx2+4.0*s*xy*mx*ct+2.0*
131 s*x2*my*ct+2.0*x2y*c2-s*mxd*(mxmy*d1+2.0*x*my*ct+
133 m->
m3()[ 4 ] += s*(x2z-(2.0*m2xz*(x-mxd)+m2x*(z-mzd)+2.0*xz*mx+3.0*s*
134 x2z*ct+x2*mz)/d2+(2.0*x*mxmz+z*mx2+4.0*s*xz*mx*ct+2.0*
135 s*x2*mz*ct+2.0*x2z*c2-s*mxd*(mxmz*d1+2.0*x*mz*ct+
137 m->
m3()[ 5 ] += s*(xy2-(2.0*m2xy*(y-myd)+m2y*(x-mxd)+2.0*xy*my+3.0*s*
138 xy2*ct+y2*mx)/d2+(2.0*y*mxmy+x*my2+4.0*s*xy*my*ct+2.0*
139 s*y2*mx*ct+2.0*xy2*c2-s*myd*(mxmy*d1+2.0*y*mx*ct+
141 m->
m3()[ 6 ] += s*(y2z-(2.0*m2yz*(y-myd)+m2y*(z-mzd)+2.0*yz*my+3.0*s*
142 y2z*ct+y2*mz)/d2+(2.0*y*mymz+z*my2+4.0*s*yz*my*ct+2.0*
143 s*y2*mz*ct+2.0*y2z*c2-s*myd*(mymz*d1+2.0*y*mz*ct+
145 m->
m3()[ 7 ] += s*(xz2-(2.0*m2xz*(z-mzd)+m2z*(x-mxd)+2.0*xz*mz+3.0*s*
146 xz2*ct+z2*mx)/d2+(2.0*z*mxmz+x*mz2+4.0*s*xz*mz*ct+2.0*
147 s*z2*mx*ct+2.0*xz2*c2-s*mzd*(mxmz*d1+2.0*z*mx*ct+
149 m->
m3()[ 8 ] += s*(yz2-(2.0*m2yz*(z-mzd)+m2z*(y-myd)+2.0*yz*mz+3.0*s*
150 yz2*ct+z2*my)/d2+(2.0*z*mymz+y*mz2+4.0*s*yz*mz*ct+2.0*
151 s*z2*my*ct+2.0*yz2*c2-s*mzd*(mymz*d1+2.0*z*my*ct+
153 m->
m3()[ 9 ] += s*(xyz-(m2yz*(x-mxd)+m2xz*(y-myd)+m2xy*(z-mzd)+3.0*s*
154 xyz*ct+xymz+xzmy+yzmx)/d2+(2.0*xyz*c2+2.0*s*(yzmx+xymz+
155 xzmy)*ct+xmymz+mxymz+mxmyz-mxyzd-s*ct*(xmymz+mxymz+mxmyz-
158 m->
m2()[ 0 ] += s * ( x2 - ( 2*x*mx + s*x2*ct - mx2/d ) / d2 ) * a;
159 m->
m2()[ 1 ] += s * ( y2 - ( 2*y*my + s*y2*ct - my2/d ) / d2 ) * a;
160 m->
m2()[ 2 ] += s * ( z2 - ( 2*z*mz + s*z2*ct - mz2/d ) / d2 ) * a;
161 m->
m2()[ 3 ] += s * ( xy - ( x*my + y*mx + s*xy*ct - mxmy/d ) / d2 ) * a;
162 m->
m2()[ 4 ] += s * ( xz - ( x*mz + z*mx + s*xz*ct - mxmz/d ) / d2 ) * a;
163 m->
m2()[ 5 ] += s * ( yz - ( y*mz + z*my + s*yz*ct - mymz/d ) / d2 ) * a;
165 m->
m1()[ 0 ] += s * x * ct;
166 m->
m1()[ 1 ] += s * y * ct;
167 m->
m1()[ 2 ] += s * z * ct;
173 double dd = ( m->
sum() < 2 ) ? ct : m->
sum() * ct;
180 template<
class T >
inline
185 int dx = d->getSizeX();
186 int dy = d->getSizeY();
187 int dz = d->getSizeZ();
188 int o = d->getStrides()[0];
191 for ( z=0; z<dz; z++ )
192 for ( y=0; y<dy; y++ )
194 it = &d->at( 0, y, z );
195 for ( x=0; x<dx; x++, it+=o )
197 update( m, (
double)x, (
double)y, (
double)z, dir );
202 template<
class T >
inline
215 for( ib=bk.begin(); ib!=eb; ++ib )
217 update( m, ib->first[0], ib->first[1], ib->first[2], dir );
void doit(Moment< T > *, carto::rc_ptr< carto::Volume< T > > &, T, int)
MomentIncrementalStrategy()
void update(Moment< T > *, double, double, double, int)
std::map< Point3d, T, BucketMapLess > Bucket
DataTypeTraits< T >::LongType sum(const Volume< T > &vol)