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: EdgesBuilder.hpp,v 1.3 2007/05/20 23:02:47 delpinux Exp $ 00019 00020 #ifndef EDGES_BUILDER_HPP 00021 #define EDGES_BUILDER_HPP 00022 00023 #include <map> 00024 #include <set> 00025 #include <TinyVector.hpp> 00026 00036 template <typename MeshType> 00037 class EdgesBuilder 00038 { 00039 private: 00040 typedef typename MeshType::CellType CellType; 00041 typedef TinyVector<Edge::NumberOfVertices, size_t> EdgeVertices; 00042 00043 std::map<EdgeVertices, EdgeVertices> __edgesIdSet; 00044 00045 ReferenceCounting<EdgesSet> __edgesSet; 00046 public: 00047 00048 ReferenceCounting<EdgesSet> 00049 edgesSet() 00050 { 00051 return __edgesSet; 00052 } 00053 00054 EdgesBuilder(MeshType& mesh) 00055 { 00056 ffout(3) << "- EdgesBuilder: 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::NumberOfEdges; ++j) { 00060 std::set<size_t> vertices; 00061 EdgeVertices edge; 00062 for (size_t k=0; k<Edge::NumberOfVertices ;++k) { 00063 edge[k] = mesh.vertexNumber(cell(CellType::edges[j][k])); 00064 vertices.insert(edge[k]); 00065 } 00066 ASSERT(vertices.size() == Edge::NumberOfVertices); 00067 EdgeVertices edgeId; 00068 size_t k=0; 00069 for (std::set<size_t>::const_iterator iv = vertices.begin(); 00070 iv != vertices.end(); ++iv,++k) { 00071 edgeId[k] = *iv; 00072 } 00073 00074 if (__edgesIdSet.find(edgeId) == __edgesIdSet.end()) { 00075 __edgesIdSet.insert(__edgesIdSet.end(), 00076 std::make_pair(edgeId, edge)); 00077 } 00078 } 00079 } 00080 00081 __edgesSet = new EdgesSet(__edgesIdSet.size()); 00082 EdgesSet& edgesSet = *__edgesSet; 00083 size_t i=0; 00084 for (typename std::map<EdgeVertices, EdgeVertices>::const_iterator 00085 f = __edgesIdSet.begin(); f != __edgesIdSet.end(); ++f, ++i) { 00086 TinyVector<Edge::NumberOfVertices, Vertex*> newEdge; 00087 00088 for (size_t k=0; k<Edge::NumberOfVertices; ++k) { 00089 const size_t vertexNumber = f->second[k]; 00090 newEdge[k] = &mesh.vertex(vertexNumber); 00091 } 00092 00093 edgesSet[i] = Edge(*newEdge[0], *newEdge[1]); 00094 } 00095 ffout(3) << "- EdgesBuilder: done\n"; 00096 } 00097 00098 ~EdgesBuilder() 00099 { 00100 ; 00101 } 00102 }; 00103 00104 #endif // EDGES_BUILDER_HPP
1.5.6