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;
}
}