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