last changes to curve_on_manifold
This commit is contained in:
parent
32d500be36
commit
a437952298
|
@ -83,7 +83,7 @@ public:
|
||||||
void Default(MeshType &m)
|
void Default(MeshType &m)
|
||||||
{
|
{
|
||||||
surfDistThr = m.bbox.Diag()/50000.0;
|
surfDistThr = m.bbox.Diag()/50000.0;
|
||||||
polyDistThr = m.bbox.Diag()/1000.0;
|
polyDistThr = m.bbox.Diag()/5000.0;
|
||||||
minRefEdgeLen = m.bbox.Diag()/16000.0;
|
minRefEdgeLen = m.bbox.Diag()/16000.0;
|
||||||
maxSimpEdgeLen = m.bbox.Diag()/10000.0;
|
maxSimpEdgeLen = m.bbox.Diag()/10000.0;
|
||||||
maxSmoothDelta = m.bbox.Diag()/100.0;
|
maxSmoothDelta = m.bbox.Diag()/100.0;
|
||||||
|
@ -176,7 +176,82 @@ public:
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CleanSpuriousDanglingEdges(MeshType &poly)
|
||||||
|
{
|
||||||
|
|
||||||
|
EdgeGrid edgeGrid;
|
||||||
|
edgeGrid.Set(poly.edge.begin(), poly.edge.end());
|
||||||
|
std::vector< std::pair<VertexType *, VertexType *> > mergeVec;
|
||||||
|
UpdateFlags<MeshType>::FaceClearV(base);
|
||||||
|
UpdateTopology<MeshType>::FaceFace(base);
|
||||||
|
for(int i=0;i<base.fn;++i)
|
||||||
|
{
|
||||||
|
FaceType *fp=&base.face[i];
|
||||||
|
if(!fp->IsV())
|
||||||
|
{
|
||||||
|
for(int j=0;j<3;++j)
|
||||||
|
if(face::IsBorder(*fp,j))
|
||||||
|
{
|
||||||
|
face::Pos<FaceType> startPos(fp,int(j));
|
||||||
|
assert(startPos.IsBorder());
|
||||||
|
face::Pos<FaceType> curPos=startPos;
|
||||||
|
face::Pos<FaceType> prevPos=startPos;
|
||||||
|
int edgeCnt=0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
prevPos=curPos;
|
||||||
|
curPos.F()->SetV();
|
||||||
|
curPos.NextB();
|
||||||
|
edgeCnt++;
|
||||||
|
if(Distance(curPos.V()->P(),prevPos.VFlip()->P())<0.000000001f)
|
||||||
|
{
|
||||||
|
Point3f endp = curPos.VFlip()->P();
|
||||||
|
float minDist=par.gridBailout;
|
||||||
|
Point3f closestP;
|
||||||
|
EdgeType *cep = vcg::tri::GetClosestEdgeBase(poly,edgeGrid,endp,par.gridBailout,minDist,closestP);
|
||||||
|
if(minDist > par.polyDistThr){
|
||||||
|
mergeVec.push_back(std::make_pair(curPos.V(),prevPos.VFlip()));
|
||||||
|
printf("Vertex %i and %i should be merged\n",tri::Index(base,curPos.V()),tri::Index(base,prevPos.VFlip()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} while(curPos!=startPos);
|
||||||
|
printf("walked along a border of %i edges\n",edgeCnt);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("Found %i vertex pairs to be merged\n",mergeVec.size());
|
||||||
|
for(int k=0;k<mergeVec.size();++k)
|
||||||
|
{
|
||||||
|
VertexType *vdel=mergeVec[k].first;
|
||||||
|
VertexType *vmerge=mergeVec[k].second;
|
||||||
|
for(int i=0;i<base.fn;++i)
|
||||||
|
{
|
||||||
|
FaceType *fp=&base.face[i];
|
||||||
|
for(int j=0;j<3;++j)
|
||||||
|
if(fp->V(j)==vdel) fp->V(j)=vmerge;
|
||||||
|
}
|
||||||
|
Allocator<MeshType>::DeleteVertex(base,*vdel);
|
||||||
|
}
|
||||||
|
Allocator<MeshType>::CompactEveryVector(base);
|
||||||
|
|
||||||
|
|
||||||
|
for(int i=0;i<base.fn;++i)
|
||||||
|
{
|
||||||
|
FaceType *fp=&base.face[i];
|
||||||
|
for(int j=0;j<3;++j)
|
||||||
|
if(fp->V0(j)==fp->V1(j))
|
||||||
|
{
|
||||||
|
Allocator<MeshType>::DeleteFace(base,*fp);
|
||||||
|
printf("Deleted face %i\n",tri::Index(base,fp));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
Allocator<MeshType>::CompactEveryVector(base);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
//
|
//
|
||||||
void BuildVisitTree(MeshType &dualMesh)
|
void BuildVisitTree(MeshType &dualMesh)
|
||||||
{
|
{
|
||||||
|
@ -579,8 +654,10 @@ public:
|
||||||
// printf("Added %i vertices\n",newVertVec.size());
|
// printf("Added %i vertices\n",newVertVec.size());
|
||||||
// for(int i=0;i<newVertVec.size();++i)
|
// for(int i=0;i<newVertVec.size();++i)
|
||||||
// base.vert[newVertVec[i]].C()=Color4b::Red;
|
// base.vert[newVertVec[i]].C()=Color4b::Red;
|
||||||
|
|
||||||
tri::io::ExporterPLY<MeshType>::Save(base,"base_cut.ply",tri::io::Mask::IOM_VERTCOLOR + tri::io::Mask::IOM_VERTQUALITY );
|
tri::io::ExporterPLY<MeshType>::Save(base,"base_cut.ply",tri::io::Mask::IOM_VERTCOLOR + tri::io::Mask::IOM_VERTQUALITY );
|
||||||
|
CleanSpuriousDanglingEdges(poly);
|
||||||
|
tri::io::ExporterPLY<MeshType>::Save(base,"base_cut_clean.ply",tri::io::Mask::IOM_VERTCOLOR + tri::io::Mask::IOM_VERTQUALITY );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue