00001 // This file is part of ff3d - http://www.freefem.org/ff3d 00002 // Copyright (C) 2001, 2002, 2003 Stéphane Del Pino 00003 00004 // This program is free software; you can redistribute it and/or modify 00005 // it under the terms of the GNU General Public License as published by 00006 // the Free Software Foundation; either version 2, or (at your option) 00007 // any later version. 00008 00009 // This program is distributed in the hope that it will be useful, 00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 // GNU General Public License for more details. 00013 00014 // You should have received a copy of the GNU General Public License 00015 // along with this program; if not, write to the Free Software Foundation, 00016 // Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 00017 00018 // $Id: FacesBuilder.hpp,v 1.4 2007/05/20 23:02:47 delpinux Exp $ 00019 00020 #ifndef FACES_BUILDER_HPP 00021 #define FACES_BUILDER_HPP 00022 00023 #include <map> 00024 #include <TinyVector.hpp> 00025 00035 template <typename MeshType> 00036 class FacesBuilder 00037 { 00038 private: 00039 typedef typename MeshType::FaceType FaceType; 00040 typedef typename MeshType::CellType CellType; 00041 typedef TinyVector<FaceType::NumberOfVertices, size_t> FaceVertices; 00042 00043 std::map<FaceVertices, FaceVertices> __facesIdSet; 00044 00045 ReferenceCounting<FacesSet<FaceType> > __facesSet; 00046 public: 00047 00048 ReferenceCounting<FacesSet<FaceType> > 00049 facesSet() 00050 { 00051 return __facesSet; 00052 } 00053 00054 FacesBuilder(MeshType& mesh) 00055 { 00056 ffout(3) << "- FacesBuilder: building...\n"; 00057 for (typename MeshType::const_iterator i(mesh); not(i.end()); ++i) { 00058 const CellType& cell = *i; 00059 for (size_t j=0; j<CellType::NumberOfFaces; ++j) { 00060 std::set<size_t> vertices; 00061 FaceVertices face; 00062 for (size_t k=0; k<FaceType::NumberOfVertices ;++k) { 00063 face[k] = mesh.vertexNumber(cell(CellType::faces[j][k])); 00064 vertices.insert(face[k]); 00065 } 00066 ASSERT(vertices.size() == FaceType::NumberOfVertices); 00067 FaceVertices faceId; 00068 size_t k=0; 00069 for (std::set<size_t>::const_iterator iv = vertices.begin(); 00070 iv != vertices.end(); ++iv,++k) { 00071 faceId[k] = *iv; 00072 } 00073 00074 if (__facesIdSet.find(faceId) == __facesIdSet.end()) { 00075 __facesIdSet.insert(__facesIdSet.end(), 00076 std::make_pair(faceId, face)); 00077 } 00078 } 00079 } 00080 00081 __facesSet = new FacesSet<FaceType>(__facesIdSet.size()); 00082 FacesSet<FaceType>& facesSet = *__facesSet; 00083 size_t i=0; 00084 for (typename std::map<FaceVertices, FaceVertices>::const_iterator 00085 f = __facesIdSet.begin(); f != __facesIdSet.end(); ++f, ++i) { 00086 TinyVector<FaceType::NumberOfVertices, Vertex*> newFace; 00087 00088 for (size_t k=0; k<FaceType::NumberOfVertices; ++k) { 00089 const size_t vertexNumber = f->second[k]; 00090 newFace[k] = &mesh.vertex(vertexNumber); 00091 } 00092 00093 facesSet[i] = FaceType(newFace); 00094 } 00095 ffout(3) << "- FacesBuilder: done\n"; 00096 } 00097 00098 ~FacesBuilder() 00099 { 00100 ; 00101 } 00102 }; 00103 00104 #endif // FACES_BUILDER_HPP
1.5.6