From d23632a7d333a18da62485e0671454973345c88e Mon Sep 17 00:00:00 2001 From: nico Date: Wed, 25 Jan 2017 17:26:19 +0100 Subject: [PATCH] first example of small program that use polygonal optimization routines --- .../polygonmesh_optimize.cpp | 181 ++++++++++++++++++ .../polygonmesh_optimize.pro | 7 + 2 files changed, 188 insertions(+) create mode 100644 apps/sample/polygonmesh_optimize/polygonmesh_optimize.cpp create mode 100644 apps/sample/polygonmesh_optimize/polygonmesh_optimize.pro diff --git a/apps/sample/polygonmesh_optimize/polygonmesh_optimize.cpp b/apps/sample/polygonmesh_optimize/polygonmesh_optimize.cpp new file mode 100644 index 00000000..93a730a2 --- /dev/null +++ b/apps/sample/polygonmesh_optimize/polygonmesh_optimize.cpp @@ -0,0 +1,181 @@ +/**************************************************************************** +* VCGLib o o * +* Visual and Computer Graphics Library o o * +* _ O _ * +* Copyright(C) 2004-2016 \/)\/ * +* Visual Computing Lab /\/| * +* ISTI - Italian National Research Council | * +* \ * +* All rights reserved. * +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * +* for more details. * +* * +****************************************************************************/ + +#include + +/*include the algorithms for updating: */ +#include +#include +#include + +#include +#include + +#include +#include + +#include + +#include + +#include + +#include + +using namespace vcg; +using namespace std; + +// forward declarations +class TFace; +class TVertex; + +struct TUsedTypes: public vcg::UsedTypes< vcg::Use::AsVertexType, vcg::Use::AsFaceType >{}; + +/* Definition of a mesh of triangles +*/ +class TVertex : public Vertex< TUsedTypes, + vertex::BitFlags, + vertex::Coord3f, + vertex::Normal3f, + vertex::Mark >{}; + +class TFace : public Face< TUsedTypes, + face::VertexRef, // three pointers to vertices + face::Normal3f, // normal + face::BitFlags, // flags + face::FFAdj // three pointers to adjacent faces +> {}; + +/* the mesh is a container of vertices and a container of faces */ +class TMesh : public vcg::tri::TriMesh< vector, vector > {}; + + +/* Definition of a mesh of polygons that also supports half-edges +*/ +class PFace; +class PVertex; + +struct PUsedTypes: public vcg::UsedTypes ::AsVertexType, + vcg::Use ::AsFaceType>{}; + +class PVertex:public vcg::Vertex< PUsedTypes, + vcg::vertex::Coord3f, + vcg::vertex::Normal3f, + vcg::vertex::Mark, + vcg::vertex::BitFlags>{} ; + +class PFace:public vcg::Face< + PUsedTypes + ,vcg::face::PolyInfo // this is necessary if you use component in vcg/simplex/face/component_polygon.h + // It says "this class is a polygon and the memory for its components (e.g. pointer to its vertices + // will be allocated dynamically") + ,vcg::face::PFVAdj // Pointer to the vertices (just like FVAdj ) + ,vcg::face::PFVAdj + ,vcg::face::PFFAdj // Pointer to edge-adjacent face (just like FFAdj ) + ,vcg::face::BitFlags // bit flags + ,vcg::face::Normal3f // normal + ,face::Qualityd // face quality +> {}; + +class PMesh: public + vcg::tri::TriMesh< + std::vector, // the vector of vertices + std::vector // the vector of faces + >{}; + +TMesh primalT; +PMesh primal,dual,dual_opt,dual_flat; + +int main(int argc, char *argv[]) +{ + assert(argc>1); + + std::cout<<"Opening file " << argv[0] << std::endl; + + int res=vcg::tri::io::ImporterPLY::Open(primalT,argv[1]); + assert(res==vcg::ply::E_NOERROR); + vcg::tri::PolygonSupport::ImportFromTriMesh(primal,primalT); + + vcg::tri::DualMeshing::MakeDual(primal,dual); + vcg::tri::io::ExporterOBJ::Save(dual,"./dual_no_optimized.obj",vcg::tri::io::Mask::IOM_BITPOLYGONAL); + + //copy the mesh + vcg::tri::Append::Mesh(dual_opt,dual); + vcg::tri::Append::Mesh(dual_flat,dual); + + vcg::PolygonalAlgorithm::SmoothReprojectPCA(dual_opt); + + vcg::tri::io::ExporterOBJ::Save(dual_opt,"./dual_optimized.obj",vcg::tri::io::Mask::IOM_BITPOLYGONAL); + + vcg::PolygonalAlgorithm::FlattenFaces(dual_flat); + vcg::tri::io::ExporterOBJ::Save(dual_flat,"./dual_flattened.obj",vcg::tri::io::Mask::IOM_BITPOLYGONAL); + + //update the quality as template + std::pair minmax_dual,minmax_dual_opt,minmax_dual_flat; + typename PMesh::ScalarType Avg_dual,Avg_dual_opt,Avg_dual_flat; + + vcg::PolygonalAlgorithm::UpdateQuality(dual,PolygonalAlgorithm::QTemplate); + minmax_dual=tri::Stat::ComputePerFaceQualityMinMax(dual); + Avg_dual=tri::Stat::ComputePerFaceQualityAvg(dual); + + vcg::PolygonalAlgorithm::UpdateQuality(dual_opt,PolygonalAlgorithm::QTemplate); + minmax_dual_opt=tri::Stat::ComputePerFaceQualityMinMax(dual_opt); + Avg_dual_opt=tri::Stat::ComputePerFaceQualityAvg(dual_opt); + + vcg::PolygonalAlgorithm::UpdateQuality(dual_flat,PolygonalAlgorithm::QTemplate); + minmax_dual_flat=tri::Stat::ComputePerFaceQualityMinMax(dual_flat); + Avg_dual_flat=tri::Stat::ComputePerFaceQualityAvg(dual_flat); + + std::cout<::UpdateQuality(dual,PolygonalAlgorithm::QPlanar); + minmax_dual=tri::Stat::ComputePerFaceQualityMinMax(dual); + Avg_dual=tri::Stat::ComputePerFaceQualityAvg(dual); + + vcg::PolygonalAlgorithm::UpdateQuality(dual_opt,PolygonalAlgorithm::QPlanar); + minmax_dual_opt=tri::Stat::ComputePerFaceQualityMinMax(dual_opt); + Avg_dual_opt=tri::Stat::ComputePerFaceQualityAvg(dual_opt); + + vcg::PolygonalAlgorithm::UpdateQuality(dual_flat,PolygonalAlgorithm::QPlanar); + minmax_dual_flat=tri::Stat::ComputePerFaceQualityMinMax(dual_flat); + Avg_dual_flat=tri::Stat::ComputePerFaceQualityAvg(dual_flat); + + std::cout<<"Flatness Quality No Optimized min / max " <