Subversion Repositories gelsvn

Rev

Rev 515 | Rev 572 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/* ----------------------------------------------------------------------- *
 * This file is part of GEL, www.imm.dtu.dk/GEL
 * Copyright (C) the authors (see AUTHORS.txt) and DTU Informatics
 *
 * Principal authors:
 *  Christian Thode Larsen (thode2d@gmail.com)
 *  J. Andreas Baerentzen (jab@imm.dtu.dk)
 *
 * See LICENSE.txt for licensing information
 * ----------------------------------------------------------------------- */

#include "refine_edges.h"

#include <vector>

#include "Manifold.h"
#include "AttributeVector.h"

namespace HMesh
{
    using namespace std;

    float average_edge_length(Manifold& m)
    {
        float lsum = 0;
        for(HalfEdgeIDIterator h = m.halfedges_begin(); h != m.halfedges_end(); ++h)
            lsum += length(m, *h);
        return lsum / m.active_halfedges();
    }

    int refine_edges(Manifold& m, float t)
    {
        int work = 0;
        vector<HalfEdgeID> hedges;
        HalfEdgeAttributeVector<int> touched(m.total_halfedges(), 0);

        for(HalfEdgeIDIterator h = m.halfedges_begin(); h != m.halfedges_end(); ++h)
            hedges.push_back(*h);

        for(vector<HalfEdgeID>::iterator h = hedges.begin(); h != hedges.end(); ++h){
            HalfEdgeWalker w = m.halfedgewalker(*h);

            if(w.face() == InvalidFaceID || length(m, *h) < t || touched[*h])
                continue;

            ++work;
            touched[w.opp().halfedge()] = 1;
            VertexID v = m.split_edge(*h);

            HalfEdgeWalker wv = m.halfedgewalker(v);

            HalfEdgeID h1 = wv.opp().halfedge();
            HalfEdgeID h2 = wv.prev().halfedge();

            FaceID f1 = wv.opp().face();
            if(f1 != InvalidFaceID)
                m.split_face_by_vertex(f1);

            FaceID f2 =  wv.prev().face();
            if(f2 != InvalidFaceID)
                m.split_face_by_vertex(f2);

        }
        return work;
    }

}