Количество обнаруженных самопересечений в vcglib не совпадает с числом Meshlab - PullRequest
0 голосов
/ 11 июня 2018

Когда я выполняю свою программу

C: \ Users \ me \ Documents \ projectCGALII \ build \ Debug> test.exe pig.obj

Я получаю 6пересечения, и когда это проверено в Meshlab это говорит 4 пересечения.Это моя программа:

void  countSelfIntersection(const char* filename)
{
    OpenMesh(filename, pm);
    vcg::tri::UpdateTopology<PMesh>::FaceFace(pm);
    std::vector<PMesh::FaceType *> intersections;
    bool SelfIntersect = tri::Clean<PMesh>::SelfIntersections(pm, intersections);

    std::cout << "Count Intersection: " << intersections.size() << std::endl;

    for (std::vector<PMesh::FaceType *>::iterator it = intersections.begin(); it != intersections.end(); it++)
    {
        PMesh::FaceType *face = *it;
        for (int i = 0; i < 3; ++i)
        {
            std::cout << "Vertex(" <<i<<")"<< std::dec <<(int) face->cV0(i) << " " << std::dec << (int)face->cV1(i) << " " << std::dec << (int)face->cV2(i) << std::endl;
        }

        std::cout<<std::endl;


    }

}


int main(int argc, char* argv[])
{
    nonManinfoldEdge(argv[1]);
    return 0;
}

Прикрепленный файл pig.obj здесь:

https://drive.google.com/open?id=1fEqZft_OhHxTsAvio58_TWOtvrYbGCOA

повторяются ли грани в результате?Как получить правильный результат, как это делает меш мешка?Какой лучший способ напечатать свойства каждой грани или вершин, чтобы проверить, существуют ли некоторые повторяющиеся грани?Как убрать повторяющиеся грани, если они существуют?

1 Ответ

0 голосов
/ 12 июня 2018

Решено!

int countSelfIntersections(PMesh &pm)
{
    vcg::tri::UpdateTopology<PMesh>::FaceFace(pm);
    std::vector<PFace *> intersections;
    bool SelfIntersect = tri::Clean<PMesh>::SelfIntersections(pm, intersections);
    tri::UpdateSelection<PMesh>::FaceClear(pm);

    for (std::vector<PFace*>::iterator it = intersections.begin(); it != intersections.end(); it++)
    {
        PFace *face = *it;
        face->SetS();
    }

    PMesh::FaceIterator f;
    f = pm.face.begin();
    std::vector<PFace*> sf;
    for (; f != pm.face.end(); ++f)
    {
        if (f->IsS())
        {
            sf.push_back(&(*f));
        }
    }

    return sf.size();
}
...