mesh.delete_face () вызвал abort () - PullRequest
       31

mesh.delete_face () вызвал abort ()

0 голосов
/ 24 октября 2018

Я пытался запустить приведенный ниже код, но получил ошибку при использовании mesh.delete_face (* it, false);

    vector<TriMesh::FaceHandle> terminalFaces;

    OpenMesh::FPropHandleT<int> faceType;
    OpenMesh::FPropHandleT<bool> faceChecked;
    mesh.add_property(faceType, "face-type");
    mesh.add_property(faceChecked, "face-checked");

    tFillFacesProperty(mesh, faceChecked, false);

    tClassifyFaces(mesh, faceType); 
    terminalFaces = tSplitJointFaces(mesh, faceType);   
    tClassifyFaces(mesh, faceType);
    tAdjustAllVertices(mesh);

    for (int i = 0; i < terminalFaces.size(); i++)
    {
        if (mesh.property(faceType, terminalFaces[i]) != FT_TERMINAL)
            continue;
        if (mesh.property(faceChecked, terminalFaces[i])) 
            continue;

        vector<TriMesh::VertexHandle> collectedVs; 
        vector<TriMesh::FaceHandle> collectedFs; 

        for (TriMesh::FaceVertexIter fvi = mesh.fv_begin(terminalFaces[i]); 
            fvi != mesh.fv_end(terminalFaces[i]);
            ++fvi)
        {
            if (mesh.valence(*fvi) == 2) {
                collectedVs.push_back(*fvi);   
                break;
            }
        }
        assert(collectedVs.size() == 1);

        while(1){
            bool mustStop = false;

            if (collectedFs.empty())
                collectedFs.push_back(terminalFaces[i]); 
            else {
                TriMesh::FaceHandle nextFh;
                for (TriMesh::FaceFaceIter ffi = mesh.ff_begin(collectedFs.back());
                    ffi != mesh.ff_end(collectedFs.back());
                    ++ffi)
                {
                    if ((find(collectedFs.begin(), collectedFs.end(), *ffi) == collectedFs.end())   
                        && mesh.is_valid_handle(*ffi)
                        && mesh.property(faceType, *ffi) != FT_NEW)
                    {
                        nextFh = *ffi;
                        break;
                    }
                }
                if (mesh.is_valid_handle(nextFh))
                    collectedFs.push_back(nextFh);
                else
                    mustStop = true;
            }
            TriMesh::FaceHandle curfh = collectedFs.back();
            mesh.property(faceChecked, curfh) = true; 
            int t = mesh.property(faceType, curfh);  
            if (t == FT_SLEEVE || t == FT_TERMINAL) {
                TriMesh::HalfedgeHandle hh2check;
                for (TriMesh::FaceHalfedgeIter fhi = mesh.fh_begin(curfh);  
                    fhi != mesh.fh_end(curfh);
                    ++fhi)
                {
                    TriMesh::FaceHandle oppof = mesh.opposite_face_handle(*fhi);
                    if (mesh.is_valid_handle(oppof)
                        && (find(collectedFs.begin(), collectedFs.end(),oppof) == collectedFs.end()))
                    {
                        hh2check = *fhi;
                        break;
                    }
                }
                assert(mesh.is_valid_handle(hh2check) && !mesh.is_boundary(hh2check));

                // add new vertices
                TriMesh::VertexHandle right, left;
                right = mesh.from_vertex_handle(hh2check);
                left = mesh.to_vertex_handle(hh2check); 
                assert(mesh.is_valid_handle(left) && mesh.is_valid_handle(right));
                if ((find(collectedVs.begin(), collectedVs.end(), left) == collectedVs.end())  
                    && mesh.is_valid_handle(left))
                    collectedVs.insert(collectedVs.begin(), left);
                if ((find(collectedVs.begin(), collectedVs.end(), right) == collectedVs.end())
                    && mesh.is_valid_handle(right))
                    collectedVs.push_back(right);

                bool inCircle = true;
                TriMesh::Point center = (mesh.point(right) + mesh.point(left)) / 2.0;
                double diamSq = tSqDist(mesh.point(right), mesh.point(left));
                for (int i = 1; i < collectedVs.size() - 1; i++)
                {
                    TriMesh::VertexHandle vh = collectedVs[i];
                    if (tSqDist(mesh.point(vh), center) * 4 > diamSq) {
                        inCircle = false;
                        break;
                    }
                }

                if (inCircle && !mustStop) {
                    continue;
                }
                else {

                    OpenMesh::IO::write_mesh(mesh, "outputtr.off");
                    for (vector<TriMesh::FaceHandle>::iterator it = collectedFs.begin(); it != collectedFs.end(); ++it){

                        mesh.delete_face(*it, false); 
                    }

Я использовал delete_face () в openmesh, чтобы удалить одну из граней в сетке.Однако при отладке всегда отображается abort () и панель ошибок, например:

R6010 -abort() has been called

, и точка останова была вызвана _CrtDbgBreak ():

case 1: _CrtDbgBreak(); msgshown = 1;

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

1 Ответ

0 голосов
/ 24 октября 2018

Просто добавьте "mesh.request_face_status ();"и решено.

...