#pragma once#include"itkDataObject.h"#include"itkPoint.h"#include"itkWeakPointer.h"#include"ParticleDomain.h"#include"itkParticleContainer.h"#include"itkParticlePointIndexPair.h"#include<vector>namespaceitk{template<unsignedintVDimension=3>classITK_EXPORTParticleNeighborhood:publicDataObject{public:typedefParticleNeighborhoodSelf;typedefDataObjectSuperclass;typedefSmartPointer<Self>Pointer;typedefSmartPointer<constSelf>ConstPointer;typedefWeakPointer<constSelf>ConstWeakPointer;itkNewMacro(Self);itkTypeMacro(ParticleNeighborhood,DataObject);itkStaticConstMacro(Dimension,unsignedint,VDimension);typedefPoint<double,VDimension>PointType;usingDomainType=shapeworks::ParticleDomain;typedefParticleContainer<PointType>PointContainerType;typedefstd::vector<ParticlePointIndexPair<VDimension>>PointVectorType;itkSetObjectMacro(PointContainer,PointContainerType);itkGetConstObjectMacro(PointContainer,PointContainerType);virtualPointVectorTypeFindNeighborhoodPoints(constPointType&,intidx,double)const{itkExceptionMacro("No algorithm for finding neighbors has been specified.");}virtualPointVectorTypeFindNeighborhoodPoints(constPointType&,intidx,std::vector<double>&,double)const{itkExceptionMacro("No algorithm for finding neighbors has been specified.");}virtualPointVectorTypeFindNeighborhoodPoints(constPointType&,intidx,std::vector<double>&,std::vector<double>&,double)const{itkExceptionMacro("No algorithm for finding neighbors has been specified.");}virtualunsignedintFindNeighborhoodPoints(constPointType&,intidx,double,PointVectorType&)const{itkExceptionMacro("No algorithm for finding neighbors has been specified.");return0;}//itkSetObjectMacro(Domain, DomainType);//itkGetConstObjectMacro(Domain, DomainType);virtualvoidSetDomain(DomainType::Pointerdomain){m_Domain=domain;this->Modified();};DomainType::PointerGetDomain()const{returnm_Domain;};virtualvoidAddPosition(constPointType&p,unsignedintidx,intthreadId=0){}virtualvoidSetPosition(constPointType&p,unsignedintidx,intthreadId=0){}virtualvoidRemovePosition(unsignedintidx,intthreadId=0){}protected:ParticleNeighborhood(){}voidPrintSelf(std::ostream&os,Indentindent)const{Superclass::PrintSelf(os,indent);}virtual~ParticleNeighborhood(){};private:ParticleNeighborhood(constSelf&);//purposely not implementedvoidoperator=(constSelf&);//purposely not implementedtypenamePointContainerType::Pointerm_PointContainer;typenameDomainType::Pointerm_Domain;};}// end namespace itk