Exemple #1
0
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);

            }
        }
    }
}
Exemple #2
0
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;
}
Exemple #3
0
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);
    }
}
Exemple #4
0
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);
}