STIR 6.4.0
sampling_functions.inl
1//
2//
3/*
4Copyright (C) 2005- 2009, Hammersmith Imanet Ltd
5Copyright 2023, Positrigo AG, Zurich
6This file is part of STIR.
7
8 SPDX-License-Identifier: Apache-2.0
9
10 See STIR/LICENSE.txt for details
11*/
20#include "stir/warning.h"
21START_NAMESPACE_STIR
22
23template <class FunctionType, class elemT, class positionT>
24void
26 FunctionType func,
29{
30 BasicCoordinate<3, int> min_out, max_out;
31 IndexRange<3> out_range = out.get_index_range();
32 if (!out_range.get_regular_range(min_out, max_out))
33 warning("Output must be regular range!");
34
36 BasicCoordinate<3, positionT> relative_positions;
37 index_out[1] = min_out[1];
38 relative_positions[1] = index_out[1] * step[1] - offset[1];
39 const BasicCoordinate<3, positionT> max_relative_positions
40 = (BasicCoordinate<3, positionT>(max_out) + static_cast<positionT>(.001)) * step - offset;
41 for (; index_out[1] <= max_out[1] && relative_positions[1] <= max_relative_positions[1];
42 ++index_out[1], relative_positions[1] += step[1])
43 {
44 index_out[2] = min_out[2];
45 relative_positions[2] = index_out[2] * step[2] - offset[2];
46 for (; index_out[2] <= max_out[2] && relative_positions[2] <= max_relative_positions[2];
47 ++index_out[2], relative_positions[2] += step[2])
48 {
49 index_out[3] = min_out[3];
50 relative_positions[3] = index_out[3] * step[3] - offset[3];
51 for (; index_out[3] <= max_out[3] && relative_positions[3] <= max_relative_positions[3];
52 ++index_out[3], relative_positions[3] += step[3])
53 out[index_out] = func(relative_positions);
54 }
55 }
56}
57
58template <typename elemT, typename FunctionType, typename Lambda>
59void
60sample_function_using_index_converter(Array<3, elemT>& out, FunctionType func, Lambda&& index_converter)
61{
62 BasicCoordinate<3, int> min_out, max_out;
63 IndexRange<3> out_range = out.get_index_range();
64 if (!out_range.get_regular_range(min_out, max_out))
65 warning("Output must be regular range!");
66
68 for (index_out[1] = min_out[1]; index_out[1] <= max_out[1]; ++index_out[1])
69 {
70 for (index_out[2] = min_out[2]; index_out[2] <= max_out[2]; ++index_out[2])
71 {
72 for (index_out[3] = min_out[3]; index_out[3] <= max_out[3]; ++index_out[3])
73 {
74 auto index_in = index_converter(index_out);
75 out[index_out] = func(index_in);
76 }
77 }
78 }
79}
80
81END_NAMESPACE_STIR
This class defines multi-dimensional (numeric) arrays.
Definition Array.h:78
class BasicCoordinate<int num_dimensions, typename coordT> defines num_dimensions -dimensional coordi...
Definition BasicCoordinate.h:57
This class defines ranges which can be 'irregular'.
Definition IndexRange.h:69
bool get_regular_range(BasicCoordinate< num_dimensions, int > &min, BasicCoordinate< num_dimensions, int > &max) const
find regular range, returns false if the range is not regular
Definition IndexRange.cxx:29
void warning(const char *const s,...)
Print warning with format string a la printf.
Definition warning.cxx:41
void sample_function_on_regular_grid(Array< 3, elemT > &out, FunctionType func, const BasicCoordinate< 3, positionT > &offset, const BasicCoordinate< 3, positionT > &step)
Generic function to get the values of a 3D function on a regular grid.
Definition sampling_functions.inl:25
void sample_function_using_index_converter(Array< 3, elemT > &out, FunctionType func, Lambda &&index_converter)
Generic function to get the values of a 3D function on a grid.
Definition sampling_functions.inl:60
Declaration of stir::warning()