DGtal 2.1.1
Loading...
Searching...
No Matches
DGtal::RegularDomainSplitter< Domain > Struct Template Reference

Splits a domain evenly along all dimensions. More...

#include <DGtal/kernel/domains/DomainSplitter.h>

Public Types

typedef std::vector< SplitInfo< Domain > > SplitDomainsInfo
 

Public Member Functions

 BOOST_CONCEPT_ASSERT ((concepts::CDomain< Domain >))
 
SplitDomainsInfo operator() (const Domain &d, uint32_t splitHint) const
 Splits a domain.
 

Detailed Description

template<typename Domain>
struct DGtal::RegularDomainSplitter< Domain >

Splits a domain evenly along all dimensions.

Template Parameters
Themodel of domain to split

Definition at line 56 of file DomainSplitter.h.

Member Typedef Documentation

◆ SplitDomainsInfo

template<typename Domain >
typedef std::vector<SplitInfo<Domain> > DGtal::RegularDomainSplitter< Domain >::SplitDomainsInfo

Definition at line 61 of file DomainSplitter.h.

Member Function Documentation

◆ BOOST_CONCEPT_ASSERT()

template<typename Domain >
DGtal::RegularDomainSplitter< Domain >::BOOST_CONCEPT_ASSERT ( (concepts::CDomain< Domain >)  )

◆ operator()()

template<typename Domain >
SplitDomainsInfo DGtal::RegularDomainSplitter< Domain >::operator() ( const Domain d,
uint32_t  splitHint 
) const
inline

Splits a domain.

This functions may split the domain in fewer part than wanted to ensure even subdomains.

Parameters
dThe domain to split
splitHintThe targeted number of splits

Definition at line 72 of file DomainSplitter.h.

73 {
74 // Find best match possible for even splitting
75 const uint32_t splitCount = std::floor(std::log(splitHint) / std::log(Domain::dimension));
76 const uint32_t totalSplits = std::pow(splitCount, Domain::dimension);
77
78 if (splitCount == 0)
79 return { SplitInfo{d, 0} };
80
81 auto splitSize = (d.upperBound() - d.lowerBound()) / (int32_t)splitCount;
82 SplitDomainsInfo result;
83 result.reserve(totalSplits);
84
85 for (uint32_t i = 0; i < totalSplits; ++i)
86 {
87 auto start = d.lowerBound();
88 auto idx = i;
89 for (uint32_t j = 0; j < Domain::dimension; ++j)
90 {
91 auto k = idx % splitCount;
92 start[j] += k * splitSize[j] + k; // +k ensure no overlap between domains
93 idx /= splitCount;
94 }
95
96 // Make correction to ensure it remains within the domain
97 auto end = start + splitSize;
98 for (uint32_t j = 0; j < Domain::dimension; ++j)
99 end[j] = std::clamp(end[j], d.lowerBound()[j], d.upperBound()[j]);
100
101 result.emplace_back(Domain(start, end), 0);
102 }
103
104 return result;
105 };
std::int32_t int32_t
signed 32-bit integer.
Definition BasicTypes.h:71
std::uint32_t uint32_t
unsigned 32-bit integer.
Definition BasicTypes.h:62
std::vector< SplitInfo< Domain > > SplitDomainsInfo
HyperRectDomain< Space > Domain

References DGtal::HyperRectDomain< TSpace >::lowerBound(), and DGtal::HyperRectDomain< TSpace >::upperBound().


The documentation for this struct was generated from the following file: