From 2e836ead5c10f00917560e9a98d46b59b2f977d4 Mon Sep 17 00:00:00 2001 From: "Claudius \"keldu\" Holeksa" Date: Sat, 7 Nov 2026 18:05:26 +0100 Subject: Fixing double bracketing --- modules/codec/c++/math.hpp | 62 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 5 deletions(-) (limited to 'modules/codec/c++/math.hpp') diff --git a/modules/codec/c++/math.hpp b/modules/codec/c++/math.hpp index 1d627e6..f831256 100644 --- a/modules/codec/c++/math.hpp +++ b/modules/codec/c++/math.hpp @@ -36,12 +36,30 @@ public: }; namespace math { -/* +/** + * Builds a scalar from its native value. Shorthand for the two step + * data{value} -> data>{...} conversion, which the language won't + * do implicitly. + */ template -data norm_2(const data& d){ - return {}; +constexpr data, Encoding> make_scalar(typename native_data_type::type value){ + return data, Encoding>{data{value}}; +} + +/** + * Builds a vector from its native component values. The dimension is deduced + * from the argument count. + */ +template +constexpr data, Encoding> make_vector(Args... args){ + return data, Encoding>{ + data, Encoding>{ + std::array, sizeof...(Args)>{ + data{static_cast::type>(args)}... + } + } + }; } -*/ template data, Encoding> dot(const data, Encoding>& left, const data, Encoding>& right){ @@ -61,6 +79,14 @@ data,Encoding> sqrt(const data,Encoding>& in return out; } +/** + * Euclidean length of a vector. + */ +template +data, Encoding> norm(const data, Encoding>& input){ + return sqrt(dot(input,input)); +} + template data, Encoding> normalize(const data>& input ) { auto inp_dot = dot(input,input); @@ -174,6 +200,32 @@ data,Encoding> sin( } +/** + * Angle of a 2d vector measured counter clockwise from the positive x axis. + * Inverse of unit_vector(). + */ +template +data,Encoding> angle( + const data, Encoding>& vec +){ + data,Encoding> ret; + ret.at({}).set(std::atan2(vec.at({{1u}}).get(), vec.at({{0u}}).get())); + return ret; +} + +/** + * Unit length 2d vector pointing along the given angle. Inverse of angle(). + */ +template +data,Encoding> unit_vector( + const data, Encoding>& rot +){ + data,Encoding> ret; + ret.at({{0u}}) = cos(rot).at({}); + ret.at({{1u}}) = sin(rot).at({}); + return ret; +} + template data,Encoding> rotate( const data, Encoding> vec, @@ -192,7 +244,7 @@ data,Encoding> scale( ){ data, Encoding> sc_vec; for(uint64_t i = 0u; i< D; ++i){ - sc_vec.at({{i}}) = vec.at({{i}}) * scale; + sc_vec.at({{i}}) = vec.at({{i}}) * scale.at({}); } return sc_vec; } -- cgit v1.3.1