MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
CoordUtils.hpp
Go to the documentation of this file.
1#pragma once
2
4
5namespace MayaFlux::Kakshya {
6
7/**
8 * @brief Convert N-dimensional coordinates to a linear index for interleaved data.
9 * @param coords N-dimensional coordinates.
10 * @param dimensions Dimension descriptors (size/stride/role).
11 * @return Linear index into the underlying data storage.
12 * @note Only works with interleaved organization strategy. For planar data,
13 * use coordinates_to_planar_indices() instead.
14 */
15uint64_t coordinates_to_linear(const std::vector<uint64_t>& coords, const std::vector<DataDimension>& dimensions);
16
17/**
18 * @brief Convert a linear index to N-dimensional coordinates for interleaved data.
19 * @param index Linear index into the underlying data storage.
20 * @param dimensions Dimension descriptors (size/stride/role).
21 * @return N-dimensional coordinates.
22 * @note Only works with interleaved organization strategy. For planar data,
23 * coordinates map directly to {channel_vector_index, frame_index}.
24 */
25std::vector<uint64_t> linear_to_coordinates(uint64_t index, const std::vector<DataDimension>& dimensions);
26
27/**
28 * @brief Calculate memory strides for each dimension (row-major order).
29 * @param dimensions Dimension descriptors.
30 * @return Vector of strides for each dimension.
31 */
32std::vector<uint64_t> calculate_strides(const std::vector<DataDimension>& dimensions);
33
34/**
35 * @brief Validate region bounds against container dimensions.
36 * @param region Region to validate.
37 * @param dimensions Container dimensions.
38 * @return True if region is valid, false otherwise.
39 */
40bool validate_region_bounds(const Region& region, const std::vector<DataDimension>& dimensions);
41
42/**
43 * @brief Validate slice coordinates against container bounds.
44 * @param slice_start Starting coordinates.
45 * @param slice_end Ending coordinates.
46 * @param dimensions Container dimensions.
47 * @return True if slice is valid, false otherwise.
48 */
49bool validate_slice_bounds(const std::vector<uint64_t>& slice_start,
50 const std::vector<uint64_t>& slice_end,
51 const std::vector<DataDimension>& dimensions);
52
53/**
54 * @brief Clamp coordinates to valid container bounds.
55 * @param coords Coordinates to clamp (modified in place).
56 * @param dimensions Container dimensions for bounds.
57 */
58void clamp_coordinates_to_bounds(std::vector<uint64_t>& coords,
59 const std::vector<DataDimension>& dimensions);
60
61/**
62 * @brief Transform coordinates using scaling, translation, rotation.
63 * @param coords Input coordinates.
64 * @param scale_factors Scaling factors per dimension.
65 * @param offset_values Translation offset per dimension.
66 * @param rotation_params Optional rotation parameters.
67 * @return Transformed coordinates.
68 */
69std::vector<uint64_t> transform_coordinates(const std::vector<uint64_t>& coords,
70 const std::vector<double>& scale_factors = {},
71 const std::vector<int64_t>& offset_values = {},
72 const std::unordered_map<std::string, std::any>& rotation_params = {});
73
74/**
75 * @brief Wrap a position within loop boundaries if looping is enabled.
76 * @param position Current position.
77 * @param loop_start Loop start position.
78 * @param loop_end Loop end position.
79 * @param looping_enabled Whether looping is enabled.
80 * @return Wrapped position.
81 */
82std::vector<uint64_t> wrap_position_with_loop(const std::vector<uint64_t>& position, const Region& loop_region, bool looping_enabled);
83
84/**
85 * @brief Advance current positions by a number of frames, with optional looping.
86 * @param current_positions Current positions per channel.
87 * @param frames_to_advance Number of frames to advance.
88 * @param structure Container data structure (for total frames).
89 * @param looping_enabled Whether looping is enabled.
90 * @param loop_region Loop region for wrapping.
91 * @return New advanced positions per channel.
92 */
93std::vector<uint64_t> advance_position(
94 const std::vector<uint64_t>& current_positions,
95 uint64_t frames_to_advance,
96 const ContainerDataStructure& structure,
97 bool looping_enabled,
98 const Region& loop_region);
99
100/**
101 * @brief Advance current positions by specified frames per channel, with optional looping.
102 * @param current_positions Current positions per channel.
103 * @param frames_per_channel Frames to advance per channel.
104 * @param structure Container data structure (for total frames).
105 * @param looping_enabled Whether looping is enabled.
106 * @param loop_region Loop region for wrapping.
107 * @return New advanced positions per channel.
108 */
109std::vector<uint64_t> advance_position(
110 const std::vector<uint64_t>& current_positions,
111 const std::vector<uint64_t>& frames_per_channel,
112 const ContainerDataStructure& structure,
113 bool looping_enabled,
114 const Region& loop_region);
115
116/**
117 * @brief Convert time (seconds) to position (samples/frames) given a sample rate.
118 * @param time Time in seconds.
119 * @param sample_rate Sample rate (Hz).
120 * @return Position as integer index.
121 */
122uint64_t time_to_position(double time, double sample_rate);
123
124/**
125 * @brief Convert position (samples/frames) to time (seconds) given a sample rate.
126 * @param position Position as integer index.
127 * @param sample_rate Sample rate (Hz).
128 * @return Time in seconds.
129 */
130double position_to_time(uint64_t position, double sample_rate);
131
132/**
133 * @brief Calculate the frame size for a specific primary dimension.
134 * @param dimensions Dimension descriptors.
135 * @param primary_dim Index of the primary dimension.
136 * @return Frame size (product of all but the primary dimension).
137 */
138uint64_t calculate_frame_size_for_dimension(const std::vector<DataDimension>& dimensions, size_t primary_dim = 0);
139
140/**
141 * @brief Extract dimension roles as integers.
142 * @param dimensions Container dimensions.
143 * @return Vector of role values as integers.
144 */
145std::vector<int> extract_dimension_roles(const std::vector<DataDimension>& dimensions);
146
147/**
148 * @brief Extract dimension sizes.
149 * @param dimensions Container dimensions.
150 * @return Vector of dimension sizes.
151 */
152std::vector<uint64_t> extract_dimension_sizes(const std::vector<DataDimension>& dimensions);
153
154/**
155 * @brief Create structured dimension information.
156 * @param dimensions Container dimensions.
157 * @return Vector of maps containing dimension metadata.
158 */
159std::vector<std::unordered_map<std::string, std::any>> create_dimension_info(const std::vector<DataDimension>& dimensions);
160
161/**
162 * @brief Create coordinate mapping information for container.
163 * @param container The container to analyze.
164 * @return Map containing coordinate mapping metadata.
165 */
166std::unordered_map<std::string, std::any> create_coordinate_mapping(const std::shared_ptr<SignalSourceContainer>& container);
167
168/**
169 * @brief Convert coordinates to planar indices (channel vector + frame index).
170 * @param coords N-dimensional coordinates.
171 * @param dimensions Dimension descriptors.
172 * @return Pair of {channel_index, frame_index} for planar access.
173 * @note Only works with planar organization strategy.
174 */
175std::pair<size_t, uint64_t> coordinates_to_planar_indices(
176 const std::vector<uint64_t>& coords,
177 const std::vector<DataDimension>& dimensions);
178}
uint64_t coordinates_to_linear(const std::vector< uint64_t > &coords, const std::vector< DataDimension > &dimensions)
Convert N-dimensional coordinates to a linear index for interleaved data.
Definition CoordUtils.cpp:6
std::vector< std::unordered_map< std::string, std::any > > create_dimension_info(const std::vector< DataDimension > &dimensions)
Create structured dimension information.
void clamp_coordinates_to_bounds(std::vector< uint64_t > &coords, const std::vector< DataDimension > &dimensions)
Clamp coordinates to valid container bounds.
std::pair< size_t, uint64_t > coordinates_to_planar_indices(const std::vector< uint64_t > &coords, const std::vector< DataDimension > &dimensions)
Convert coordinates to planar indices (channel vector + frame index).
std::vector< int > extract_dimension_roles(const std::vector< DataDimension > &dimensions)
Extract dimension roles as integers.
bool validate_slice_bounds(const std::vector< uint64_t > &slice_start, const std::vector< uint64_t > &slice_end, const std::vector< DataDimension > &dimensions)
Validate slice coordinates against container bounds.
std::vector< uint64_t > advance_position(const std::vector< uint64_t > &current_positions, uint64_t frames_to_advance, const ContainerDataStructure &structure, bool looping_enabled, const Region &loop_region)
Advance current positions by a number of frames, with optional looping.
std::vector< uint64_t > calculate_strides(const std::vector< DataDimension > &dimensions)
Calculate memory strides for each dimension (row-major order).
std::vector< uint64_t > linear_to_coordinates(uint64_t index, const std::vector< DataDimension > &dimensions)
Convert a linear index to N-dimensional coordinates for interleaved data.
bool validate_region_bounds(const Region &region, const std::vector< DataDimension > &dimensions)
Validate region bounds against container dimensions.
double position_to_time(uint64_t position, double sample_rate)
Convert position (samples/frames) to time (seconds) given a sample rate.
uint64_t calculate_frame_size_for_dimension(const std::vector< DataDimension > &dimensions, size_t primary_dim)
Calculate the frame size for a specific primary dimension.
std::unordered_map< std::string, std::any > create_coordinate_mapping(const std::shared_ptr< SignalSourceContainer > &container)
Create coordinate mapping information for container.
std::vector< uint64_t > extract_dimension_sizes(const std::vector< DataDimension > &dimensions)
Extract dimension sizes.
uint64_t time_to_position(double time, double sample_rate)
Convert time (seconds) to position (samples/frames) given a sample rate.
std::vector< uint64_t > transform_coordinates(const std::vector< uint64_t > &coords, const std::vector< double > &scale_factors, const std::vector< int64_t > &offset_values, const std::unordered_map< std::string, std::any > &rotation_params)
Transform coordinates using scaling, translation, rotation.
std::vector< uint64_t > wrap_position_with_loop(const std::vector< uint64_t > &positions, const Region &loop_region, bool looping_enabled)
Wrap a position within loop boundaries if looping is enabled.