/*!
  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);



}
예제 #2
0
/*!
  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];
}