Main Page   Groups   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Concepts

itkVoronoiDiagram2D.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Insight Segmentation & Registration Toolkit
00004   Module:    $RCSfile: itkVoronoiDiagram2D.h,v $
00005   Language:  C++
00006   Date:      $Date: 2009-01-27 19:30:16 $
00007   Version:   $Revision: 1.19 $
00008 
00009   Copyright (c) Insight Software Consortium. All rights reserved.
00010   See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
00011 
00012      This software is distributed WITHOUT ANY WARRANTY; without even 
00013      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
00014      PURPOSE.  See the above copyright notices for more information.
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);
00082 
00084   typedef typename MeshTraits::PixelType               PixelType;  
00085   typedef typename MeshTraits::CoordRepType            CoordRepType;  
00086   typedef typename MeshTraits::InterpolationWeightType InterpolationWeightType;
00087   typedef typename MeshTraits::PointIdentifier         PointIdentifier;
00088   typedef typename MeshTraits::CellIdentifier          CellIdentifier;
00089   typedef typename MeshTraits::CellFeatureIdentifier   CellFeatureIdentifier;
00090   typedef typename MeshTraits::PointType               PointType;
00091   typedef typename MeshTraits::PointsContainer         PointsContainer;
00092   typedef typename MeshTraits::CellTraits              CellTraits;
00093   typedef typename MeshTraits::CellsContainer          CellsContainer;
00094   typedef typename MeshTraits::PointCellLinksContainer PointCellLinksContainer;
00095   typedef typename MeshTraits::CellLinksContainer      CellLinksContainer;
00096   typedef typename MeshTraits::PointDataContainer      PointDataContainer;
00097   typedef typename MeshTraits::CellDataContainer       CellDataContainer;  
00098   typedef typename MeshTraits::CellAutoPointer         genericCellPointer;
00099   typedef PointLocator<PointIdentifier,itkGetStaticConstMacro(PointDimension),
00100                        CoordRepType,PointsContainer>  PointLocatorType;
00101   typedef BoundingBox<PointIdentifier,itkGetStaticConstMacro(PointDimension),
00102                       CoordRepType,PointsContainer>   BoundingBoxType;
00103   typedef typename PointsContainer::Pointer       PointsContainerPointer;
00104   typedef typename CellsContainer::Pointer        CellsContainerPointer;
00105   typedef typename CellLinksContainer::Pointer    CellLinksContainerPointer;
00106   typedef typename PointDataContainer::Pointer    PointDataContainerPointer;
00107   typedef typename CellDataContainer::Pointer     CellDataContainerPointer;
00108   typedef typename PointLocatorType::Pointer      PointLocatorPointer;
00109   typedef typename BoundingBoxType::Pointer       BoundingBoxPointer;
00110   typedef typename
00111   PointsContainer::ConstIterator        PointsContainerConstIterator;
00112   typedef typename
00113   PointsContainer::Iterator             PointsContainerIterator;
00114   typedef typename
00115   CellsContainer::ConstIterator         CellsContainerConstIterator;
00116   typedef typename
00117   CellsContainer::Iterator              CellsContainerIterator;
00118   typedef typename
00119   CellLinksContainer::ConstIterator     CellLinksContainerIterator;
00120   typedef typename
00121   PointDataContainer::ConstIterator     PointDataContainerIterator;
00122   typedef typename
00123   CellDataContainer::ConstIterator      CellDataContainerIterator;
00124   typedef typename
00125   PointCellLinksContainer::const_iterator        PointCellLinksContainerIterator;
00127 
00128   typedef CellFeatureIdentifier                     CellFeatureCount;
00129   typedef CellInterface<PixelType,CellTraits>       CellInterfaceType;
00130   typedef PolygonCell<CellInterfaceType>            CellType;
00131   typedef typename CellType::CellAutoPointer        CellAutoPointer;
00132   typedef Point<int,2>                              EdgeInfo;
00133   typedef std::deque<EdgeInfo>                      EdgeInfoDQ;
00134   typedef typename CellType::MultiVisitor           CellMultiVisitorType;
00135   typedef std::vector<PointType>                    SeedsType;
00136   typedef typename SeedsType::iterator              SeedsIterator;
00137   typedef LineCell <CellInterfaceType>              Edge;
00138   typedef typename Edge::SelfAutoPointer            EdgeAutoPointer;
00139   typedef std::list<PointType>                      PointList;
00140   typedef std::vector<int>                          INTvector;
00141   typedef typename INTvector::iterator              NeighborIdIterator;
00142   typedef typename std::vector<PointType>::iterator VertexIterator;
00143 
00145   itkGetMacro(NumberOfSeeds,unsigned int);
00146 
00149   void SetSeeds (int num, SeedsIterator begin);
00150 
00152   void SetBoundary(PointType vorsize);
00153   void SetOrigin(PointType vorsize);
00155 
00157   NeighborIdIterator NeighborIdsBegin(int seeds);
00158   NeighborIdIterator NeighborIdsEnd(int seeds);
00160 
00162   VertexIterator VertexBegin(void);
00163   VertexIterator VertexEnd(void);
00165 
00167   PointType GetSeed(int SeedID);
00168 
00170   void GetCellId(CellIdentifier cellId, CellAutoPointer &);
00171 
00173   void GetPoint(int pId,PointType *answer);
00174 
00175   class VoronoiEdge{
00176   public:
00177     PointType m_Left;
00178     PointType m_Right;
00179     int       m_LeftID;
00180     int       m_RightID;
00181     int       m_LineID;
00182     VoronoiEdge(){}
00183     ~VoronoiEdge(){}
00184     };
00185   
00187   typedef typename std::vector<VoronoiEdge>::iterator VoronoiEdgeIterator;
00188 
00190   VoronoiEdgeIterator EdgeBegin(void);
00191   VoronoiEdgeIterator EdgeEnd(void);
00193 
00195   EdgeInfo GetSeedsIDAroundEdge(VoronoiEdge *task);
00196 
00197 /********************************************************/
00198 
00199   void Reset();
00200   void InsertCells();
00201 
00202   void AddCellNeighbor(EdgeInfo x)
00203     { 
00204     m_CellNeighborsID[x[0]].push_back(x[1]);
00205     m_CellNeighborsID[x[1]].push_back(x[0]);
00206     }
00207   void ClearRegion(int i)
00208     { m_VoronoiRegions[i]->ClearPoints();}
00209   void VoronoiRegionAddPointId(int id, int x)
00210     { m_VoronoiRegions[id]->AddPointId(x);}
00211   void BuildEdge(int id)
00212     { m_VoronoiRegions[id]->BuildEdges();}
00213 
00214   void LineListClear(){ m_LineList.clear();}
00215   void EdgeListClear(){ m_EdgeList.clear();}
00216   void VertexListClear(){ m_VertexList.clear();}
00217   int LineListSize(){ return static_cast<int>( m_LineList.size() );} 
00218   int EdgeListSize(){ return static_cast<int>( m_EdgeList.size() );} 
00219   int VertexListSize(){ return static_cast<int>( m_VertexList.size() );} 
00220   void AddLine(EdgeInfo x){ m_LineList.push_back(x);}
00221   void AddEdge(VoronoiEdge x){ m_EdgeList.push_back(x);}
00222   void AddVert(PointType x){ m_VertexList.push_back(x);}
00223   EdgeInfo GetLine(int id){ return m_LineList[id];} 
00224   VoronoiEdge GetEdge(int id){ return m_EdgeList[id];} 
00225   PointType GetVertex(int id){ return m_VertexList[id];} 
00226   EdgeInfo GetEdgeEnd(int id)
00227     {
00228     EdgeInfo x;
00229     x[0]=m_EdgeList[id].m_LeftID;
00230     x[1]=m_EdgeList[id].m_RightID;
00231     return x;
00232     }
00233   int GetEdgeLineID(int id){ return m_EdgeList[id].m_LineID; }
00234 
00235 protected:
00236   VoronoiDiagram2D();
00237   ~VoronoiDiagram2D();
00238   virtual void PrintSelf(std::ostream& os, Indent indent) const;
00239   
00240   
00241 private:
00242   VoronoiDiagram2D(const Self&); //purposely not implemented
00243   void operator=(const Self&); //purposely not implemented
00244   
00245   SeedsType                       m_Seeds;
00246   unsigned int                    m_NumberOfSeeds;
00247   std::vector<CellType *>         m_VoronoiRegions;
00248   PointType                       m_VoronoiBoundary;
00249   PointType                       m_VoronoiBoundaryOrigin;
00250   std::vector< std::vector<int> > m_CellNeighborsID;
00251   
00252   std::vector< EdgeInfo >    m_LineList;
00253   std::vector< PointType >   m_VertexList;
00254   std::vector< VoronoiEdge > m_EdgeList;
00255 
00256 }; // end class: VoronoiDiagram2D
00257 
00258 } // end namespace itk
00259 
00260 #ifndef ITK_MANUAL_INSTANTIATION
00261 #include "itkVoronoiDiagram2D.txx"
00262 #endif
00263 
00264 #endif
00265 

Generated at Sat Feb 28 13:50:23 2009 for ITK by doxygen 1.5.6 written by Dimitri van Heesch, © 1997-2000