Линейная интерполяция для векторов и кватернионов (Vector2, Vector2, Quaternion)
This commit is contained in:
parent
f547ba69e6
commit
fa9ecda57b
6 changed files with 71 additions and 2 deletions
|
@ -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_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_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);
|
||||||
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);
|
||||||
|
|
|
@ -577,6 +577,28 @@ inline void bgc_quaternion_divide_fp64(const BgcQuaternionFP64* dividend, const
|
||||||
bgc_quaternion_multiply_fp64(dividend, 1.0 / divisor, quotient);
|
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 ================= //
|
// ================== Are Close ================= //
|
||||||
|
|
||||||
inline int bgc_quaternion_are_close_fp32(const BgcQuaternionFP32* quaternion1, const BgcQuaternionFP32* quaternion2)
|
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;
|
return square_distance <= BGC_SQUARE_EPSYLON_FP64 * square_modulus1 && square_distance <= BGC_SQUARE_EPSYLON_FP64 * square_modulus2;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // _BGC_QUATERNION_H_
|
#endif
|
||||||
|
|
|
@ -66,6 +66,9 @@ extern inline void bgc_vector2_get_mean_of_two_fp64(const BgcVector2FP64* vector
|
||||||
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_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_fp32(const BgcVector2FP32* vector, BgcVector2FP32* minimal);
|
||||||
extern inline void bgc_vector2_minimize_fp64(const BgcVector2FP64* vector, BgcVector2FP64* minimal);
|
extern inline void bgc_vector2_minimize_fp64(const BgcVector2FP64* vector, BgcVector2FP64* minimal);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
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 =================== //
|
// ================== Minimal =================== //
|
||||||
|
|
||||||
inline void bgc_vector2_minimize_fp32(const BgcVector2FP32* vector, BgcVector2FP32* minimal)
|
inline void bgc_vector2_minimize_fp32(const BgcVector2FP32* vector, BgcVector2FP32* minimal)
|
||||||
|
|
|
@ -63,6 +63,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_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_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_fp32(const BgcVector3FP32* vector, BgcVector3FP32* minimal);
|
||||||
extern inline void bgc_vector3_minimize_fp64(const BgcVector3FP64* vector, BgcVector3FP64* minimal);
|
extern inline void bgc_vector3_minimize_fp64(const BgcVector3FP64* vector, BgcVector3FP64* minimal);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
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 =================== //
|
// ================== Minimal =================== //
|
||||||
|
|
||||||
inline void bgc_vector3_minimize_fp32(const BgcVector3FP32* vector, BgcVector3FP32* minimal)
|
inline void bgc_vector3_minimize_fp32(const BgcVector3FP32* vector, BgcVector3FP32* minimal)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue