24 #include<vcg/space/triangle3.h>
25 #include<vcg/complex/complex.h>
26 #include<vcg/complex/algorithms/hole.h>
27 #include<vcg/complex/algorithms/local_optimization.h>
28 #include<vcg/complex/algorithms/local_optimization/tri_edge_flip.h>
29 #include<vcg/complex/algorithms/smooth.h>
30 #include<vcg/complex/algorithms/refine.h>
33 #include <wrap/io_trimesh/import_ply.h>
34 #include <wrap/io_trimesh/export_ply.h>
41 struct MyUsedTypes :
public UsedTypes< Use<MyVertex> ::AsVertexType,
42 Use<MyFace> ::AsFaceType>{};
44 class MyVertex :
public Vertex< MyUsedTypes, vertex::Coord3f, vertex::BitFlags, vertex::Normal3f, vertex::Mark, vertex::Color4b >{};
45 class MyFace :
public Face < MyUsedTypes, face::VertexRef,face::FFAdj, face::Mark, face::BitFlags, face::Normal3f> {};
47 class MyMesh :
public tri::TriMesh< vector<MyVertex>, vector<MyFace > >{};
50 class MyDelaunayFlip:
public vcg::tri::TriEdgeFlip< MyMesh, MyDelaunayFlip > {
52 typedef vcg::tri::TriEdgeFlip< MyMesh, MyDelaunayFlip > TEF;
53 inline MyDelaunayFlip(
const TEF::PosType &p,
int i,BaseParameterClass *pp) :TEF(p,i,pp){}
56 bool callback(
int percent,
const char *str) {
57 cout <<
"str: " << str <<
" " << percent <<
"%\r";
62 bool NormalTest(
typename face::Pos<typename MESH::FaceType> pos)
65 typename MESH::ScalarType thr = 0.0f;
66 typename MESH::CoordType NdP = vcg::TriangleNormal<typename MESH::FaceType>(*pos.f);
67 typename MESH::CoordType tmp, oop, soglia =
typename MESH::CoordType(thr,thr,thr);
68 face::Pos<typename MESH::FaceType> aux=pos;
72 oop = Abs(tmp - ::vcg::TriangleNormal<typename MESH::FaceType>(*pos.f));
73 if(oop < soglia )
return false;
74 }
while(aux != pos && !aux.IsBorder());
79 int main(
int argc,
char ** argv){
84 "\n HoleFilling (" __DATE__
")\n"
85 "Visual Computing Group I.S.T.I. C.N.R.\n"
86 "Usage: trimesh_hole #algorithm #size filein.ply fileout.ply \n"
89 " 2) Minimum weight Ear \n"
90 " 3) Selfintersection Ear \n"
91 " 4) Minimum weight \n"
96 int algorithm = atoi(argv[1]);
97 int holeSize = atoi(argv[2]);
98 if(algorithm < 0 && algorithm > 4)
100 printf(
"Error in algorithm's selection %i\n",algorithm);
106 if(tri::io::ImporterPLY<MyMesh>::Open(m,argv[3])!=0)
108 printf(
"Error reading file %s\n",argv[2]);
121 indice = m.face.size();
122 MyMesh::FaceIterator fi;
123 for(fi=m.face.begin();fi!=m.face.end();++fi)
125 sumA += DoubleArea(*fi)/2;
127 for(
int ind =0;ind<3;++ind)
128 fi->V(ind)->InitIMark();
135 case 1: tri::Hole<MyMesh>::EarCuttingFill<tri::TrivialEar<MyMesh> >(m,holeSize,
false);
break;
136 case 2: tri::Hole<MyMesh>::EarCuttingFill<tri::MinimumWeightEar< MyMesh> >(m,holeSize,
false,callback);
break;
137 case 3: tri::Hole<MyMesh>::EarCuttingIntersectionFill<tri::SelfIntersectionEar< MyMesh> >(m,holeSize,
false);
break;
145 printf(
"\nStart refinig...\n");
148 MyMesh::VertexIterator vi;
149 MyMesh::FaceIterator f;
150 std::vector<MyMesh::FacePointer> vf;
153 for(; f != m.face.end();++f)
161 std::vector<MyMesh::FacePointer *> FPP;
162 std::vector<MyMesh::FacePointer> added;
163 std::vector<MyMesh::FacePointer>::iterator vfit;
167 for(f = m.face.begin();f!=m.face.end();++f)
if(!(*f).IsD())
182 BaseParameterClass pp;
183 vcg::LocalOptimization<MyMesh> Fs(m,&pp);
184 Fs.SetTargetMetric(0.0f);
185 Fs.Init<MyDelaunayFlip >();
194 for(; f != m.face.end();++f)
199 for(
int ind =0;ind<3;++ind)
200 f->V(ind)->InitIMark();
201 test = (DoubleArea<MyMesh::FaceType>(*f)/2) > AVG;
210 printf(
"\r Refining [%d] - > %d",i,
int(vf.size()));
216 for(vfit = vf.begin(); vfit!=vf.end();++vfit)
218 FPP.push_back(&(*vfit));
220 int toadd= vf.size();
221 MyMesh::FaceIterator f1,f2;
224 std::vector<MyMesh::FacePointer> added;
225 added.reserve(toadd);
228 for(
int i = 0; i<toadd;++i,f2++,vertp++)
232 TriSplit<MyMesh,CenterPointBarycenter<MyMesh> >::Apply(vf[i],&(*f1),&(*f2),&(*vertp),CenterPointBarycenter<MyMesh>() );
235 for(
int itr=0;itr<3;itr++)
240 added.push_back( &(*f1) );
241 added.push_back( &(*f2) );
244 BaseParameterClass pp;
245 vcg::LocalOptimization<MyMesh> FlippingSession(m,&pp);
246 FlippingSession.SetTargetMetric(0.0f);
247 FlippingSession.Init<MyDelaunayFlip >();
248 FlippingSession.DoOptimization();
252 vcg::LocalOptimization<MyMesh> Fiss(m,&pp);
253 Fiss.SetTargetMetric(0.0f);
254 Fiss.Init<MyDelaunayFlip >();
255 Fiss.DoOptimization();
259 tri::io::ExporterPLY<MyMesh>::Save(m,
"PreSmooth.ply",
false);
261 int UBIT = MyMesh::VertexType::NewBitFlag();
264 for(; f != m.face.end();++f)
268 for(
int ind =0;ind<3;++ind){
269 if(NormalTest<MyMesh>(face::Pos<MyMesh::FaceType>(&(*f),ind )))
271 f->V(ind)->SetUserBit(UBIT);
278 for(vi=m.vert.begin();vi!=m.vert.end();++vi)
if(!(*vi).IsD())
280 if( vi->IsUserBit(UBIT) )
283 vi->ClearUserBit(UBIT);
287 tri::Smooth<MyMesh>::VertexCoordLaplacian(m,1,
true);
289 printf(
"\nCompleted. Saving....\n");
291 tri::io::ExporterPLY<MyMesh>::Save(m,argv[4],
false);