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(); }
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; }