Subversion Repositories gelsvn

Rev

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

/*
* Written by Christian Thode Larsen 2009-2010
* Contact: thode2d@gmail.com
* Based on original work by J. Andreas Baerentzen
* Inspired by OpenMesh (www.openmesh.org)
*/

#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.no_halfedges();
        }

        int refine_edges(Manifold& m, float t)
        {
                int work = 0;
                vector<HalfEdgeID> hedges;
                HalfEdgeAttributeVector<int> touched(m, 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().valid() || 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.valid())
                                m.split_face_by_vertex(f1);

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

                }
                return work;
        }

}