From 9f5cc3a7453db281fed2ace7577b849493bfb146 Mon Sep 17 00:00:00 2001 From: Maxim Kasyanenko Date: Mon, 8 Nov 2021 16:28:55 -0800 Subject: [PATCH 1/6] Implement a few complex routines --- include/cglm/vec2-ext.h | 49 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/include/cglm/vec2-ext.h b/include/cglm/vec2-ext.h index 9317d77..e9711c2 100644 --- a/include/cglm/vec2-ext.h +++ b/include/cglm/vec2-ext.h @@ -20,6 +20,9 @@ CGLM_INLINE bool glm_vec2_isvalid(vec2 v); CGLM_INLINE void glm_vec2_sign(vec2 v, vec2 dest); CGLM_INLINE void glm_vec2_sqrt(vec2 v, vec2 dest); + CGLM_INLINE void glm_vec2_complex_mul(vec2 a, vec2 b, vec2 dest) + CGLM_INLINE void glm_vec2_complex_div(vec2 a, vec2 b, vec2 dest) + CGLM_INLINE void glm_vec2_complex_conjugate(vec2 a, vec2 dest) */ #ifndef cglm_vec2_ext_h @@ -186,4 +189,50 @@ glm_vec2_sqrt(vec2 v, vec2 dest) { dest[1] = sqrtf(v[1]); } +/*! + * @brief treat vectors as complex numbers and multiply them as such. + * + * @param[in] a left number + * @param[in] b right number + * @param[out] dest destination number + */ +CGLM_INLINE +glm_vec2_complex_mul(vec2 a, vec2 b, vec2 dest) { + float tr, ti; + tr = a[0] * b[0] - a[1] * b[1]; + ti = a[0] * b[1] + a[1] * b[0]; + dest[0] = tr; + dest[1] = ti; +} + +/*! + * @brief treat vectors as complex numbers and divide them as such. + * + * @param[in] a left number (numerator) + * @param[in] b right number (denominator) + * @param[out] dest destination number + */ +CGLM_INLINE +glm_vec2_complex_div(vec2 a, vec2 b, vec2 dest) { + float tr, ti; + float const ibnorm2 = 1.0f / (b[0] * b[0] + b[1] * b[1]); + tr = ibnorm * (a[0] * b[0] + a[1] * b[1]) + ti = ibnorm * (a[1] * b[0] - a[0] * b[1]) + dest[0] = tr; + dest[1] = ti; +} + +/*! + * @brief treat the vector as a complex number and conjugate it as such. + * + * @param[in] a the number + * @param[out] dest destination number + */ +CGLM_INLINE +glm_vec2_complex_conjugate(vec2 a, vec2 dest) { + dest[0] = a[0] + dest[1] = -a[1]; +} + + #endif /* cglm_vec2_ext_h */ From 4603816330f719f489f663ff5aea7ee6ac5c5103 Mon Sep 17 00:00:00 2001 From: Maxim Kasyanenko Date: Mon, 8 Nov 2021 17:09:28 -0800 Subject: [PATCH 2/6] Forgot return type --- include/cglm/vec2-ext.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/cglm/vec2-ext.h b/include/cglm/vec2-ext.h index e9711c2..2cb5df3 100644 --- a/include/cglm/vec2-ext.h +++ b/include/cglm/vec2-ext.h @@ -197,6 +197,7 @@ glm_vec2_sqrt(vec2 v, vec2 dest) { * @param[out] dest destination number */ CGLM_INLINE +void glm_vec2_complex_mul(vec2 a, vec2 b, vec2 dest) { float tr, ti; tr = a[0] * b[0] - a[1] * b[1]; @@ -213,6 +214,7 @@ glm_vec2_complex_mul(vec2 a, vec2 b, vec2 dest) { * @param[out] dest destination number */ CGLM_INLINE +void glm_vec2_complex_div(vec2 a, vec2 b, vec2 dest) { float tr, ti; float const ibnorm2 = 1.0f / (b[0] * b[0] + b[1] * b[1]); @@ -229,6 +231,7 @@ glm_vec2_complex_div(vec2 a, vec2 b, vec2 dest) { * @param[out] dest destination number */ CGLM_INLINE +void glm_vec2_complex_conjugate(vec2 a, vec2 dest) { dest[0] = a[0] dest[1] = -a[1]; From 896ba0a0f908adb62609ed53dbf10792687eac88 Mon Sep 17 00:00:00 2001 From: Maxim Kasyanenko Date: Mon, 8 Nov 2021 17:52:31 -0800 Subject: [PATCH 3/6] Add dynamic/struct versions of routines --- include/cglm/call/vec2.h | 12 ++++++++++ include/cglm/struct/vec2-ext.h | 41 ++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/include/cglm/call/vec2.h b/include/cglm/call/vec2.h index d4d3396..6e8101e 100644 --- a/include/cglm/call/vec2.h +++ b/include/cglm/call/vec2.h @@ -149,6 +149,18 @@ CGLM_EXPORT void glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest); +CGLM_EXPORT +void +glmc_vec2_complex_mul(vec2 a, vec2 b, vec2 dest); + +CGLM_EXPORT +void +glmc_vec2_complex_div(vec2 a, vec2 b, vec2 dest); + +CGLM_EXPORT +void +glmc_vec2_complex_conjugate(vec2 a, vec2 dest); + #ifdef __cplusplus } #endif diff --git a/include/cglm/struct/vec2-ext.h b/include/cglm/struct/vec2-ext.h index d77debe..5d6682d 100644 --- a/include/cglm/struct/vec2-ext.h +++ b/include/cglm/struct/vec2-ext.h @@ -195,4 +195,45 @@ glms_vec2_sqrt(vec2s v) { return r; } +/*! + * @brief treat vectors as complex numbers and multiply them as such. + * + * @param[in] a left number + * @param[in] b right number + * @param[out] dest destination number + */ +CGLM_INLINE +vec2s +glms_vec2_complex_mul(vec2s a, vec2s b, vec2s dest) { + glm_vec2_complex_mul(a.raw, b.raw, dest.raw); + return dest; +} + +/*! + * @brief treat vectors as complex numbers and divide them as such. + * + * @param[in] a left number (numerator) + * @param[in] b right number (denominator) + * @param[out] dest destination number + */ +CGLM_INLINE +vec2s +glms_vec2_complex_div(vec2s a, vec2s b, vec2s dest) { + glm_vec2_complex_div(a.raw, b.raw, dest.raw); + return dest; +} + +/*! + * @brief treat the vector as a complex number and conjugate it as such. + * + * @param[in] a the number + * @param[out] dest destination number + */ +CGLM_INLINE +vec2s +glms_vec2_complex_conjugate(vec2s a, vec2s dest) { + glm_vec2_complex_conjugate(a.raw, dest.raw); + return dest; +} + #endif /* cglms_vec2s_ext_h */ From 98c708281f3a8db0775f862efa5a350ea74343b0 Mon Sep 17 00:00:00 2001 From: Maxim Kasyanenko Date: Mon, 8 Nov 2021 17:52:47 -0800 Subject: [PATCH 4/6] Syntax errors --- include/cglm/vec2-ext.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/cglm/vec2-ext.h b/include/cglm/vec2-ext.h index 2cb5df3..388c5e2 100644 --- a/include/cglm/vec2-ext.h +++ b/include/cglm/vec2-ext.h @@ -218,8 +218,8 @@ void glm_vec2_complex_div(vec2 a, vec2 b, vec2 dest) { float tr, ti; float const ibnorm2 = 1.0f / (b[0] * b[0] + b[1] * b[1]); - tr = ibnorm * (a[0] * b[0] + a[1] * b[1]) - ti = ibnorm * (a[1] * b[0] - a[0] * b[1]) + tr = ibnorm2 * (a[0] * b[0] + a[1] * b[1]); + ti = ibnorm2 * (a[1] * b[0] - a[0] * b[1]); dest[0] = tr; dest[1] = ti; } @@ -233,7 +233,7 @@ glm_vec2_complex_div(vec2 a, vec2 b, vec2 dest) { CGLM_INLINE void glm_vec2_complex_conjugate(vec2 a, vec2 dest) { - dest[0] = a[0] + dest[0] = a[0]; dest[1] = -a[1]; } From b7178749eecf8dd6961373d71420772320b32661 Mon Sep 17 00:00:00 2001 From: Maxim Kasyanenko Date: Mon, 8 Nov 2021 17:53:27 -0800 Subject: [PATCH 5/6] Forgot to add the dynamic implementation file itself --- src/vec2.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/vec2.c b/src/vec2.c index 3048688..a75f3f0 100644 --- a/src/vec2.c +++ b/src/vec2.c @@ -211,3 +211,21 @@ void glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest) { glm_vec2_lerp(from, to, t, dest); } + +CGLM_EXPORT +void +glmc_vec2_complex_mul(vec2 a, vec2 b, vec2 dest) { + glm_vec2_complex_mul(a, b, dest); +} + +CGLM_EXPORT +void +glmc_vec2_complex_div(vec2 a, vec2 b, vec2 dest) { + glm_vec2_complex_div(a, b, dest); +} + +CGLM_EXPORT +void +glmc_vec2_complex_conjugate(vec2 a, vec2 dest) { + glm_vec2_complex_conjugate(a, dest); +} From 522b18bda9bf6334082194a6794891b8814adb78 Mon Sep 17 00:00:00 2001 From: Maxim Kasyanenko Date: Mon, 8 Nov 2021 17:53:39 -0800 Subject: [PATCH 6/6] Add tests --- test/src/test_vec2.h | 29 +++++++++++++++++++++++++++++ test/tests.h | 8 ++++++++ 2 files changed, 37 insertions(+) diff --git a/test/src/test_vec2.h b/test/src/test_vec2.h index 5f04c49..9e53f72 100644 --- a/test/src/test_vec2.h +++ b/test/src/test_vec2.h @@ -594,3 +594,32 @@ TEST_IMPL(GLM_PREFIX, vec2_lerp) { TEST_SUCCESS } + +TEST_IMPL(GLM_PREFIX, vec2_complex_mul) { + vec2 v1 = { 3.0f, 5.0f }, + v2 = { 7.0f, 11.0f }, + v3 = { cosf(M_PI/4.0f), sinf(M_PI/4.0f) }; + + GLM(vec2_complex_mul)(v1, v2, v2); + ASSERTIFY(test_assert_vec2_eq(v2, (vec2){ -34, 68 })) + + GLM(vec2_complex_mul)(v3, v3, v3); + ASSERTIFY(test_assert_vec2_eq(v3, (vec2){ 0.0f, 1.0f })) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, vec2_complex_div) { + vec2 v1 = { -34.0f, 68.0f }, + v2 = { 3.0f, 5.0f }, + v3 = { cosf(M_PI/4.0f), sinf(M_PI/4.0f) }, + v4 = { cosf(M_PI/4.0f), -sinf(M_PI/4.0f) }; + + GLM(vec2_complex_div)(v1, v2, v2); + ASSERTIFY(test_assert_vec2_eq(v2, (vec2){ 7.0f, 11.0f })) + + GLM(vec2_complex_div)(v3, v4, v4); + ASSERTIFY(test_assert_vec2_eq(v4, (vec2){ 0.0f, 1.0f })) + + TEST_SUCCESS +} diff --git a/test/tests.h b/test/tests.h index bd1eaa1..6801298 100644 --- a/test/tests.h +++ b/test/tests.h @@ -382,6 +382,8 @@ TEST_DECLARE(glm_vec2_maxv) TEST_DECLARE(glm_vec2_minv) TEST_DECLARE(glm_vec2_clamp) TEST_DECLARE(glm_vec2_lerp) +TEST_DECLARE(glm_vec2_complex_mul) +TEST_DECLARE(glm_vec2_complex_div) TEST_DECLARE(glmc_vec2) @@ -418,6 +420,8 @@ TEST_DECLARE(glmc_vec2_maxv) TEST_DECLARE(glmc_vec2_minv) TEST_DECLARE(glmc_vec2_clamp) TEST_DECLARE(glmc_vec2_lerp) +TEST_DECLARE(glmc_vec2_complex_mul) +TEST_DECLARE(glmc_vec2_complex_div) /* vec3 */ TEST_DECLARE(MACRO_GLM_VEC3_ONE_INIT) @@ -1112,6 +1116,8 @@ TEST_LIST { TEST_ENTRY(glm_vec2_minv) TEST_ENTRY(glm_vec2_clamp) TEST_ENTRY(glm_vec2_lerp) + TEST_ENTRY(glm_vec2_complex_mul) + TEST_ENTRY(glm_vec2_complex_div) TEST_ENTRY(glmc_vec2) TEST_ENTRY(glmc_vec2_copy) @@ -1147,6 +1153,8 @@ TEST_LIST { TEST_ENTRY(glmc_vec2_minv) TEST_ENTRY(glmc_vec2_clamp) TEST_ENTRY(glmc_vec2_lerp) + TEST_ENTRY(glmc_vec2_complex_mul) + TEST_ENTRY(glmc_vec2_complex_div) /* vec3 */ /* Macros */