36 #ifndef VIGRA_BLOCKIFY_HXX
37 #define VIGRA_BLOCKIFY_HXX
39 #include "multi_array.hxx"
44 namespace blockify_detail
47 template <
unsigned int CurrentDimensions>
51 template <
unsigned int N,
class T,
class S,
class Shape>
52 static void make(MultiArrayView<N, T, S>&
source,
53 MultiArrayView<N, MultiArrayView<N, T, S> >& blocks,
54 Shape current_block_begin,
55 Shape current_block_end,
56 Shape current_block_pos,
59 typedef typename Shape::value_type size_type;
60 enum{ n = CurrentDimensions - 1};
62 size_type blocks_extend = blocks.shape(n);
64 vigra_assert(blocks_extend != 0,
"");
65 for(current_block_pos[n] = 0, current_block_begin[n] = 0, current_block_end[n] = block_shape[n];
66 current_block_pos[n] != blocks_extend - 1;
67 ++current_block_pos[n],
68 current_block_begin[n] += block_shape[n],
69 current_block_end[n] += block_shape[n])
71 blockify_impl<n>::make(source, blocks, current_block_begin, current_block_end, current_block_pos, block_shape);
73 current_block_end[n] = source.shape(n);
74 blockify_impl<n>::make(source, blocks, current_block_begin, current_block_end, current_block_pos, block_shape);
79 struct blockify_impl<0>
81 template <
unsigned int N,
class T,
class S,
class Shape>
82 static void make(MultiArrayView<N, T, S>& source,
83 MultiArrayView<N, MultiArrayView<N, T, S> >& blocks,
84 Shape current_block_begin,
85 Shape current_block_end,
86 Shape current_block_pos,
89 blocks[current_block_pos] = source.subarray(current_block_begin, current_block_end);
95 template <
unsigned int N,
class T,
class S>
96 MultiArray<N, MultiArrayView<N, T, S> >
99 using namespace blockify_detail;
103 for(
unsigned int n = 0; n != N; ++n)
105 blocks_shape[n] = source.shape(n) / block_shape[n];
106 if(blocks_shape[n] * block_shape[n] != source.shape(n))
109 MultiArray<N, MultiArrayView<N, T, S> > blocks(blocks_shape);
110 if(source.size() == 0)
115 blockify_impl<N>::make(source, blocks, a, b, c, block_shape);
121 #endif // VIGRA_BLOCKIFY_HXX
MultiArrayShape< actual_dimension >::type difference_type
Definition: multi_array.hxx:739
vigra::GridGraph< N, DirectedTag >::vertex_descriptor source(typename vigra::GridGraph< N, DirectedTag >::edge_descriptor const &e, vigra::GridGraph< N, DirectedTag > const &g)
Get a vertex descriptor for the start vertex of edge e in graph g (API: boost).
Definition: multi_gridgraph.hxx:2943