/**************************************************************************** * 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 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 " <