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)