/**************************************************************************** * 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. * * * ****************************************************************************/ #ifndef __VCGLIB_DUAL_MESH #define __VCGLIB_DUAL_MESH #include #include #include #include #include namespace vcg { namespace tri { template class DualMeshing { typedef typename PolyMeshType::VertexType VertexType; typedef typename PolyMeshType::FaceType FaceType; typedef typename PolyMeshType::CoordType CoordType; typedef typename PolyMeshType::ScalarType ScalarType; static void ComposeFace(VertexType &startV, FaceType &startF, std::map, int> &EdgeMap, const std::vector &FaceMap, const PolyMeshType &primal, std::vector &vertSeq) { (void)EdgeMap; vcg::face::Pos startP(&startF,&startV); //get the star of pos std::vector > posVec; vcg::face::VFOrderedStarFF(startP,posVec); for (size_t i=0;i &VertMap, std::vector &VertFace, bool snapBorder) { VertMap.clear(); VertMap.resize(primal.face.size(),-1); VertFace.clear(); VertFace.resize(primal.vert.size(),-1); for (size_t i=0;iIsB())continue; pos+=primal.face[i].P(j); num++; } if (num>0) pos/=num; } if (num==0) { for (int j=0;jP(); } pos/=(ScalarType)primal.face[i].VN(); } vcg::tri::Allocator::AddVertex(dual,pos); VertMap[i]=dual.vert.size()-1; dual.vert.back().Q()=i; } //then initialize VF first face for (size_t i=0;i::FaceFace(primal); vcg::tri::UpdateFlags::VertexBorderFromFaceAdj(primal); std::map, int> VertEdgeMap; std::cout<<"Creating Dual Vertices"< VertFaceMap,VertFace; CreateFaceVert(primal,dual,VertFaceMap,VertFace,snapBorder); std::cout<<"Creating Dual Faces"< VertSeq; ComposeFace(primal.vert[i],*firstF,VertEdgeMap,VertFaceMap,primal,VertSeq); vcg::tri::Allocator::AddFaces(dual,1); dual.face.back().Alloc(VertSeq.size()); for (size_t j=0;j::RemoveUnreferencedVertex(dual); //finally remove valence 1 vertices on the border vcg::PolygonalAlgorithm::RemoveValence2Vertices(dual); } }; } } #endif // __VCGLIB_DUAL_MESH