Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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;
}