diff --git a/docs/source/vec2.rst b/docs/source/vec2.rst index f26abb38..f5b992e8 100644 --- a/docs/source/vec2.rst +++ b/docs/source/vec2.rst @@ -45,6 +45,7 @@ Functions: #. :c:func:`glm_vec2_normalize` #. :c:func:`glm_vec2_normalize_to` #. :c:func:`glm_vec2_rotate` +#. :c:func:`glm_vec2_center` #. :c:func:`glm_vec2_distance2` #. :c:func:`glm_vec2_distance` #. :c:func:`glm_vec2_maxv` @@ -314,6 +315,15 @@ Functions documentation | *[in]* **axis** axis vector | *[out]* **dest** destination +.. c:function:: void glm_vec2_center(vec2 v1, vec2 v2, vec2 dest) + + find center point of two vector + + Parameters: + | *[in]* **v1** vector1 + | *[in]* **v2** vector2 + | *[out]* **dest** center point + .. c:function:: float glm_vec2_distance2(vec2 v1, vec2 v2) squared distance between two vectors diff --git a/include/cglm/call/vec2.h b/include/cglm/call/vec2.h index 6ccdc1f5..87ca60ba 100644 --- a/include/cglm/call/vec2.h +++ b/include/cglm/call/vec2.h @@ -125,6 +125,10 @@ CGLM_EXPORT void glmc_vec2_rotate(vec2 v, float angle, vec2 dest); +CGLM_EXPORT +void +glmc_vec2_center(vec2 a, vec2 b, vec2 dest); + CGLM_EXPORT float glmc_vec2_distance2(vec2 a, vec2 b); diff --git a/include/cglm/struct/vec2.h b/include/cglm/struct/vec2.h index 555b8184..d9994048 100644 --- a/include/cglm/struct/vec2.h +++ b/include/cglm/struct/vec2.h @@ -40,6 +40,7 @@ CGLM_INLINE vec2s glms_vec2_negate(vec2s v) CGLM_INLINE vec2s glms_vec2_normalize(vec2s v) CGLM_INLINE vec2s glms_vec2_rotate(vec2s v, float angle, vec2s axis) + CGLM_INLINE vec2s glms_vec2_center(vec2s a, vec2s b) CGLM_INLINE float glms_vec2_distance(vec2s a, vec2s b) CGLM_INLINE float glms_vec2_distance2(vec2s a, vec2s b) CGLM_INLINE vec2s glms_vec2_maxv(vec2s a, vec2s b) @@ -470,6 +471,21 @@ glms_vec2_(rotate)(vec2s v, float angle) { return r; } +/** + * @brief find center point of two vector + * + * @param[in] a vector1 + * @param[in] b vector2 + * @returns center point + */ +CGLM_INLINE +vec2s +glms_vec2_(center)(vec2s a, vec2s b) { + vec2s r; + glm_vec2_center(a.raw, b.raw, r.raw); + return r; +} + /** * @brief distance between two vectors * diff --git a/include/cglm/vec2.h b/include/cglm/vec2.h index e9f92e7f..5d5fd8a0 100644 --- a/include/cglm/vec2.h +++ b/include/cglm/vec2.h @@ -41,6 +41,7 @@ CGLM_INLINE void glm_vec2_normalize(vec2 v) CGLM_INLINE void glm_vec2_normalize_to(vec2 vec, vec2 dest) CGLM_INLINE void glm_vec2_rotate(vec2 v, float angle, vec2 dest) + CGLM_INLINE void glm_vec2_center(vec2 a, vec2 b, vec2 dest) CGLM_INLINE float glm_vec2_distance2(vec2 a, vec2 b) CGLM_INLINE float glm_vec2_distance(vec2 a, vec2 b) CGLM_INLINE void glm_vec2_maxv(vec2 v1, vec2 v2, vec2 dest) @@ -493,6 +494,20 @@ glm_vec2_rotate(vec2 v, float angle, vec2 dest) { dest[1] = s * x1 + c * y1; } +/** + * @brief find center point of two vector + * + * @param[in] a vector1 + * @param[in] b vector2 + * @param[out] dest center point + */ +CGLM_INLINE +void +glm_vec2_center(vec2 a, vec2 b, vec2 dest) { + glm_vec2_add(a, b, dest); + glm_vec2_scale(dest, 0.5f, dest); +} + /** * @brief squared distance between two vectors * diff --git a/src/vec2.c b/src/vec2.c index 99f7a319..07adf3e4 100644 --- a/src/vec2.c +++ b/src/vec2.c @@ -194,6 +194,12 @@ glmc_vec2_rotate(vec2 v, float angle, vec2 dest) { glm_vec2_rotate(v, angle, dest); } +CGLM_EXPORT +void +glmc_vec2_center(vec2 a, vec2 b, vec2 dest) { + glm_vec2_center(a, b, dest); +} + CGLM_EXPORT float glmc_vec2_distance2(vec2 a, vec2 b) { diff --git a/test/src/test_vec2.h b/test/src/test_vec2.h index 191abb8a..0c59db20 100644 --- a/test/src/test_vec2.h +++ b/test/src/test_vec2.h @@ -480,6 +480,17 @@ TEST_IMPL(GLM_PREFIX, vec2_rotate) { TEST_SUCCESS } +TEST_IMPL(GLM_PREFIX, vec2_center) { + vec2 v1 = {1.0f, 1.0f}, + v2 = {0.0f, 0.0f}; + vec2 dest; + GLM(vec2_center)(v1, v2, dest); + + ASSERTIFY(test_assert_vec2_eq(dest, (vec2){ 0.5f, 0.5f })) + + TEST_SUCCESS +} + TEST_IMPL(GLM_PREFIX, vec2_distance2) { vec2 v1 = {30.0f, 0.0f}, v2 = {0.0f, 0.0f}, diff --git a/test/tests.h b/test/tests.h index 10f931cb..d32ec40f 100644 --- a/test/tests.h +++ b/test/tests.h @@ -485,6 +485,7 @@ TEST_DECLARE(glm_vec2_negate) TEST_DECLARE(glm_vec2_normalize) TEST_DECLARE(glm_vec2_normalize_to) TEST_DECLARE(glm_vec2_rotate) +TEST_DECLARE(glm_vec2_center) TEST_DECLARE(glm_vec2_distance2) TEST_DECLARE(glm_vec2_distance) TEST_DECLARE(glm_vec2_maxv) @@ -524,6 +525,7 @@ TEST_DECLARE(glmc_vec2_negate) TEST_DECLARE(glmc_vec2_normalize) TEST_DECLARE(glmc_vec2_normalize_to) TEST_DECLARE(glmc_vec2_rotate) +TEST_DECLARE(glmc_vec2_center) TEST_DECLARE(glmc_vec2_distance2) TEST_DECLARE(glmc_vec2_distance) TEST_DECLARE(glmc_vec2_maxv) @@ -1460,6 +1462,7 @@ TEST_LIST { TEST_ENTRY(glm_vec2_normalize) TEST_ENTRY(glm_vec2_normalize_to) TEST_ENTRY(glm_vec2_rotate) + TEST_ENTRY(glm_vec2_center) TEST_ENTRY(glm_vec2_distance2) TEST_ENTRY(glm_vec2_distance) TEST_ENTRY(glm_vec2_maxv) @@ -1498,6 +1501,7 @@ TEST_LIST { TEST_ENTRY(glmc_vec2_normalize) TEST_ENTRY(glmc_vec2_normalize_to) TEST_ENTRY(glmc_vec2_rotate) + TEST_ENTRY(glmc_vec2_center) TEST_ENTRY(glmc_vec2_distance2) TEST_ENTRY(glmc_vec2_distance) TEST_ENTRY(glmc_vec2_maxv)