160 friend class detail_multi_blocking::MultiCoordToBlock<
SelfType>;
161 friend class detail_multi_blocking::MultiCoordToBlockWithBoarder<
SelfType>;
162 typedef C PointValue;
168 typedef detail_multi_blocking::BlockWithBorder<DIM, PointValue> BlockWithBorder;
172 typedef detail_multi_blocking::MultiCoordToBlockWithBoarder<SelfType> CoordToBwb;
173 typedef detail_multi_blocking::MultiCoordToBlock<SelfType> CoordToB;
179 const Shape & blockShape,
184 roiBlock_(roiBegin,roiEnd ==
Shape(0) ? shape : roiEnd),
185 blockShape_(blockShape),
186 blocksPerAxis_(vigra::SkipInitialization),
190 blocksPerAxis_ =
roiShape / blockShape_;
194 for(
size_t d=0; d<
DIM; ++d){
195 if(blocksPerAxis_[d]*blockShape_[d] <
roiShape[d] ){
198 numBlocks_ *= blocksPerAxis_[d];
203 for(
size_t d=0; d<
DIM; ++d){
229 BlockWithBorderIter blockWithBorderBegin(
const Shape & width)
const{
230 return BlockWithBorderIter(MultiCoordIter(blocksPerAxis_),
231 CoordToBwb(*
this, width));
234 BlockWithBorderIter blockWithBorderEnd(
const Shape & width)
const{
235 const MultiCoordIter beginIter(blocksPerAxis_);
236 return BlockWithBorderIter(beginIter.getEndIterator(),
237 CoordToBwb(*
this, width));
240 Block blockDescToBlock(
const BlockDesc & desc){
241 MultiCoordIter beginIter(blocksPerAxis_);
243 return *BlockIter(beginIter,CoordToB(*
this));
245 BlockIter blockBegin()
const{
246 return BlockIter(MultiCoordIter(blocksPerAxis_),CoordToB(*
this));
250 BlockIter blockEnd()
const{
251 const MultiCoordIter beginIter(blocksPerAxis_);
252 return BlockIter(beginIter.getEndIterator(),CoordToB(*
this));
256 Block blockDescToBlock(
const BlockDesc & blockDesc)
const{
257 MultiCoordIter iter(blocksPerAxis_);
259 return *BlockIter(iter,CoordToB(*
this));
265 return !insideVolBlock_.
contains(block);
269 const Shape & roiBegin()
const{
270 return roiBlock_.
begin();
273 const Shape & roiEnd()
const{
274 return roiBlock_.
end();
277 const Shape & shape()
const{
281 const Shape & blockShape()
const{
285 const Shape & blocksPerAxis()
const{
286 return blocksPerAxis_;
289 const std::vector<Block> & volumeBorderBlocks()
const{
290 return volumeBorderBlocks_;
294 std::vector<UInt32> intersectingBlocks(
295 const Shape roiBegin,
299 std::vector<UInt32> iBlocks;
300 const Block testBlock(roiBegin, roiEnd);
301 for(BlockIter iter=blockBegin(); iter!=blockEnd(); ++iter){
302 if(testBlock.intersects(*iter)){
303 iBlocks.push_back(i);
315 BlockWithBorder getBlockWithBorder(
const BlockDesc & blockDesc,
const Shape & width )
const{
316 const Point blockStart(blockDesc * blockShape_ + roiBlock_.
begin());
317 const Point blockEnd(blockStart + blockShape_);
318 const Block core = Block(blockStart, blockEnd) & roiBlock_ ;
320 border.addBorder(width);
321 border &= Block(shape_);
322 return BlockWithBorder( core, border );
326 Block getBlock(
const BlockDesc & blockDesc)
const{
327 const Point blockStart(blockDesc * blockShape_ + roiBlock_.
begin());
328 const Point blockEnd(blockStart + blockShape_);
329 return Block(blockStart, blockEnd) & roiBlock_;
335 Shape blocksPerAxis_;
339 std::vector<Block> volumeBorderBlocks_;
340 Block insideVolBlock_;