void DeformModel::BufferAdjacent() { adj_pair_list adj_2_list, adj_1_list; adj_2_list.clear(); for (unsigned int i=0; i<_num_edge; i++) { unsigned int id1 = _edges[i].fid(0); unsigned int id2 = _edges[i].fid(1); if (id1 == -1 || id2 == -1) continue; if (id1 < id2) swapI(id1, id2); unsigned int st1 = 0, st2 = 0; unsigned int cov = Covertex_F(id1, id2, st1, st2); //20090903 ... //assert(cov == 2); char status = get_status_2(id1, id2, st1, st2); //if (status == 3) continue; adj_2_list.push_back(adjacent_pair(id1, id2, st1, st2, status)); } adj_1_list.clear(); for (unsigned int i=0; i<_num_vtx; i++) { for (id_list::iterator it1=_vtx_fids[i].begin(); it1!=_vtx_fids[i].end(); it1++) { for (id_list::iterator it2=it1; it2!=_vtx_fids[i].end(); it2++) { if (it1 == it2) continue; unsigned int id1 = *it1; unsigned int id2 = *it2; if (id1 < id2) swapI(id1, id2); unsigned int st1 = 0, st2 = 0; unsigned int cov = Covertex_F(id1, id2, st1, st2); if (cov == 2) continue; char status = get_status_1(id1, id2, st1, st2); //if (status == 3) continue; adj_1_list.push_back(adjacent_pair(id1, id2, st1, st2, status)); } } } sort(adj_1_list.begin(), adj_1_list.end()); adj_1_list.erase(unique(adj_1_list.begin(), adj_1_list.end()), adj_1_list.end()); get_orphans(adj_2_list, adj_1_list); }
char DeformModel::get_status_1(unsigned int id1, unsigned int id2, unsigned int st1, unsigned int st2) { unsigned int e0 = _tri_edges[id1].id(st1); unsigned int e00 = _tri_edges[id1].id((st1+2)%3); unsigned int fid1 = _edges[e0].fid(0); unsigned int f1_mates = (fid1 == id1) ? _edges[e0].fid(1) : fid1; unsigned int e1 = _tri_edges[id2].id(st2); unsigned int e11 = _tri_edges[id2].id((st2+2)%3); if (Covertex_E(e0, e1)) { swapI(e1, e11); } unsigned int fid2 = _edges[e11].fid(0); unsigned int f2_mates = (fid2 == id2) ? _edges[e11].fid(1) : fid2; if (f1_mates != -1) if (f2_mates != -1) return 3; // just skip it else return 2; //group 2 only else if (f2_mates != -1) return 1; //group 1 only else return 0; //both group }
/*! Função auxiliar do algoritmo quickSort. */ int partition(int endoSize, int *endoWeight, int left, int right, int** matrix, int matrixSize) { int i, j, k; i = left; for (j = left + 1; j <= right; ++j) { if (endoWeight[j] < endoWeight[left]) { i++; swapI(&endoWeight[i], &endoWeight[j]); for(k = 0; k < endoSize; k++) { swapI(&matrix[i][k], &matrix[j][k]); } } } swapI(&endoWeight[left], &endoWeight[i]); for(k = 0; k < endoSize; k++) { swapI(&matrix[left][k], &matrix[i][k]); } return i; }