shapeworks::ParticleSystem
A facade class managing interactions with a particle system. More...
#include <ParticleSystem.h>
Inherits from itk::DataObject
Public Types
Name | |
---|---|
typedef ParticleSystem | Self |
typedef DataObject | Superclass |
typedef itk::SmartPointer< Self > | Pointer |
typedef itk::SmartPointer< const Self > | ConstPointer |
typedef itk::WeakPointer< const Self > | ConstWeakPointer |
using shapeworks::ParticleDomain | DomainType |
typedef itk::Point< double, VDimension > | PointType |
typedef GenericContainer< PointType > | PointContainerType |
typedef vnl_matrix_fixed< double, VDimension+1, VDimension+1 > | TransformType |
typedef vnl_vector_fixed< double, VDimension > | VectorType |
typedef vnl_matrix< double > | VnlMatrixType |
using std::vector< ParticlePointIndexPair > | PointVectorType |
Public Functions
Name | |
---|---|
itkNewMacro(Self ) | |
itkTypeMacro(ParticleSystem , itk::DataObject ) | |
itkStaticConstMacro(Dimension , unsigned int , VDimension ) | |
void | RegisterObserver(Observer * attr) |
void | SynchronizePositions() |
unsigned long int | GetNumberOfParticles(unsigned int d =0) const |
const PointType & | AddPosition(const PointType & , unsigned int d =0) |
const PointType & | SetPosition(const PointType & , unsigned long int k, unsigned int d =0) |
void | RemovePosition(unsigned long int k, unsigned int d =0) |
PointType & | GetPosition(unsigned long int k, unsigned int d =0) |
const PointType & | GetPosition(unsigned long int k, unsigned int d =0) const |
PointType | GetTransformedPosition(unsigned long int k, unsigned int d =0) const |
PointType | GetPrefixTransformedPosition(unsigned long int k, unsigned int d =0) const |
void | SplitAllParticles(double epsilon) |
void | SplitParticle(double epsilon, unsigned int idx, unsigned int d =0) |
void | AdvancedAllParticleSplitting(double epsilon, unsigned int domains_per_shape, unsigned int dom_to_process) |
void | PrintParticleSystem() |
std::shared_ptr< ParticleNeighborhood > | GetNeighborhood(unsigned int k) const Get the neighborhood object associated with domain k. |
PointVectorType | FindNeighborhoodPoints(const PointType & p, int idx, double r, unsigned int d =0) const |
PointVectorType | FindNeighborhoodPoints(const PointType & p, int idx, std::vector< double > & w, std::vector< double > & distances, double r, unsigned int d =0) const |
PointVectorType | FindNeighborhoodPoints(const PointType & p, int idx, std::vector< double > & w, double r, unsigned int d =0) const |
PointVectorType | FindNeighborhoodPoints(unsigned int idx, double r, unsigned int d =0) const |
PointVectorType | FindNeighborhoodPoints(unsigned int idx, std::vector< double > & w, std::vector< double > & distances, double r, unsigned int d =0) const |
PointVectorType | FindNeighborhoodPoints(unsigned int idx, std::vector< double > & w, double r, unsigned int d =0) const |
void | AddDomain(DomainType::Pointer input) |
std::vector< DomainType::Pointer >::const_iterator | GetDomainsBegin() const |
std::vector< DomainType::Pointer >::const_iterator | GetDomainsEnd() const |
DomainType * | GetDomain(unsigned int i) |
DomainType * | GetDomain() |
const DomainType * | GetDomain(unsigned int i) const |
const DomainType * | GetDomain() const |
unsigned int | GetNumberOfDomains() const |
void | SetTransform(unsigned int i, const TransformType & ) |
void | SetTransform(const TransformType & p) |
void | SetPrefixTransform(unsigned int i, const TransformType & ) |
void | SetPrefixTransform(const TransformType & p) |
std::vector< TransformType >::const_iterator | GetTransformsBegin() const |
std::vector< TransformType >::const_iterator | GetTransformsEnd() const |
const TransformType & | GetTransform(unsigned int i) const |
const TransformType & | GetTransform() const |
TransformType | GetTransform(unsigned int i) |
TransformType | GetTransform() |
const TransformType & | GetPrefixTransform(unsigned int i) const |
const TransformType & | GetPrefixTransform() const |
TransformType | GetPrefixTransform(unsigned int i) |
TransformType | GetPrefixTransform() |
std::vector< TransformType >::const_iterator | GetInverseTransformsBegin() const |
std::vector< TransformType >::const_iterator | GetInverseTransformsEnd() const |
const TransformType & | GetInverseTransform(unsigned int i) const |
const TransformType & | GetInverseTransform() const |
const TransformType & | GetInversePrefixTransform(unsigned int i) const |
const TransformType & | GetInversePrefixTransform() const |
const std::vector< PointContainerType::Pointer > & | GetPositions() const |
const PointContainerType::Pointer & | GetPositions(unsigned int d) const |
void | AddPositionList(const std::vector< PointType > & , unsigned int d =0) |
PointType | TransformPoint(const PointType & , const TransformType & ) const |
VectorType | TransformVector(const VectorType & , const TransformType & ) const |
VnlMatrixType | TransformNormalDerivative(const VnlMatrixType & , const TransformType & ) const |
TransformType | InvertTransform(const TransformType & T) const |
void | FlagDomain(unsigned int i) |
void | UnflagDomain(unsigned int i) |
bool | GetDomainFlag(unsigned int i) const |
const std::vector< bool > & | GetDomainFlags() const |
void | SetDomainFlags() |
void | ResetDomainFlags() |
void | SetFixedParticleFlag(unsigned int d, unsigned int i) |
void | ResetFixedParticleFlag(unsigned int d, unsigned int i) |
bool | GetFixedParticleFlag(unsigned int d, unsigned int i) const |
void | ResetFixedParticleFlags() |
void | SetDomainsPerShape(unsigned int num) |
unsigned int | GetDomainsPerShape() const |
void | SetNumberOfDomains(unsigned int ) |
double | ComputeMaxDistNearestNeighbors(size_t dom) |
void | SetFieldAttributes(const std::vector< std::string > & field_attributes) |
const std::vector< std::string > & | GetFieldAttributes() const |
Protected Functions
Name | |
---|---|
ParticleSystem() | |
void | PrintSelf(std::ostream & os, itk::Indent indent) const |
virtual | ~ParticleSystem() |
TransformType & | GetInverseTransform(unsigned int i) |
TransformType & | GetInverseTransform() |
TransformType & | GetInversePrefixTransform(unsigned int i) |
TransformType & | GetInversePrefixTransform() |
Public Attributes
Name | |
---|---|
constexpr int | VDimension |
Detailed Description
class shapeworks::ParticleSystem;
A facade class managing interactions with a particle system.
A particle system consists of a set of particle locations and domains in which those locations are defined. For example, a particle system may simply be a set of points in 3D Euclidean space that are constrained to a specified bounding box. A more complex example is a set of 3D points constrained to a given surface. The itkParticleSystem class is also designed to manage multiple sets of points across multiple domains. For example, one may create a system of dozens of point sets that are each defined in different spaces. The itkParticleSystem class can also maintain a set of transformations associated with each domain that map that particular domain into another coordinate frame, for example, a common coordinate frame.
Public Types Documentation
typedef Self
typedef ParticleSystem shapeworks::ParticleSystem::Self;
Standard class typedefs
typedef Superclass
typedef DataObject shapeworks::ParticleSystem::Superclass;
typedef Pointer
typedef itk::SmartPointer<Self> shapeworks::ParticleSystem::Pointer;
typedef ConstPointer
typedef itk::SmartPointer<const Self> shapeworks::ParticleSystem::ConstPointer;
typedef ConstWeakPointer
typedef itk::WeakPointer<const Self> shapeworks::ParticleSystem::ConstWeakPointer;
using DomainType
using shapeworks::ParticleSystem::DomainType = shapeworks::ParticleDomain;
Define the base domain type.
typedef PointType
typedef itk::Point<double, VDimension> shapeworks::ParticleSystem::PointType;
Point type used to store particle locations.
typedef PointContainerType
typedef GenericContainer<PointType> shapeworks::ParticleSystem::PointContainerType;
Point container type. One is associated with each domain.
typedef TransformType
typedef vnl_matrix_fixed<double, VDimension + 1, VDimension + 1> shapeworks::ParticleSystem::TransformType;
Defines a transform class type. One is associated with each domain. Transforms are affine for simplicity. This could be extended by using the itk::Transform base type so that a variety of transform types may be used.
typedef VectorType
typedef vnl_vector_fixed<double, VDimension> shapeworks::ParticleSystem::VectorType;
typedef VnlMatrixType
typedef vnl_matrix<double> shapeworks::ParticleSystem::VnlMatrixType;
using PointVectorType
using shapeworks::ParticleSystem::PointVectorType = std::vector<ParticlePointIndexPair>;
Public Functions Documentation
function itkNewMacro
itkNewMacro(
Self
)
Method for creation through the object factory.
function itkTypeMacro
itkTypeMacro(
ParticleSystem ,
itk::DataObject
)
Run-time type information (and related methods).
function itkStaticConstMacro
itkStaticConstMacro(
Dimension ,
unsigned int ,
VDimension
)
Dimensionality of the domain of the particle system.
function RegisterObserver
void RegisterObserver(
Observer * attr
)
Register an attribute object with this particle system. This action adds the attribute object as an observer for the particle system so that it will receive published updates. For example, a gradient attribute object may need to know when particle positions have changed so that it can update its internal state appropriately (e.g. precompute a gradient that corresponds to the new particle position). Internally, this method manages registering the appropriate itk::Command and itk::Object as an observer of this itk::Object (AddObserver). Relevant state information is passed to objects in particle events.
function SynchronizePositions
inline void SynchronizePositions()
Invokes the set event on all particle positions, resetting them to their current value. This method may be called to synchronize positional information among various observers which may have gone out of sync.
function GetNumberOfParticles
inline unsigned long int GetNumberOfParticles(
unsigned int d =0
) const
Returns the number of particles in domain k.
function AddPosition
const PointType & AddPosition(
const PointType & ,
unsigned int d =0
)
Add/Set/Remove a single particle position. The actual position added or set will be returned. If, for example, the domain imposes any constraints on this location (e.g. out-of-bounds, projection onto a surface), then the method returns the location after constraints are applied. Both the Add and Set methods require a domain index. If unspecified, the domain index is zero. The Set method requires a specific particle index. If the given index does not exist, an exception is thrown. Set is intended to be used for moving particles. The SetTransformedPosition sets the position using a Point transformed by the m_Transform associated with the given domain.
function SetPosition
const PointType & SetPosition(
const PointType & ,
unsigned long int k,
unsigned int d =0
)
function RemovePosition
void RemovePosition(
unsigned long int k,
unsigned int d =0
)
function GetPosition
inline PointType & GetPosition(
unsigned long int k,
unsigned int d =0
)
Return a position with index k from domain d. Note the order in which the 2 integers must be specified! The domain number is specified second and the position index within the domain is specified first. Note that the domain index may be omitted if the particle system only contains a single domain. GetTransformedPosition returns the position premultiplied by the transform matrix for the given domain.
function GetPosition
inline const PointType & GetPosition(
unsigned long int k,
unsigned int d =0
) const
function GetTransformedPosition
inline PointType GetTransformedPosition(
unsigned long int k,
unsigned int d =0
) const
function GetPrefixTransformedPosition
inline PointType GetPrefixTransformedPosition(
unsigned long int k,
unsigned int d =0
) const
function SplitAllParticles
void SplitAllParticles(
double epsilon
)
Doubles the number of particles of the system by splitting each particle into 2 particles. Each new particle position is added to the system at a random epsilon distance on the surface from the original particle. The new particles are added using the AddPosition method, so all appropriate callbacks are invoked.
function SplitParticle
void SplitParticle(
double epsilon,
unsigned int idx,
unsigned int d =0
)
function AdvancedAllParticleSplitting
void AdvancedAllParticleSplitting(
double epsilon,
unsigned int domains_per_shape,
unsigned int dom_to_process
)
function PrintParticleSystem
void PrintParticleSystem()
function GetNeighborhood
inline std::shared_ptr< ParticleNeighborhood > GetNeighborhood(
unsigned int k
) const
Get the neighborhood object associated with domain k.
function FindNeighborhoodPoints
inline PointVectorType FindNeighborhoodPoints(
const PointType & p,
int idx,
double r,
unsigned int d =0
) const
Return the neighborhood of points with radius r around point p in domain k. This is just a convenience method to avoid exposing the underlying Neighborhood objects. FindTransformedNeighborhoodPoints returns the list with all points transformed by the transform associated with the given domain.
function FindNeighborhoodPoints
inline PointVectorType FindNeighborhoodPoints(
const PointType & p,
int idx,
std::vector< double > & w,
std::vector< double > & distances,
double r,
unsigned int d =0
) const
function FindNeighborhoodPoints
inline PointVectorType FindNeighborhoodPoints(
const PointType & p,
int idx,
std::vector< double > & w,
double r,
unsigned int d =0
) const
function FindNeighborhoodPoints
inline PointVectorType FindNeighborhoodPoints(
unsigned int idx,
double r,
unsigned int d =0
) const
function FindNeighborhoodPoints
inline PointVectorType FindNeighborhoodPoints(
unsigned int idx,
std::vector< double > & w,
std::vector< double > & distances,
double r,
unsigned int d =0
) const
function FindNeighborhoodPoints
inline PointVectorType FindNeighborhoodPoints(
unsigned int idx,
std::vector< double > & w,
double r,
unsigned int d =0
) const
function AddDomain
void AddDomain(
DomainType::Pointer input
)
Add a domain to the particle system. This method also allocates space for a list of positions that are contained within the domain, and a default neighborhood calculator. The final, optional argument indicates the calling thread id.
function GetDomainsBegin
inline std::vector< DomainType::Pointer >::const_iterator GetDomainsBegin() const
Return an iterator that points to the first element of the list of the domains.
function GetDomainsEnd
inline std::vector< DomainType::Pointer >::const_iterator GetDomainsEnd() const
Return an iterator that points one position past the last element of the list of the domains.
function GetDomain
inline DomainType * GetDomain(
unsigned int i
)
Return the i'th domain object.
function GetDomain
inline DomainType * GetDomain()
API for the single domain case.
function GetDomain
inline const DomainType * GetDomain(
unsigned int i
) const
Return the i'th domain object.
function GetDomain
inline const DomainType * GetDomain() const
API for the single domain case.
function GetNumberOfDomains
inline unsigned int GetNumberOfDomains() const
Returns the number of domains contained in the particle system.
function SetTransform
void SetTransform(
unsigned int i,
const TransformType &
)
Set the transform associated with domain i. This method will also compute and set the corresponding inverse transform if possible. If the inverse transform cannot be computed, the exception is quietly handled by this method and an identity transform is set in its place. The calling program is responsible for knowing when an inverse transform cannot be computed.
function SetTransform
inline void SetTransform(
const TransformType & p
)
function SetPrefixTransform
void SetPrefixTransform(
unsigned int i,
const TransformType &
)
function SetPrefixTransform
inline void SetPrefixTransform(
const TransformType & p
)
function GetTransformsBegin
inline std::vector< TransformType >::const_iterator GetTransformsBegin() const
Return an iterator that points to the first element of the list of the transforms.
function GetTransformsEnd
inline std::vector< TransformType >::const_iterator GetTransformsEnd() const
Return an iterator that points one position past the last element of the list of the transforms.
function GetTransform
inline const TransformType & GetTransform(
unsigned int i
) const
Return the i'th transform object.
function GetTransform
inline const TransformType & GetTransform() const
API for the single transform case.
function GetTransform
inline TransformType GetTransform(
unsigned int i
)
Return the i'th transform object.
function GetTransform
inline TransformType GetTransform()
API for the single transform case.
function GetPrefixTransform
inline const TransformType & GetPrefixTransform(
unsigned int i
) const
Return the i'th transform object.
function GetPrefixTransform
inline const TransformType & GetPrefixTransform() const
API for the single transform case.
function GetPrefixTransform
inline TransformType GetPrefixTransform(
unsigned int i
)
Return the i'th transform object.
function GetPrefixTransform
inline TransformType GetPrefixTransform()
API for the single transform case.
function GetInverseTransformsBegin
inline std::vector< TransformType >::const_iterator GetInverseTransformsBegin() const
Return an iterator that points to the first element of the list of the inverse transforms.
function GetInverseTransformsEnd
inline std::vector< TransformType >::const_iterator GetInverseTransformsEnd() const
Return an iterator that points one position past the last element of the list of the transforms.
function GetInverseTransform
inline const TransformType & GetInverseTransform(
unsigned int i
) const
Return the i'th transform object.
function GetInverseTransform
inline const TransformType & GetInverseTransform() const
API for the single transform case.
function GetInversePrefixTransform
inline const TransformType & GetInversePrefixTransform(
unsigned int i
) const
Return the i'th transform object.
function GetInversePrefixTransform
inline const TransformType & GetInversePrefixTransform() const
API for the single transform case.
function GetPositions
inline const std::vector< PointContainerType::Pointer > & GetPositions() const
Return the array of particle positions.
function GetPositions
inline const PointContainerType::Pointer & GetPositions(
unsigned int d
) const
function AddPositionList
void AddPositionList(
const std::vector< PointType > & ,
unsigned int d =0
)
Adds a list of points to the specified domain. The arguments are the std::vector of points and the domain number.
function TransformPoint
PointType TransformPoint(
const PointType & ,
const TransformType &
) const
Transforms a point using the given transform. NOTE: Scaling is not currently implemented. (This method may be converted to virtual and overridden if tranform type is generalized.)
function TransformVector
VectorType TransformVector(
const VectorType & ,
const TransformType &
) const
Transforms a vector using the given transform. Only the rotational part of the transform is applied. NOTE: Scaling is not currently supported.
function TransformNormalDerivative
VnlMatrixType TransformNormalDerivative(
const VnlMatrixType & ,
const TransformType &
) const
Transforms the derivative of normals to new space.
function InvertTransform
inline TransformType InvertTransform(
const TransformType & T
) const
Returns the inverse of a transformation matrix.
function FlagDomain
inline void FlagDomain(
unsigned int i
)
Flag/Unflag a domain. Flagging a domain has different meanings according to the application using this particle system.
function UnflagDomain
inline void UnflagDomain(
unsigned int i
)
function GetDomainFlag
inline bool GetDomainFlag(
unsigned int i
) const
function GetDomainFlags
inline const std::vector< bool > & GetDomainFlags() const
function SetDomainFlags
inline void SetDomainFlags()
function ResetDomainFlags
inline void ResetDomainFlags()
function SetFixedParticleFlag
inline void SetFixedParticleFlag(
unsigned int d,
unsigned int i
)
The following methods provide functionality for specifying particle indices that are fixed landmarks. SetPosition() calls to these particle indices will silently fail. For simplicity, only one list of indices is maintained for all dimensions. If particle index n is flagged, for example, then particle index n in all domains is fixed.
function ResetFixedParticleFlag
inline void ResetFixedParticleFlag(
unsigned int d,
unsigned int i
)
function GetFixedParticleFlag
inline bool GetFixedParticleFlag(
unsigned int d,
unsigned int i
) const
function ResetFixedParticleFlags
inline void ResetFixedParticleFlags()
function SetDomainsPerShape
inline void SetDomainsPerShape(
unsigned int num
)
function GetDomainsPerShape
inline unsigned int GetDomainsPerShape() const
function SetNumberOfDomains
void SetNumberOfDomains(
unsigned int
)
Set the number of domains. This method modifies the size of the m_Domains, m_Positions, and m_Transform lists.
function ComputeMaxDistNearestNeighbors
double ComputeMaxDistNearestNeighbors(
size_t dom
)
function SetFieldAttributes
inline void SetFieldAttributes(
const std::vector< std::string > & field_attributes
)
function GetFieldAttributes
inline const std::vector< std::string > & GetFieldAttributes() const
Protected Functions Documentation
function ParticleSystem
ParticleSystem()
function PrintSelf
void PrintSelf(
std::ostream & os,
itk::Indent indent
) const
function ~ParticleSystem
inline virtual ~ParticleSystem()
function GetInverseTransform
inline TransformType & GetInverseTransform(
unsigned int i
)
Return the i'th transform object.
function GetInverseTransform
inline TransformType & GetInverseTransform()
API for the single transform case.
function GetInversePrefixTransform
inline TransformType & GetInversePrefixTransform(
unsigned int i
)
Return the i'th transform object.
function GetInversePrefixTransform
inline TransformType & GetInversePrefixTransform()
API for the single transform case.
Public Attributes Documentation
variable VDimension
static constexpr int VDimension = 3;
Updated on 2024-11-11 at 19:51:45 +0000