DGtal 2.2.0
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
77
78 if (splitCount == 0)
79 return { SplitInfo{d, 0} };
80
81 auto splitSize = (d.upperBound() - d.lowerBound()) / (int32_t)splitCount;
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 };
HyperRectDomain< Space > Domain
Splits a domain evenly along all dimensions.
std::vector< SplitInfo< Domain > > SplitDomainsInfo

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