24 #include <vcg/complex/complex.h>
27 #include <vcg/complex/algorithms/update/bounding.h>
28 #include <vcg/complex/algorithms/update/normal.h>
30 #include <vcg/complex/algorithms/clean.h>
31 #include <vcg/complex/algorithms/create/platonic.h>
33 #include <wrap/io_trimesh/export_obj.h>
34 #include <wrap/io_trimesh/import_ply.h>
36 #include <vcg/complex/algorithms/dual_meshing.h>
38 #include <vcg/complex/algorithms/polygon_support.h>
40 #include <vcg/complex/algorithms/polygonal_algorithms.h>
42 #include <vcg/complex/algorithms/update/quality.h>
51 struct TUsedTypes:
public vcg::UsedTypes< vcg::Use<TVertex>::AsVertexType, vcg::Use<TFace>::AsFaceType >{};
55 class TVertex :
public Vertex< TUsedTypes,
61 class TFace :
public Face< TUsedTypes,
69 class TMesh :
public vcg::tri::TriMesh< vector<TVertex>, vector<TFace> > {};
77 struct PUsedTypes:
public vcg::UsedTypes<vcg::Use<PVertex> ::AsVertexType,
78 vcg::Use<PFace> ::AsFaceType>{};
80 class PVertex:
public vcg::Vertex< PUsedTypes,
82 vcg::vertex::Normal3f,
84 vcg::vertex::BitFlags>{} ;
86 class PFace:
public vcg::Face<
101 std::vector<PVertex>,
106 PMesh primal,dual,dual_opt,dual_flat;
108 int main(
int argc,
char *argv[])
112 std::cout<<
"Opening file " << argv[0] << std::endl;
114 int res=vcg::tri::io::ImporterPLY<TMesh>::Open(primalT,argv[1]);
115 assert(res==vcg::ply::E_NOERROR);
116 vcg::tri::PolygonSupport<TMesh,PMesh>::ImportFromTriMesh(primal,primalT);
118 vcg::tri::DualMeshing<PMesh>::MakeDual(primal,dual);
119 vcg::tri::io::ExporterOBJ<PMesh>::Save(dual,
"./dual_no_optimized.obj",vcg::tri::io::Mask::IOM_BITPOLYGONAL);
125 vcg::PolygonalAlgorithm<PMesh>::SmoothReprojectPCA(dual_opt);
127 vcg::tri::io::ExporterOBJ<PMesh>::Save(dual_opt,
"./dual_optimized.obj",vcg::tri::io::Mask::IOM_BITPOLYGONAL);
129 vcg::PolygonalAlgorithm<PMesh>::FlattenFaces(dual_flat);
130 vcg::tri::io::ExporterOBJ<PMesh>::Save(dual_flat,
"./dual_flattened.obj",vcg::tri::io::Mask::IOM_BITPOLYGONAL);
133 std::pair<typename PMesh::ScalarType,typename PMesh::ScalarType> minmax_dual,minmax_dual_opt,minmax_dual_flat;
134 typename PMesh::ScalarType Avg_dual,Avg_dual_opt,Avg_dual_flat;
136 vcg::PolygonalAlgorithm<PMesh>::UpdateQuality(dual,PolygonalAlgorithm<PMesh>::QTemplate);
137 minmax_dual=tri::Stat<PMesh>::ComputePerFaceQualityMinMax(dual);
138 Avg_dual=tri::Stat<PMesh>::ComputePerFaceQualityAvg(dual);
140 vcg::PolygonalAlgorithm<PMesh>::UpdateQuality(dual_opt,PolygonalAlgorithm<PMesh>::QTemplate);
141 minmax_dual_opt=tri::Stat<PMesh>::ComputePerFaceQualityMinMax(dual_opt);
142 Avg_dual_opt=tri::Stat<PMesh>::ComputePerFaceQualityAvg(dual_opt);
144 vcg::PolygonalAlgorithm<PMesh>::UpdateQuality(dual_flat,PolygonalAlgorithm<PMesh>::QTemplate);
145 minmax_dual_flat=tri::Stat<PMesh>::ComputePerFaceQualityMinMax(dual_flat);
146 Avg_dual_flat=tri::Stat<PMesh>::ComputePerFaceQualityAvg(dual_flat);
148 std::cout<<std::endl<<std::endl<<
"Template Quality No Optimized min / max " <<minmax_dual.first<<
" / "<<minmax_dual.second<<std::endl;
149 std::cout<<
"Template Quality Optimized min / max " <<minmax_dual_opt.first<<
" / "<<minmax_dual_opt.second<<std::endl;
150 std::cout<<
"Template Quality Flattened min / max " <<minmax_dual_flat.first<<
" / "<<minmax_dual_flat.second<<std::endl<<std::endl;
152 std::cout<<
"Template Quality No Optimized Average " <<Avg_dual<<std::endl;
153 std::cout<<
"Template Quality Optimized Average " <<Avg_dual_opt<<std::endl;
154 std::cout<<
"Template Quality Flattened Average " <<Avg_dual_flat<<std::endl<<std::endl<<std::endl<<std::endl;
157 vcg::PolygonalAlgorithm<PMesh>::UpdateQuality(dual,PolygonalAlgorithm<PMesh>::QPlanar);
158 minmax_dual=tri::Stat<PMesh>::ComputePerFaceQualityMinMax(dual);
159 Avg_dual=tri::Stat<PMesh>::ComputePerFaceQualityAvg(dual);
161 vcg::PolygonalAlgorithm<PMesh>::UpdateQuality(dual_opt,PolygonalAlgorithm<PMesh>::QPlanar);
162 minmax_dual_opt=tri::Stat<PMesh>::ComputePerFaceQualityMinMax(dual_opt);
163 Avg_dual_opt=tri::Stat<PMesh>::ComputePerFaceQualityAvg(dual_opt);
165 vcg::PolygonalAlgorithm<PMesh>::UpdateQuality(dual_flat,PolygonalAlgorithm<PMesh>::QPlanar);
166 minmax_dual_flat=tri::Stat<PMesh>::ComputePerFaceQualityMinMax(dual_flat);
167 Avg_dual_flat=tri::Stat<PMesh>::ComputePerFaceQualityAvg(dual_flat);
169 std::cout<<
"Flatness Quality No Optimized min / max " <<minmax_dual.first<<
" / "<<minmax_dual.second<<std::endl;
170 std::cout<<
"Flatness Quality Optimized min / max " <<minmax_dual_opt.first<<
" / "<<minmax_dual_opt.second<<std::endl;
171 std::cout<<
"Flatness Quality Flattened min / max " <<minmax_dual_flat.first<<
" / "<<minmax_dual_flat.second<<std::endl<<std::endl;
173 std::cout<<
"Flatness Quality No Optimized Average " <<Avg_dual<<std::endl;
174 std::cout<<
"Flatness Quality Optimized Average " <<Avg_dual_opt<<std::endl;
175 std::cout<<
"Flatness Quality Flattened Average " <<Avg_dual_flat<<std::endl;