/*! Computes some temporary invariants which are used internally to compute the final invariants. \param momentCentered : centered moments \param I : invariant output values */ void vpMomentCInvariant::computeI(vpMomentCentered& momentCentered, std::vector<double>& I){ double mu30 = momentCentered.get(3,0); double mu30_2 = mu30*mu30; double mu03 = momentCentered.get(0,3); double mu03_2 = mu03*mu03; double mu03_3 = mu03*mu03_2; double mu20 = momentCentered.get(2,0); double mu02 = momentCentered.get(0,2); double mu50 = momentCentered.get(5,0); double mu32 = momentCentered.get(3,2); double mu14 = momentCentered.get(1,4); double mu05 = momentCentered.get(0,5); double mu23 = momentCentered.get(2,3); double mu41 = momentCentered.get(4,1); double mu40 = momentCentered.get(4,0); double mu04 = momentCentered.get(0,4); double mu31 = momentCentered.get(3,1); double mu13 = momentCentered.get(1,3); double mu22 = momentCentered.get(2,2); double mu21 = momentCentered.get(2,1); double mu12 = momentCentered.get(1,2); double mu11 = momentCentered.get(1,1); double mu11_2 = mu11*mu11; double mu12_2 = mu12*mu12; double mu21_2 = mu21*mu21; double mu22_2 = mu22*mu22; double mu13_2 = mu13*mu13; double mu31_2 = mu31*mu31; double mu04_2 = mu04*mu04; double mu40_2 = mu40*mu40; double mu21_3 = mu21*mu21_2; double mu12_3 = mu12_2*mu12; double mu12_4 = mu12_3*mu12; double mu21_4 = mu21_2*mu21_2; double kappa = mu30_2+mu03_2-3*mu21_2+6*mu21*mu03; double zeta = mu20-mu02; double zeta_2 = zeta * zeta; double omicron = (mu03_2+3*mu03*mu21+mu30*(mu30+3*mu12)); double omega = mu50+2*mu32+mu14; double nu = mu05+2*mu23+mu41; double ro = mu50-2*mu32-3*mu14; double gamma = mu05-2*mu23-3*mu41; double delta = mu50-10*mu32+5*mu14; double phi = mu05-10*mu23+5*mu41; double omega_2 = omega*omega; double nu_2 = nu*nu; double ro_2 = ro*ro; double gamma_2 = gamma*gamma; double delta_2 = delta*delta; double phi_2 = phi*phi; I[1]=-mu20*mu02+mu11_2; I[2]=zeta_2+4*mu11_2; I[3]=(mu30-3*mu12)*(mu30-3*mu12)+(mu03-3*mu21)*(mu03-3*mu21); I[4]=(mu30+mu12)*(mu30+mu12)+(mu21+mu03)*(mu21+mu03); I[5]=-mu30_2*mu03_2+(-4*mu12_3+6*mu21*mu12*mu03)*mu30-4*mu21_3*mu03+3*mu21_2*mu12_2; I[6]=3*mu12_4+2*mu30*mu12_3+(3*mu30_2-6*mu03*mu21)*mu12_2-6*mu30*mu21*(mu21+mu03)*mu12+2*mu30_2*mu03_2+2*mu21_3*mu03+3*mu21_2*mu03_2+3*mu21_4; I[7]=(3*mu21+2*mu03)*mu12_3+3*mu30*(mu03+2*mu21)*mu12_2-3*mu21*(mu30+mu03+mu21)*(-mu30+mu03+mu21)*mu12+mu30*(-mu30_2*mu03-2*mu21_3-3*mu03*mu21_2+mu03_3); I[8]=3*mu21_4-3*mu21_3*mu03+(3*mu03_2+kappa-6*mu12_2)*mu21_2-mu03*(-15*mu12_2+kappa)*mu21-(-3*mu12_2*mu30+(2*kappa-3*mu03_2)*mu12+kappa*mu30)*mu12; I[9]=omicron*omicron; I[10]=mu40*mu04-4*mu31*mu13+3*mu22_2; I[11]=3*mu13_2+2*mu31*mu13+(-3*mu40-3*mu04)*mu22-2*mu40*mu04+3*mu31_2; I[12]=3*mu04_2+(2*mu40+12*mu22)*mu04+3*mu40_2+12*mu40*mu22+16*mu31*mu13; I[13]=omega_2+nu_2; I[14]=ro_2+gamma_2; I[15]=delta_2+phi_2; double a; if(getObject().getType()==vpMomentObject::DISCRETE) a = momentCentered.get(2,0)+momentCentered.get(0,2); else a = getObject().get(0,0); c[1]=momentCentered.get(2,0)-momentCentered.get(0,2); s[1]=2*momentCentered.get(1,1); c[2]=momentCentered.get(0,3)-3*momentCentered.get(2,1); s[2]=momentCentered.get(3,0)-3*momentCentered.get(1,2); c[3]=c[1]*c[1]-s[1]*s[1]; s[3]=2*s[1]*c[1]; II[1]=c[1]*c[1]+s[1]*s[1]; II[2]=c[2]*c[2]+s[2]*s[2]; II[3]=momentCentered.get(2,0)+momentCentered.get(0,2); K=(II[1]*(II[3]*sqrt(II[3])))/sqrt(a); }
/*! Computes some temporary invariants which are used internally to compute the final invariants. \param momentCentered : centered moments \param I : invariant output values */ void vpMomentCInvariant::computeI(const vpMomentCentered& momentCentered, std::vector<double>& I_val){ double mu30 = momentCentered.get(3,0); double mu30_2 = mu30*mu30; double mu30_3 = mu30_2*mu30; double mu03 = momentCentered.get(0,3); double mu03_2 = mu03*mu03; double mu03_3 = mu03*mu03_2; double mu20 = momentCentered.get(2,0); double mu02 = momentCentered.get(0,2); double mu50 = momentCentered.get(5,0); double mu32 = momentCentered.get(3,2); double mu14 = momentCentered.get(1,4); double mu05 = momentCentered.get(0,5); double mu23 = momentCentered.get(2,3); double mu41 = momentCentered.get(4,1); double mu40 = momentCentered.get(4,0); double mu04 = momentCentered.get(0,4); double mu31 = momentCentered.get(3,1); double mu13 = momentCentered.get(1,3); double mu22 = momentCentered.get(2,2); double mu21 = momentCentered.get(2,1); double mu12 = momentCentered.get(1,2); double mu11 = momentCentered.get(1,1); double mu11_2 = mu11*mu11; double mu12_2 = mu12*mu12; double mu21_2 = mu21*mu21; double mu22_2 = mu22*mu22; double mu13_2 = mu13*mu13; double mu31_2 = mu31*mu31; double mu04_2 = mu04*mu04; double mu40_2 = mu40*mu40; double mu21_3 = mu21*mu21_2; double mu12_3 = mu12_2*mu12; double mu12_4 = mu12_3*mu12; double mu21_4 = mu21_2*mu21_2; //double kappa = mu30_2+mu03_2-3*mu21_2+6*mu21*mu03; //Used in I8 calculation but simplified with MAPLE and found it to be wrong double zeta = mu20-mu02; double zeta_2 = zeta * zeta; double omicron = (mu03_2+3*mu03*mu21+mu30*(mu30+3*mu12)); double omega = mu50+2*mu32+mu14; double nu = mu05+2*mu23+mu41; double ro = mu50-2*mu32-3*mu14; double gamma = mu05-2*mu23-3*mu41; double delta = mu50-10*mu32+5*mu14; double phi = mu05-10*mu23+5*mu41; double omega_2 = omega*omega; double nu_2 = nu*nu; double ro_2 = ro*ro; double gamma_2 = gamma*gamma; double delta_2 = delta*delta; double phi_2 = phi*phi; I_val[1]=-mu20*mu02+mu11_2; I_val[2]=zeta_2+4*mu11_2; I_val[3]=(mu30-3*mu12)*(mu30-3*mu12)+(mu03-3*mu21)*(mu03-3*mu21); I_val[4]=(mu30+mu12)*(mu30+mu12)+(mu21+mu03)*(mu21+mu03); I_val[5]=-mu30_2*mu03_2+(-4*mu12_3+6*mu21*mu12*mu03)*mu30-4*mu21_3*mu03+3*mu21_2*mu12_2; I_val[6]=3*mu12_4+2*mu30*mu12_3+(3*mu30_2-6*mu03*mu21)*mu12_2-6*mu30*mu21*(mu21+mu03)*mu12+2*mu30_2*mu03_2+2*mu21_3*mu03+3*mu21_2*mu03_2+3*mu21_4; I_val[7]=(3*mu21+2*mu03)*mu12_3+3*mu30*(mu03+2*mu21)*mu12_2-3*mu21*(mu30+mu03+mu21)*(-mu30+mu03+mu21)*mu12+mu30*(-mu30_2*mu03-2*mu21_3-3*mu03*mu21_2+mu03_3); //I_val[8]=3*mu21_4-3*mu21_3*mu03+(3*mu03_2+kappa-6*mu12_2)*mu21_2-mu03*(-15*mu12_2+kappa)*mu21-(-3*mu12_2*mu30+(2*kappa-3*mu03_2)*mu12+kappa*mu30)*mu12; I_val[8] = 3*mu03*mu21_3-2*mu03_2*mu21_2+mu21_2*mu30_2+3*mu12_2*mu03*mu21-mu03*mu21*mu30_2-mu03_3*mu21+3*mu12_3*mu30-2*mu12_2*mu30_2+mu12_2*mu03_2-mu12*mu30_3-mu12*mu30*mu03_2+3*mu12*mu30*mu21_2-6*mu12*mu30*mu03*mu21; I_val[9]=omicron*omicron; I_val[10]=mu40*mu04-4*mu31*mu13+3*mu22_2; I_val[11]=3*mu13_2+2*mu31*mu13+(-3*mu40-3*mu04)*mu22-2*mu40*mu04+3*mu31_2; I_val[12]=3*mu04_2+(2*mu40+12*mu22)*mu04+3*mu40_2+12*mu40*mu22+16*mu31*mu13; I_val[13]=omega_2+nu_2; I_val[14]=ro_2+gamma_2; I_val[15]=delta_2+phi_2; double a; if(getObject().getType()==vpMomentObject::DISCRETE) a = momentCentered.get(2,0)+momentCentered.get(0,2); else a = getObject().get(0,0); c[1]=momentCentered.get(2,0)-momentCentered.get(0,2); s[1]=2*momentCentered.get(1,1); c[2]=momentCentered.get(0,3)-3*momentCentered.get(2,1); s[2]=momentCentered.get(3,0)-3*momentCentered.get(1,2); c[3]=c[1]*c[1]-s[1]*s[1]; s[3]=2*s[1]*c[1]; II[1]=c[1]*c[1]+s[1]*s[1]; II[2]=c[2]*c[2]+s[2]*s[2]; II[3]=momentCentered.get(2,0)+momentCentered.get(0,2); K=(II[1]*(II[3]*sqrt(std::abs(II[3]))))/sqrt(std::abs(a)); /* * Intermediate quantities required for calculation of normalized version of Sx and Sy * The pij doubles below are the respective centered moment values mu_ij scaled by mu20 + mu02 */ double p20 = momentCentered.get(2,0)/II[3]; // II[3] is the normalization factor for the 2nd order moments double p11 = momentCentered.get(1,1)/II[3]; double p02 = momentCentered.get(0,2)/II[3]; double d = sqrt(std::abs(a))/(II[3]*sqrt(std::abs(II[3]))); // d is the normalization factor for 3rd order moments double p30 = momentCentered.get(3,0)*d; double p21 = momentCentered.get(2,1)*d; double p12 = momentCentered.get(1,2)*d; double p03 = momentCentered.get(0,3)*d; cn[1] = p20 - p02; sn[1] = 2.0*p11; sn[2] = p30 - 3.0*p12; cn[2] = p03 - 3.0*p21; cn[3] = cn[1]*cn[1]-sn[1]*sn[1]; sn[3] = 2.0*sn[1]*cn[1]; In1 = cn[1]*cn[1]+sn[1]*sn[1]; }