DGtal
2.2.0
Toggle main menu visibility
Loading...
Searching...
No Matches
DomainSplitter.h
1
16
17
#pragma once
18
28
29
#include "DGtal/kernel/domains/CDomain.h"
30
#include <vector>
31
32
namespace
DGtal
33
{
41
template
<
typename
Domain>
42
struct
SplitInfo
43
{
44
BOOST_CONCEPT_ASSERT
((
concepts::CDomain< Domain >
));
45
46
Domain
domain
;
//< The actual split domain
47
uint32_t
hintVoxelCount
= 0;
//< An expected guess for the number of voxel
48
};
49
55
template
<
typename
Domain>
56
struct
RegularDomainSplitter
57
{
58
BOOST_CONCEPT_ASSERT
((
concepts::CDomain< Domain >
));
59
60
//Output spllitted domain type
61
typedef
std::vector<SplitInfo<Domain>>
SplitDomainsInfo
;
62
72
SplitDomainsInfo
operator()
(
const
Domain
& d,
uint32_t
splitHint)
const
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
};
106
};
107
108
114
template
<
typename
Domain>
115
struct
AxisDomainSplitter
116
{
117
118
BOOST_CONCEPT_ASSERT
((
concepts::CDomain< Domain >
));
119
120
//Output spllitted domain type
121
typedef
std::vector<SplitInfo<Domain>>
SplitDomainsInfo
;
122
typedef
typename
Domain::Dimension
Dimension
;
123
125
Dimension
axis
;
126
132
explicit
AxisDomainSplitter
(
Dimension
dim
= 0 )
133
:
axis
(
dim
)
134
{}
135
142
SplitDomainsInfo
operator()
(
const
Domain
& d,
uint32_t
splitHint )
const
143
{
144
return
(*
this
)( d, splitHint,
axis
);
145
}
146
154
SplitDomainsInfo
operator()
(
const
Domain
& d,
uint32_t
splitHint,
Dimension
dim
)
const
155
{
156
SplitDomainsInfo
result;
157
if
(splitHint == 0)
158
return
result;
159
160
auto
lower
= d.lowerBound();
161
auto
upper
= d.upperBound();
162
auto
length =
upper
[
dim
] -
lower
[
dim
] + 1;
163
uint32_t
splitCount = splitHint;
164
if
(splitCount > length)
165
splitCount = length;
166
167
result.reserve(splitCount);
168
auto
base = length / splitCount;
169
auto
rem = length % splitCount;
170
171
auto
start =
lower
;
172
for
(
uint32_t
i = 0; i < splitCount; ++i)
173
{
174
auto
size = base + (i < rem ? 1 : 0);
175
auto
end =
upper
;
176
end[
dim
] = start[
dim
] + size - 1;
177
result.emplace_back(
Domain
(start, end), 0);
178
start[
dim
] = end[
dim
] + 1;
179
}
180
181
return
result;
182
};
183
};
184
185
}
DGtal::HyperRectDomain< Space >::Domain
HyperRectDomain< Space > Domain
Definition
HyperRectDomain.h:112
DGtal::HyperRectDomain< Space >::Dimension
Space::Dimension Dimension
Definition
HyperRectDomain.h:116
DGtal::Domain
DGtal
DGtal is the top-level namespace which contains all DGtal functions and types.
Definition
ClosedIntegerHalfPlane.h:49
DGtal::int32_t
std::int32_t int32_t
signed 32-bit integer.
Definition
BasicTypes.h:71
DGtal::uint32_t
std::uint32_t uint32_t
unsigned 32-bit integer.
Definition
BasicTypes.h:62
DGtal::AxisDomainSplitter::BOOST_CONCEPT_ASSERT
BOOST_CONCEPT_ASSERT((concepts::CDomain< Domain >))
DGtal::AxisDomainSplitter::AxisDomainSplitter
AxisDomainSplitter(Dimension dim=0)
Constructor.
Definition
DomainSplitter.h:132
DGtal::AxisDomainSplitter::axis
Dimension axis
The axis used for the default split operator.
Definition
DomainSplitter.h:125
DGtal::AxisDomainSplitter::operator()
SplitDomainsInfo operator()(const Domain &d, uint32_t splitHint, Dimension dim) const
Regularly splits a domain along one axis.
Definition
DomainSplitter.h:154
DGtal::AxisDomainSplitter::SplitDomainsInfo
std::vector< SplitInfo< Domain > > SplitDomainsInfo
Definition
DomainSplitter.h:121
DGtal::AxisDomainSplitter::Dimension
Domain::Dimension Dimension
Definition
DomainSplitter.h:122
DGtal::AxisDomainSplitter::operator()
SplitDomainsInfo operator()(const Domain &d, uint32_t splitHint) const
Regularly splits a domain along one axis.
Definition
DomainSplitter.h:142
DGtal::RegularDomainSplitter
Splits a domain evenly along all dimensions.
Definition
DomainSplitter.h:57
DGtal::RegularDomainSplitter::operator()
SplitDomainsInfo operator()(const Domain &d, uint32_t splitHint) const
Splits a domain.
Definition
DomainSplitter.h:72
DGtal::RegularDomainSplitter::BOOST_CONCEPT_ASSERT
BOOST_CONCEPT_ASSERT((concepts::CDomain< Domain >))
DGtal::RegularDomainSplitter::SplitDomainsInfo
std::vector< SplitInfo< Domain > > SplitDomainsInfo
Definition
DomainSplitter.h:61
DGtal::SplitInfo
Data structure returned by Domain splitters.
Definition
DomainSplitter.h:43
DGtal::SplitInfo::BOOST_CONCEPT_ASSERT
BOOST_CONCEPT_ASSERT((concepts::CDomain< Domain >))
DGtal::SplitInfo::hintVoxelCount
uint32_t hintVoxelCount
Definition
DomainSplitter.h:47
DGtal::SplitInfo::domain
Domain domain
Definition
DomainSplitter.h:46
DGtal::concepts::CDomain
Aim: This concept represents a digital domain, i.e. a non mutable subset of points of the given digit...
Definition
CDomain.h:130
dim
#define dim
Definition
testImageContainerByHashTree.cpp:40
lower
Vector lower(const Vector &z, unsigned int k)
Definition
viewDualSurface.cpp:189
upper
Vector upper(const Vector &z, unsigned int k)
Definition
viewDualSurface.cpp:196
src
DGtal
kernel
domains
DomainSplitter.h
Generated on
for DGtal by
1.18.0