From fa9ecda57b753a1f333ff15a0bec2bd5fa37d7bf Mon Sep 17 00:00:00 2001 From: Andrey Pokidov <9942846+Morgend@users.noreply.github.com> Date: Tue, 25 Feb 2025 19:42:14 +0700 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=B8=D0=BD=D0=B5=D0=B9=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D0=BF=D0=BE=D0=BB=D1=8F?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=BE=D0=B2=20=D0=B8=20=D0=BA=D0=B2=D0=B0?= =?UTF-8?q?=D1=82=D0=B5=D1=80=D0=BD=D0=B8=D0=BE=D0=BD=D0=BE=D0=B2=20(Vecto?= =?UTF-8?q?r2,=20Vector2,=20Quaternion)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic-geometry/quaternion.c | 3 +++ basic-geometry/quaternion.h | 24 +++++++++++++++++++++++- basic-geometry/vector2.c | 5 ++++- basic-geometry/vector2.h | 18 ++++++++++++++++++ basic-geometry/vector3.c | 3 +++ basic-geometry/vector3.h | 20 ++++++++++++++++++++ 6 files changed, 71 insertions(+), 2 deletions(-) diff --git a/basic-geometry/quaternion.c b/basic-geometry/quaternion.c index dd9ca7b..6ff23c7 100644 --- a/basic-geometry/quaternion.c +++ b/basic-geometry/quaternion.c @@ -69,5 +69,8 @@ extern inline void bgc_quaternion_multiply_fp64(const BgcQuaternionFP64* multipl extern inline void bgc_quaternion_divide_fp32(const BgcQuaternionFP32* dividend, const float divisor, BgcQuaternionFP32* quotient); extern inline void bgc_quaternion_divide_fp64(const BgcQuaternionFP64* dividend, const double divisor, BgcQuaternionFP64* quotient); +extern inline void bgc_quaternion_get_linear_interpolation_fp32(const BgcQuaternionFP32* vector1, const BgcQuaternionFP32* vector2, const float phase, BgcQuaternionFP32* interpolation); +extern inline void bgc_quaternion_get_linear_interpolation_fp64(const BgcQuaternionFP64* vector1, const BgcQuaternionFP64* vector2, const double phase, BgcQuaternionFP64* interpolation); + extern inline int bgc_quaternion_are_close_fp32(const BgcQuaternionFP32* quaternion1, const BgcQuaternionFP32* quaternion2); extern inline int bgc_quaternion_are_close_fp32(const BgcQuaternionFP32* quaternion1, const BgcQuaternionFP32* quaternion2); diff --git a/basic-geometry/quaternion.h b/basic-geometry/quaternion.h index b3e375e..830b00c 100644 --- a/basic-geometry/quaternion.h +++ b/basic-geometry/quaternion.h @@ -577,6 +577,28 @@ inline void bgc_quaternion_divide_fp64(const BgcQuaternionFP64* dividend, const bgc_quaternion_multiply_fp64(dividend, 1.0 / divisor, quotient); } +// =================== Linear =================== // + +inline void bgc_quaternion_get_linear_interpolation_fp32(const BgcQuaternionFP32* quaternion1, const BgcQuaternionFP32* quaternion2, const float phase, BgcQuaternionFP32* interpolation) +{ + const float counterphase = 1.0f - phase; + + interpolation->s0 = quaternion1->s0 * counterphase + quaternion2->s0 * phase; + interpolation->x1 = quaternion1->x1 * counterphase + quaternion2->x1 * phase; + interpolation->x2 = quaternion1->x2 * counterphase + quaternion2->x2 * phase; + interpolation->x3 = quaternion1->x3 * counterphase + quaternion2->x3 * phase; +} + +inline void bgc_quaternion_get_linear_interpolation_fp64(const BgcQuaternionFP64* quaternion1, const BgcQuaternionFP64* quaternion2, const double phase, BgcQuaternionFP64* interpolation) +{ + const double counterphase = 1.0 - phase; + + interpolation->s0 = quaternion1->s0 * counterphase + quaternion2->s0 * phase; + interpolation->x1 = quaternion1->x1 * counterphase + quaternion2->x1 * phase; + interpolation->x2 = quaternion1->x2 * counterphase + quaternion2->x2 * phase; + interpolation->x3 = quaternion1->x3 * counterphase + quaternion2->x3 * phase; +} + // ================== Are Close ================= // inline int bgc_quaternion_are_close_fp32(const BgcQuaternionFP32* quaternion1, const BgcQuaternionFP32* quaternion2) @@ -615,4 +637,4 @@ inline int bgc_quaternion_are_close_fp64(const BgcQuaternionFP64* quaternion1, c return square_distance <= BGC_SQUARE_EPSYLON_FP64 * square_modulus1 && square_distance <= BGC_SQUARE_EPSYLON_FP64 * square_modulus2; } -#endif // _BGC_QUATERNION_H_ +#endif diff --git a/basic-geometry/vector2.c b/basic-geometry/vector2.c index c2aeece..f88cea8 100644 --- a/basic-geometry/vector2.c +++ b/basic-geometry/vector2.c @@ -64,7 +64,10 @@ extern inline void bgc_vector2_get_mean_of_two_fp32(const BgcVector2FP32* vector extern inline void bgc_vector2_get_mean_of_two_fp64(const BgcVector2FP64* vector1, const BgcVector2FP64* vector2, BgcVector2FP64* mean); extern inline void bgc_vector2_get_mean_of_three_fp32(const BgcVector2FP32* vector1, const BgcVector2FP32* vector2, const BgcVector2FP32* vector3, BgcVector2FP32* mean); -extern inline void bgc_vector2_get_mean_of_three_fp64(const BgcVector2FP64* vector1, const BgcVector2FP64* vector2, const BgcVector2FP64* vector3, BgcVector2FP64* mean); +extern inline void bgc_vector2_get_mean_of_three_fp64(const BgcVector2FP64* vector1, const BgcVector2FP64* vector2, const BgcVector2FP64* vector3, BgcVector2FP64* mean); + +extern inline void bgc_vector2_get_linear_interpolation_fp32(const BgcVector2FP32* vector1, const BgcVector2FP32* vector2, const float phase, BgcVector2FP32* interpolation); +extern inline void bgc_vector2_get_linear_interpolation_fp64(const BgcVector2FP64* vector1, const BgcVector2FP64* vector2, const double phase, BgcVector2FP64* interpolation); extern inline void bgc_vector2_minimize_fp32(const BgcVector2FP32* vector, BgcVector2FP32* minimal); extern inline void bgc_vector2_minimize_fp64(const BgcVector2FP64* vector, BgcVector2FP64* minimal); diff --git a/basic-geometry/vector2.h b/basic-geometry/vector2.h index 1db1291..e085ad6 100644 --- a/basic-geometry/vector2.h +++ b/basic-geometry/vector2.h @@ -366,6 +366,24 @@ inline void bgc_vector2_get_mean_of_three_fp64(const BgcVector2FP64* vector1, co mean->x2 = (vector1->x2 + vector2->x2 + vector3->x2) * BGC_ONE_THIRD_FP64; } +// =================== Linear =================== // + +inline void bgc_vector2_get_linear_interpolation_fp32(const BgcVector2FP32* vector1, const BgcVector2FP32* vector2, const float phase, BgcVector2FP32* interpolation) +{ + const float counterphase = 1.0f - phase; + + interpolation->x1 = vector1->x1 * counterphase + vector2->x1 * phase; + interpolation->x2 = vector1->x2 * counterphase + vector2->x2 * phase; +} + +inline void bgc_vector2_get_linear_interpolation_fp64(const BgcVector2FP64* vector1, const BgcVector2FP64* vector2, const double phase, BgcVector2FP64* interpolation) +{ + const double counterphase = 1.0 - phase; + + interpolation->x1 = vector1->x1 * counterphase + vector2->x1 * phase; + interpolation->x2 = vector1->x2 * counterphase + vector2->x2 * phase; +} + // ================== Minimal =================== // inline void bgc_vector2_minimize_fp32(const BgcVector2FP32* vector, BgcVector2FP32* minimal) diff --git a/basic-geometry/vector3.c b/basic-geometry/vector3.c index 11f9f3a..92ac8b6 100644 --- a/basic-geometry/vector3.c +++ b/basic-geometry/vector3.c @@ -62,6 +62,9 @@ extern inline void bgc_vector3_get_mean_of_two_fp64(const BgcVector3FP64* vector extern inline void bgc_vector3_get_mean_of_three_fp32(const BgcVector3FP32* vector1, const BgcVector3FP32* vector2, const BgcVector3FP32* vector3, BgcVector3FP32* result); extern inline void bgc_vector3_get_mean_of_three_fp64(const BgcVector3FP64* vector1, const BgcVector3FP64* vector2, const BgcVector3FP64* vector3, BgcVector3FP64* result); + +extern inline void bgc_vector3_get_linear_interpolation_fp32(const BgcVector3FP32* vector1, const BgcVector3FP32* vector2, const float phase, BgcVector3FP32* interpolation); +extern inline void bgc_vector3_get_linear_interpolation_fp64(const BgcVector3FP64* vector1, const BgcVector3FP64* vector2, const double phase, BgcVector3FP64* interpolation); extern inline void bgc_vector3_minimize_fp32(const BgcVector3FP32* vector, BgcVector3FP32* minimal); extern inline void bgc_vector3_minimize_fp64(const BgcVector3FP64* vector, BgcVector3FP64* minimal); diff --git a/basic-geometry/vector3.h b/basic-geometry/vector3.h index 102ccf1..bf7e794 100644 --- a/basic-geometry/vector3.h +++ b/basic-geometry/vector3.h @@ -378,6 +378,26 @@ inline void bgc_vector3_get_mean_of_three_fp64(const BgcVector3FP64* vector1, co result->x3 = (vector1->x3 + vector2->x3 + vector3->x3) * BGC_ONE_THIRD_FP64; } +// =================== Linear =================== // + +inline void bgc_vector3_get_linear_interpolation_fp32(const BgcVector3FP32* vector1, const BgcVector3FP32* vector2, const float phase, BgcVector3FP32* interpolation) +{ + const float counterphase = 1.0f - phase; + + interpolation->x1 = vector1->x1 * counterphase + vector2->x1 * phase; + interpolation->x2 = vector1->x2 * counterphase + vector2->x2 * phase; + interpolation->x3 = vector1->x3 * counterphase + vector2->x3 * phase; +} + +inline void bgc_vector3_get_linear_interpolation_fp64(const BgcVector3FP64* vector1, const BgcVector3FP64* vector2, const double phase, BgcVector3FP64* interpolation) +{ + const double counterphase = 1.0 - phase; + + interpolation->x1 = vector1->x1 * counterphase + vector2->x1 * phase; + interpolation->x2 = vector1->x2 * counterphase + vector2->x2 * phase; + interpolation->x3 = vector1->x3 * counterphase + vector2->x3 * phase; +} + // ================== Minimal =================== // inline void bgc_vector3_minimize_fp32(const BgcVector3FP32* vector, BgcVector3FP32* minimal)