MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ transform_coordinates()

std::vector< uint64_t > MayaFlux::Kakshya::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.

Parameters
coordsInput coordinates.
scale_factorsScaling factors per dimension.
offset_valuesTranslation offset per dimension.
rotation_paramsOptional rotation parameters.
Returns
Transformed coordinates.

Definition at line 80 of file CoordUtils.cpp.

84{
85 std::vector<uint64_t> transformed = coords;
86
87 if (!scale_factors.empty()) {
88 for (size_t i = 0; i < coords.size() && i < scale_factors.size(); ++i) {
89 transformed[i] = static_cast<uint64_t>(scale_factors[i] * static_cast<double>(coords[i]));
90 }
91 }
92
93 if (!offset_values.empty()) {
94 for (size_t i = 0; i < transformed.size() && i < offset_values.size(); ++i) {
95 int64_t new_coord = static_cast<int64_t>(transformed[i]) + offset_values[i];
96 transformed[i] = static_cast<uint64_t>(std::max(int64_t(0), new_coord));
97 }
98 }
99
100 if (!rotation_params.empty() && coords.size() >= 2) {
101 auto angle_it = rotation_params.find("angle_radians");
102 if (angle_it != rotation_params.end()) {
103 try {
104 auto angle = safe_any_cast_or_throw<double>(angle_it->second);
105 double cos_a = std::cos(angle);
106 double sin_a = std::sin(angle);
107
108 auto x = static_cast<double>(transformed[0]);
109 auto y = static_cast<double>(transformed[1]);
110
111 transformed[0] = static_cast<uint64_t>(x * cos_a - y * sin_a);
112 transformed[1] = static_cast<uint64_t>(x * sin_a + y * cos_a);
113 } catch (const std::bad_any_cast&) {
114 // TODO: DO better than ignore invalid
115 }
116 }
117 }
118
119 return transformed;
120}