00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkVoronoiDiagram2D_h
00018 #define __itkVoronoiDiagram2D_h
00019
00020 #if defined(_MSC_VER)
00021 #pragma warning ( disable : 4786 )
00022 #endif
00023
00024 #include "itkCellInterface.h"
00025 #include "itkLineCell.h"
00026 #include "itkMesh.h"
00027 #include "itkDefaultDynamicMeshTraits.h"
00028 #include "itkPolygonCell.h"
00029 #include <vector>
00030
00031 #ifndef NULL
00032 #define NULL 0
00033 #endif
00034
00035 namespace itk
00036 {
00053 template <typename TCoordType>
00054 class ITK_EXPORT VoronoiDiagram2D:
00055 public Mesh <TCoordType, 2,
00056 DefaultDynamicMeshTraits<TCoordType, 2, 2, TCoordType> >
00057 {
00058 public:
00060 typedef VoronoiDiagram2D Self;
00061 typedef Mesh <TCoordType, 2,
00062 DefaultDynamicMeshTraits<TCoordType, 2, 2, TCoordType> >
00063 Superclass;
00064 typedef SmartPointer<Self> Pointer;
00065 typedef SmartPointer<const Self> ConstPointer;
00066
00068 itkNewMacro(Self);
00069
00071 itkTypeMacro(VoronoiDiagram2D, Mesh);
00072
00074 typedef DefaultDynamicMeshTraits<TCoordType, 2, 2, TCoordType> MeshTraits;
00075
00077 itkStaticConstMacro(PointDimension, unsigned int,
00078 MeshTraits::PointDimension);
00079 itkStaticConstMacro(MaxTopologicalDimension, unsigned int,
00080 MeshTraits::MaxTopologicalDimension);
00081
00083 typedef typename MeshTraits::PixelType PixelType;
00084 typedef typename MeshTraits::CoordRepType CoordRepType;
00085 typedef typename MeshTraits::InterpolationWeightType InterpolationWeightType;
00086 typedef typename MeshTraits::PointIdentifier PointIdentifier;
00087 typedef typename MeshTraits::CellIdentifier CellIdentifier;
00088 typedef typename MeshTraits::CellFeatureIdentifier CellFeatureIdentifier;
00089 typedef typename MeshTraits::PointType PointType;
00090 typedef typename MeshTraits::PointsContainer PointsContainer;
00091 typedef typename MeshTraits::CellTraits CellTraits;
00092 typedef typename MeshTraits::CellsContainer CellsContainer;
00093 typedef typename MeshTraits::PointCellLinksContainer PointCellLinksContainer;
00094 typedef typename MeshTraits::CellLinksContainer CellLinksContainer;
00095 typedef typename MeshTraits::PointDataContainer PointDataContainer;
00096 typedef typename MeshTraits::CellDataContainer CellDataContainer;
00097 typedef typename MeshTraits::CellAutoPointer genericCellPointer;
00098 typedef PointLocator<PointIdentifier,itkGetStaticConstMacro(PointDimension),
00099 CoordRepType,PointsContainer> PointLocatorType;
00100 typedef BoundingBox<PointIdentifier,itkGetStaticConstMacro(PointDimension),
00101 CoordRepType,PointsContainer> BoundingBoxType;
00102 typedef typename PointsContainer::Pointer PointsContainerPointer;
00103 typedef typename CellsContainer::Pointer CellsContainerPointer;
00104 typedef typename CellLinksContainer::Pointer CellLinksContainerPointer;
00105 typedef typename PointDataContainer::Pointer PointDataContainerPointer;
00106 typedef typename CellDataContainer::Pointer CellDataContainerPointer;
00107 typedef typename PointLocatorType::Pointer PointLocatorPointer;
00108 typedef typename BoundingBoxType::Pointer BoundingBoxPointer;
00109 typedef typename
00110 PointsContainer::ConstIterator PointsContainerConstIterator;
00111 typedef typename
00112 PointsContainer::Iterator PointsContainerIterator;
00113 typedef typename
00114 CellsContainer::ConstIterator CellsContainerConstIterator;
00115 typedef typename
00116 CellsContainer::Iterator CellsContainerIterator;
00117 typedef typename
00118 CellLinksContainer::ConstIterator CellLinksContainerIterator;
00119 typedef typename
00120 PointDataContainer::ConstIterator PointDataContainerIterator;
00121 typedef typename
00122 CellDataContainer::ConstIterator CellDataContainerIterator;
00123 typedef typename
00124 PointCellLinksContainer::const_iterator PointCellLinksContainerIterator;
00125 typedef CellFeatureIdentifier CellFeatureCount;
00126 typedef CellInterface<PixelType,CellTraits> CellInterfaceType;
00127 typedef PolygonCell<CellInterfaceType> CellType;
00128 typedef typename CellType::CellAutoPointer CellAutoPointer;
00129 typedef Point<int,2> EdgeInfo;
00130 typedef std::deque<EdgeInfo> EdgeInfoDQ;
00131 typedef typename CellType::MultiVisitor CellMultiVisitorType;
00132 typedef std::vector<PointType> SeedsType;
00133 typedef typename SeedsType::iterator SeedsIterator;
00134 typedef LineCell <CellInterfaceType> Edge;
00135 typedef typename Edge::SelfAutoPointer EdgeAutoPointer;
00136 typedef std::list<PointType> PointList;
00137 typedef std::vector<int> INTvector;
00138 typedef typename INTvector::iterator NeighborIdIterator;
00139 typedef typename std::vector<PointType>::iterator VertexIterator;
00140
00142 itkGetMacro(NumberOfSeeds,unsigned int);
00143
00146 void SetSeeds (int num, SeedsIterator begin);
00147
00149 void SetBoundary(PointType vorsize);
00150 void SetOrigin(PointType vorsize);
00151
00153 NeighborIdIterator NeighborIdsBegin(int seeds);
00154 NeighborIdIterator NeighborIdsEnd(int seeds);
00155
00157 VertexIterator VertexBegin(void);
00158 VertexIterator VertexEnd(void);
00159
00161 PointType GetSeed(int SeedID);
00162
00164 void GetCellId(CellIdentifier cellId, CellAutoPointer &);
00165
00167 void GetPoint(int pId,PointType *answer);
00168
00169 class VoronoiEdge{
00170 public:
00171 PointType m_Left;
00172 PointType m_Right;
00173 int m_LeftID;
00174 int m_RightID;
00175 int m_LineID;
00176 VoronoiEdge(){};
00177 ~VoronoiEdge(){};
00178 };
00179
00181 typedef typename std::vector<VoronoiEdge>::iterator VoronoiEdgeIterator;
00182
00184 VoronoiEdgeIterator EdgeBegin(void);
00185 VoronoiEdgeIterator EdgeEnd(void);
00186
00188 EdgeInfo GetSeedsIDAroundEdge(VoronoiEdge *task);
00189
00190
00191 void Reset();
00192 void InsertCells();
00193
00194 void AddCellNeighbor(EdgeInfo x){
00195 m_CellNeighborsID[x[0]].push_back(x[1]);
00196 m_CellNeighborsID[x[1]].push_back(x[0]);};
00197 void ClearRegion(int i){ m_VoronoiRegions[i]->ClearPoints();};
00198 void VoronoiRegionAddPointId(int id, int x){m_VoronoiRegions[id]->AddPointId(x);};
00199 void BuildEdge(int id){ m_VoronoiRegions[id]->BuildEdges();};
00200
00201 void LineListClear(){ f_LineList.clear();};
00202 void EdgeListClear(){ f_EdgeList.clear();};
00203 void VertexListClear(){ f_VertexList.clear();};
00204 int LineListSize(){ return static_cast<int>( f_LineList.size() );};
00205 int EdgeListSize(){ return static_cast<int>( f_EdgeList.size() );};
00206 int VertexListSize(){ return static_cast<int>( f_VertexList.size() );};
00207 void AddLine(EdgeInfo x){ f_LineList.push_back(x);};
00208 void AddEdge(VoronoiEdge x){ f_EdgeList.push_back(x);};
00209 void AddVert(PointType x){ f_VertexList.push_back(x);};
00210 EdgeInfo GetLine(int id){ return f_LineList[id];};
00211 VoronoiEdge GetEdge(int id){ return f_EdgeList[id];};
00212 PointType GetVertex(int id){ return f_VertexList[id];};
00213 EdgeInfo GetEdgeEnd(int id){
00214 EdgeInfo x;
00215 x[0]=f_EdgeList[id].m_LeftID;
00216 x[1]=f_EdgeList[id].m_RightID;
00217 return x;
00218 }
00219 int GetEdgeLineID(int id){ return f_EdgeList[id].m_LineID; };
00220
00221 protected:
00222 VoronoiDiagram2D();
00223 ~VoronoiDiagram2D();
00224 virtual void PrintSelf(std::ostream& os, Indent indent) const;
00225
00226
00227 private:
00228 VoronoiDiagram2D(const Self&);
00229 void operator=(const Self&);
00230
00231 SeedsType m_Seeds;
00232 unsigned int m_NumberOfSeeds;
00233 std::vector<CellType *> m_VoronoiRegions;
00234 PointType m_VoronoiBoundary;
00235 PointType m_VoronoiBoundaryOrigin;
00236 std::vector< std::vector<int> > m_CellNeighborsID;
00237
00238 std::vector< EdgeInfo > f_LineList;
00239 std::vector< PointType > f_VertexList;
00240 std::vector< VoronoiEdge > f_EdgeList;
00241
00242 };
00243
00244 }
00245
00246 #ifndef ITK_MANUAL_INSTANTIATION
00247 #include "itkVoronoiDiagram2D.txx"
00248 #endif
00249
00250 #endif
00251
00252