25 const out_iter_t out_end,
26 const out_coord_iter_t out_coord_begin,
27 const out_coord_iter_t out_coord_end,
28 const in_iter_t in_begin,
30 const in_coord_iter_t in_coord_begin,
31 const in_coord_iter_t in_coord_end,
32 const bool only_add_to_output,
33 const bool assign_rest_with_zeroes)
36 if (out_begin == out_end)
38 if (in_begin == in_end)
44 assert(out_coord_end - out_coord_begin - 1 == (out_end - out_begin));
45 assert(in_coord_end - in_coord_begin - 1 == (in_end - in_begin));
47 out_iter_t out_iter = out_begin;
48 out_coord_iter_t out_coord_iter = out_coord_begin;
50 in_iter_t in_iter = in_begin;
51 in_coord_iter_t in_coord_iter = in_coord_begin;
54 assert(in_coord_iter + 1 != in_coord_end);
55 while (*(in_coord_iter + 1) <= *out_coord_iter)
59 if (in_coord_iter + 1 == in_coord_end)
64 assert(out_coord_iter + 1 != out_coord_end);
65 while (*(out_coord_iter + 1) <= *in_coord_iter)
67 if (!only_add_to_output && assign_rest_with_zeroes)
71 if (out_coord_iter + 1 == out_coord_end)
76 assert(*(out_coord_iter + 1) > *in_coord_iter);
77 assert(*(in_coord_iter + 1) > *out_coord_iter);
80 typedef typename boost::iterator_value<out_coord_iter_t>::type coord_t;
85 = std::min(((*(out_coord_end - 1)) - (*out_coord_begin)) / ((out_coord_end - 1 - out_coord_begin) * 10000),
86 ((*(in_coord_end - 1)) - (*in_coord_begin)) / ((in_coord_end - 1 - in_coord_begin) * 10000));
91 coord_t current_coord = std::max(*in_coord_iter, *out_coord_iter);
92 bool first_time_for_this_out_box =
true;
96 const bool in_beyond_out = *(in_coord_iter + 1) > *(out_coord_iter + 1);
97 const coord_t new_coord = in_beyond_out ? *(out_coord_iter + 1) : *(in_coord_iter + 1);
98#ifndef STIR_OVERLAP_NORMALISATION
99 const coord_t overlap = (new_coord - current_coord);
101 const coord_t overlap = (new_coord - current_coord) / (*(out_coord_iter + 1) - *(out_coord_iter));
103 assert(overlap > -epsilon);
105 if (!only_add_to_output && first_time_for_this_out_box)
107 if (overlap > epsilon)
108 *out_iter = *in_iter * overlap;
111 first_time_for_this_out_box =
false;
115 if (overlap > epsilon)
116 *out_iter += *in_iter * overlap;
118 current_coord = new_coord;
123 if (out_iter == out_end)
125 assert(out_coord_iter + 1 == out_coord_end);
128 first_time_for_this_out_box =
true;
134 if (in_iter == in_end)
139 assert(in_coord_iter + 1 == in_coord_end);
141 if (!only_add_to_output && assign_rest_with_zeroes)
151 if (out_iter == out_end)
155 assert(out_coord_iter + 1 == out_coord_end);
void overlap_interpolate(VectorWithOffset< T > &out_data, const VectorWithOffset< T > &in_data, const float zoom, const float offset, const bool assign_rest_with_zeroes)
'overlap' interpolation (i.e. count preserving) for vectors.
Definition overlap_interpolate.cxx:102