From 69ebba04b996d4244e5ef438584cd60ee7025328 Mon Sep 17 00:00:00 2001 From: ganovelli Date: Mon, 27 Oct 2008 16:54:32 +0000 Subject: [PATCH] Created. PolygonSupport provides the functions to import a trimesh from a polygonal mesh and viceversa. --- vcg/complex/trimesh/polygon_support.h | 143 ++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 vcg/complex/trimesh/polygon_support.h diff --git a/vcg/complex/trimesh/polygon_support.h b/vcg/complex/trimesh/polygon_support.h new file mode 100644 index 00000000..ecf690f0 --- /dev/null +++ b/vcg/complex/trimesh/polygon_support.h @@ -0,0 +1,143 @@ +/**************************************************************************** +* VCGLib o o * +* Visual and Computer Graphics Library o o * +* _ O _ * +* Copyright(C) 2004 \/)\/ * +* 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_POLYGON_SUPPORT +#define __VCGLIB_POLYGON_SUPPORT + +#include +#include +#include +#include + +namespace vcg +{ + namespace tri{ + /// \ingroup trimesh + + /// \headerfile polygon_support.h vcg/complex/trimesh/polygon_support.h + + /// \brief This class is used convert between polygonal meshes and triangular meshes + + /** + This class contains two members that allow to build a triangular mesh from a polygonal mesh + and viceversa. In a trimesh, the generic polygons with n sides are codified represented by tagging the internal edge of the face + with the SetF. + */ + + template + struct PolygonSupport{ + + /** + Import a trianglemesh from a polygon mesh + **/ + static void ImportFromPolyMesh(TriMeshType & tm, PolyMeshType & pm){ + std::vector points; + std::vector faces; + + // the vertices are the same, simply import them + typename PolyMeshType::VertexIterator vi; + typename TriMeshType::FaceIterator tfi,tfib ; + typename TriMeshType ::VertexIterator tvi = Allocator::AddVertices(tm,pm.vn); + for(tvi = tm.vert.begin(),vi = pm.vert.begin(); tvi != tm.vert.end(); ++tvi,++vi)(*tvi).ImportLocal(*vi); + + typename PolyMeshType::FaceIterator fi; + for(fi = pm.face.begin(); fi != pm.face.end(); ++fi){ + points.clear(); + for(int i = 0; i < (*fi).VN(); ++i) { + typename PolyMeshType::VertexType * v = (*fi).V(i); + points.push_back(v->P()); + } + faces.clear(); + TessellatePlanarPolygon3(points,faces); + tfib = tfi = Allocator::AddFaces(tm,faces.size()/3); + for(int i = 0; tfi != tm.face.end();++tfi){ + (*tfi).V(0) = &tm.vert[ (*fi).V( faces[i] ) - &(*pm.vert.begin())]; + (*tfi).V(1) = &tm.vert[ (*fi).V( faces[i+1]) - &(*pm.vert.begin())]; + (*tfi).V(2) = &tm.vert[ (*fi).V( faces[i+2]) - &(*pm.vert.begin())]; + // set the F flags + if( (faces[i]+1)%points.size() != faces[i+1]) (*tfi).SetF(0); + if( (faces[i+1]+1)%points.size() != faces[i+2]) (*tfi).SetF(1); + if( (faces[i+2]+1)%points.size() != faces[i]) (*tfi).SetF(2); + i+=3; + } + + } + } + + + /** + Import a polygon mesh from a triangle mesh + **/ + static void ImportFromTriMesh( PolyMeshType & pm, TriMeshType & tm){ + + // the vertices are the same, simply import them + int cnt = 0; + typename TriMeshType ::ConstVertexIterator tvi; + typename PolyMeshType::VertexIterator vi = vcg::tri::Allocator::AddVertices(pm,tm.vert.size()); + for(tvi = tm.vert.begin(); tvi != tm.vert.end(); ++tvi,++vi,++cnt) if(!(*tvi).IsD())(*vi).ImportLocal(*tvi); + + // convert the faces + typename TriMeshType::FaceIterator tfi; + vcg::face::JumpingPos p; + + for( tfi = tm.face.begin(); tfi != tm.face.end(); ++tfi) if(!(*tfi).IsD() && !(*tfi).IsV()) + { + std::vector vs;// vertices of the polygon + std::vector fs;// triangle faces corresponding to the polygon + + int pvi = 0; // number of vertices of the polygon + // find a non tagged edge + int se = 0; + for(;se < 3;++se) if (!(*tfi).IsF(se)) break; + + // initialize a pos on the first non tagged edge + typename TriMeshType::VertexPointer v0 = (*tfi).V(se); + p.F() = &(*tfi); + p.E() = se; + p.V() = p.F()->V(p.F()->Next(se)); + p.FlipE(); + + vs.push_back(p.F()->V(se)); + + do{ + while(p.F()->IsF(p.E())) { fs.push_back(p.F()); p.FlipF(); p.FlipE(); p.F()->SetV();} + vs.push_back(p.F()->V(p.E())); + p.FlipV(); + p.FlipE(); + } while( p.V() != v0 ); + + //now vs contains all the vertices of the polygon (still in the trimesh) + typename PolyMeshType::FaceIterator pfi = vcg::tri::Allocator::AddFaces(pm,1); + (*pfi).Alloc(vs.size()); + for( int i = 0 ; i < vs.size(); ++i) + (*pfi).V(i) = ( typename PolyMeshType::VertexType*) & pm.vert[vs[i]-&(*tm.vert.begin())]; + // here handle the other compoenents of the face (how the conponents of the n triangle faces goes in the + // the property of the polygon (e.g. the normal, the color, the quality and so on) + // TODO + + } + } + }; +} // end namespace vcg +} +#endif // __VCGLIB_TRI_CLIP