Example #1
0
void NonRigid::computeInflateDir(VectorXf &p_vec, VectorXf &g_vec)
{
    VectorXf arap_g = g_vec;
    VectorXf inflate_g = g_vec;
    VectorXf userCrsp_g = g_vec;
    double f_e = 0;
    computeArap(p_vec, arap_g);
    computeUserCrsp(p_vec, userCrsp_g);

    Vector3f cur_v(0,0,0);
    Vector3f cur_g(0,0,0);
    size_t P_Num = p_vec.size()/3;
    for (size_t i = 0; i < P_Num; ++i)
    {
        cur_v << p_vec(i + 0*P_Num), p_vec(i + 1*P_Num), p_vec(i + 2*P_Num);
        if (computeVertexGrad(cur_v, cur_g) > 0.0)
        {
            inflate_g(i + 0*P_Num) = cur_g(0);
            inflate_g(i + 1*P_Num) = cur_g(1);
            inflate_g(i + 2*P_Num) = cur_g(2);
        }
        else
        {
            inflate_g(i + 0*P_Num) = -P_Prime_N(0, i);
            inflate_g(i + 1*P_Num) = -P_Prime_N(1, i);
            inflate_g(i + 2*P_Num) = -P_Prime_N(2, i);
        }

    }

    g_vec = lamd_inflate*inflate_g + lamd_arap*arap_g + lamd_userCrsp*userCrsp_g;
    g_vec.normalize();
}
Example #2
0
double NonRigid::computeDistEnergy(VectorXf &p_vec, VectorXf &g_vec)
{
    double dist_e = 0;
    Vector3f cur_v(0,0,0);
    Vector3f cur_g(0,0,0);
    size_t P_Num = p_vec.size()/3;
    for (size_t i = 0; i < P_Num; ++i)
    {
        cur_v << p_vec(i + 0*P_Num), p_vec(i + 1*P_Num), p_vec(i + 2*P_Num);
        dist_e += computeVertexGrad(cur_v, cur_g);
        g_vec(i + 0*P_Num) = cur_g(0);
        g_vec(i + 1*P_Num) = cur_g(1);
        g_vec(i + 2*P_Num) = cur_g(2);
    }
    return dist_e;
}
    vector<int> getRow(int rowIndex) {
        if(rowIndex == 0)
            return vector<int> (1,1);
        if(rowIndex == 1)
        {
            return vector<int> (2,1);;
        }
        vector<int> v(2,1);
        for(int i = 2; i <= rowIndex; i ++){
            vector<int> cur_v(i+1,1);
            for(int j = 1; j < i; j ++){
                cur_v[j] = v[j-1] + v[j];
            }
            v = cur_v;
        }
        
        return v;

    }