void cMesh::clean() { int nbFaces = getFacesNumber(); for(int i=0 ; i < nbFaces; i++) { cTriangle * Triangle = getTriangle(i); if (Triangle->getEdgesNumber() < 3 && !Triangle->isTextured()) { //cout <<"remove triangle " << Triangle->getIdx() << " with " << Triangle->getEdgesNumber() << " edges" << endl; //cout <<"sommets = " << Triangle->getVertex(0) << " " << Triangle->getVertex(1) << " " << Triangle->getVertex(2) << endl; removeTriangle(*Triangle); nbFaces--; i--; } /*else if (!Triangle->isTextured()) cout << "triangle " << i << " nb edges = " << Triangle->getEdgesNumber() << " textured= " << Triangle->isTextured() << endl;*/ } //suppression des points n'appartenant à aucun triangle for(int aK=0; aK < getVertexNumber();++aK) { bool found = false; for(int i=0 ; i < nbFaces; i++) { int vertex1, vertex2, vertex3; getTriangle(i)->getVertexesIndexes(vertex1, vertex2, vertex3); if ((aK==vertex1) || (aK==vertex2) || (aK==vertex3)) { found = true; break; } } if (!found) //remove this point { mVertexes.erase(std::remove(mVertexes.begin(), mVertexes.end(), mVertexes[aK]), mVertexes.end()); for(int i=0 ; i < nbFaces; i++) { cTriangle * tri= getTriangle(i); int vertex1, vertex2, vertex3; tri->getVertexesIndexes(vertex1, vertex2, vertex3); if (vertex1>aK) tri->setVertexIndex(0, vertex1-1); if (vertex2>aK) tri->setVertexIndex(1, vertex2-1); if (vertex3>aK) tri->setVertexIndex(2, vertex3-1); } } } }
std::vector< std::vector <int> > cMesh::getRegions() { int defVal = cTriangle::getDefTextureImgIndex(); std::set < int > triangleIdxSet; std::vector< std::vector <int> > regions; for (int aK=0; aK < getFacesNumber();++aK) { std::vector <int> myList; myList.push_back(aK); for (unsigned int bK=0; bK < myList.size();++bK) { cTriangle * Tri = getTriangle(myList[bK]); int imgIdx = Tri->getTextureImgIndex(); if (imgIdx != defVal) { triangleIdxSet.insert(Tri->getIdx()); vector <cTriangle *> neighb = Tri->getNeighbours(); for (unsigned int cK=0; cK < neighb.size();++cK) { int triIdx = neighb[cK]->getIdx(); if (triangleIdxSet.find(triIdx)== triangleIdxSet.end() && (neighb[cK]->getTextureImgIndex() == imgIdx)) { myList.push_back(triIdx); triangleIdxSet.insert(triIdx); } } } } //cout << "myList.size() = " << myList.size() << endl; if (myList.size() > 1) //TODO: à retirer si on veut texturer les triangles isolés regions.push_back(myList); } /*cout << "****************** Resultat *********************" << endl; cout << endl; for (unsigned int aK=0; aK < regions.size() ; ++aK) { //first triangle of region aK: int triIdx = regions[aK][0]; cTriangle * Tri = getTriangle(triIdx); cout << "one region with " << regions[aK].size() << " triangles, for image " << Tri->getTextureImgIndex() << endl; }*/ return regions; }
GeometryBase::TriIndices DepthImage::getFaceTriIndices(unsigned int i) const { return GeometryBase::TriIndices(); if(i > getFacesNumber()) return GeometryBase::TriIndices(); int y = i / 2 / (width_ - 1); int x = i / 2 % (width_ - 1); int pos0 = y * width_ + x; int pos1 = y * width_ + x + 1; int pos2 = (y + 1) * width_ + x + 1; int pos3 = (y + 1) * width_ + x; if(i % 2 == 0) { return GeometryBase::TriIndices(pos0,pos1,pos2); } else { return GeometryBase::TriIndices(pos0,pos2,pos3); } }
cMesh::cMesh(const std::string & Filename, bool doAdjacence) { PlyFile * thePlyFile; int nelems; char **elist; int file_type; float version; int nprops; int num_elems; char *elem_name; thePlyFile = ply_open_for_reading( const_cast<char *>(Filename.c_str()), &nelems, &elist, &file_type, &version); ELISE_ASSERT(thePlyFile != NULL, "cMesh3D.cpp: cMesh::cMesh, cannot open ply file for reading"); for (int i = 0; i < nelems; i++) { elem_name = elist[i]; ply_get_element_description (thePlyFile, elem_name, &num_elems, &nprops); //printf ("element %s %d\n", elem_name, num_elems); if (equal_strings ("vertex", elem_name)) { ply_get_property (thePlyFile, elem_name, &props[0]); ply_get_property (thePlyFile, elem_name, &props[1]); ply_get_property (thePlyFile, elem_name, &props[2]); for (int j = 0; j < num_elems; j++) { sVertex *vert = (sVertex *) malloc (sizeof(sVertex)); ply_get_element (thePlyFile, vert); //ajout du point addPt(Pt3dr(vert->x, vert->y, vert->z)); //printf ("vertex: %g %g %g\n", vert->x, vert->y, vert->z); } } else if (equal_strings ("face", elem_name)) { ply_get_property ( thePlyFile, elem_name, &face_props[0]); for (int j = 0; j < num_elems; j++) { sFace *theFace = (sFace *) malloc (sizeof (sFace)); ply_get_element (thePlyFile, theFace); vector <int> vIndx; for (int aK =0; aK < theFace->nverts; ++aK) vIndx.push_back(theFace->verts[aK]); //ajout du triangle addTriangle(cTriangle(this, vIndx, j)); } } } if (doAdjacence) //remplissage du graphe d'adjacence { int cpt; int id0a, id1a, id2a; int id0b, id1b, id2b; int idc0, idc1; //index des sommets communs id0a = id1a = id2a = idc0 = idc1 = -1; id0b = id1b = id2b = -2; for (int aK = 0; aK < getFacesNumber(); ++aK) { mTriangles[aK].getVertexesIndexes(id0a, id1a, id2a); for (int bK=aK; bK < getFacesNumber(); ++bK) { mTriangles[bK].getVertexesIndexes(id0b, id1b, id2b); cpt = 0; if((id0b == id0a)||(id1b == id0a)||(id2b == id0a)) {cpt++; idc0 = id0a;} if((id0b == id1a)||(id1b == id1a)||(id2b == id1a)) { if (cpt) idc1 = id1a; else idc0 = id1a; cpt++; } if((id0b == id2a)||(id1b == id2a)||(id2b == id2a)) { if (cpt) idc1 = id2a; else idc0 = id2a; cpt++; } if (cpt == 2) { #ifdef _DEBUG printf ("found adjacent triangles : %d %d - vertex : %d %d\n", aK, bK, idc0, idc1); #endif addEdge(cEdge(aK, bK, idc0, idc1)); int idx = getEdgesNumber() - 1; //cout << "adding edge " << idx << endl; mTriangles[aK].addEdge(idx); mTriangles[bK].addEdge(idx); } } } } ply_close (thePlyFile); }