Переход на версию 0.3: изменение подхода к именованию сущностей, добавление, изменение и удаление ряда функций

This commit is contained in:
Andrey Pokidov 2026-01-30 19:37:49 +07:00
parent d33daf4e2d
commit f7e41645fe
87 changed files with 4580 additions and 4051 deletions

View file

@ -1,105 +1,105 @@
#include <math.h>
#include "quaternion.h"
extern inline void bgc_quaternion_reset_fp32(BgcQuaternionFP32* quaternion);
extern inline void bgc_quaternion_reset_fp64(BgcQuaternionFP64* quaternion);
extern inline void bgc_fp32_quaternion_reset(BGC_FP32_Quaternion* quaternion);
extern inline void bgc_fp64_quaternion_reset(BGC_FP64_Quaternion* quaternion);
extern inline void bgc_quaternion_make_unit_fp32(BgcQuaternionFP32* quaternion);
extern inline void bgc_quaternion_make_unit_fp64(BgcQuaternionFP64* quaternion);
extern inline void bgc_fp32_quaternion_make_unit(BGC_FP32_Quaternion* quaternion);
extern inline void bgc_fp64_quaternion_make_unit(BGC_FP64_Quaternion* quaternion);
extern inline void bgc_quaternion_set_values_fp32(const float s0, const float x1, const float x2, const float x3, BgcQuaternionFP32* quaternion);
extern inline void bgc_quaternion_set_values_fp64(const double s0, const double x1, const double x2, const double x3, BgcQuaternionFP64* quaternion);
extern inline void bgc_fp32_quaternion_make(const float s0, const float x1, const float x2, const float x3, BGC_FP32_Quaternion* quaternion);
extern inline void bgc_fp64_quaternion_make(const double s0, const double x1, const double x2, const double x3, BGC_FP64_Quaternion* quaternion);
extern inline float bgc_quaternion_get_square_modulus_fp32(const BgcQuaternionFP32* quaternion);
extern inline double bgc_quaternion_get_square_modulus_fp64(const BgcQuaternionFP64* quaternion);
extern inline float bgc_fp32_quaternion_get_square_modulus(const BGC_FP32_Quaternion* quaternion);
extern inline double bgc_fp64_quaternion_get_square_modulus(const BGC_FP64_Quaternion* quaternion);
extern inline float bgc_quaternion_get_modulus_fp32(const BgcQuaternionFP32* quaternion);
extern inline double bgc_quaternion_get_modulus_fp64(const BgcQuaternionFP64* quaternion);
extern inline float bgc_fp32_quaternion_get_modulus(const BGC_FP32_Quaternion* quaternion);
extern inline double bgc_fp64_quaternion_get_modulus(const BGC_FP64_Quaternion* quaternion);
extern inline int bgc_quaternion_is_zero_fp32(const BgcQuaternionFP32* quaternion);
extern inline int bgc_quaternion_is_zero_fp64(const BgcQuaternionFP64* quaternion);
extern inline int bgc_fp32_quaternion_is_zero(const BGC_FP32_Quaternion* quaternion);
extern inline int bgc_fp64_quaternion_is_zero(const BGC_FP64_Quaternion* quaternion);
extern inline int bgc_quaternion_is_unit_fp32(const BgcQuaternionFP32* quaternion);
extern inline int bgc_quaternion_is_unit_fp64(const BgcQuaternionFP64* quaternion);
extern inline int bgc_fp32_quaternion_is_unit(const BGC_FP32_Quaternion* quaternion);
extern inline int bgc_fp64_quaternion_is_unit(const BGC_FP64_Quaternion* quaternion);
extern inline void bgc_quaternion_copy_fp32(const BgcQuaternionFP32* source, BgcQuaternionFP32* destination);
extern inline void bgc_quaternion_copy_fp64(const BgcQuaternionFP64* source, BgcQuaternionFP64* destination);
extern inline void bgc_fp32_quaternion_copy(const BGC_FP32_Quaternion* source, BGC_FP32_Quaternion* destination);
extern inline void bgc_fp64_quaternion_copy(const BGC_FP64_Quaternion* source, BGC_FP64_Quaternion* destination);
extern inline void bgc_quaternion_swap_fp32(BgcQuaternionFP32* quarternion1, BgcQuaternionFP32* quarternion2);
extern inline void bgc_quaternion_swap_fp64(BgcQuaternionFP64* quarternion1, BgcQuaternionFP64* quarternion2);
extern inline void bgc_fp32_quaternion_swap(BGC_FP32_Quaternion* quarternion1, BGC_FP32_Quaternion* quarternion2);
extern inline void bgc_fp64_quaternion_swap(BGC_FP64_Quaternion* quarternion1, BGC_FP64_Quaternion* quarternion2);
extern inline void bgc_quaternion_convert_fp64_to_fp32(const BgcQuaternionFP64* source, BgcQuaternionFP32* destination);
extern inline void bgc_quaternion_convert_fp32_to_fp64(const BgcQuaternionFP32* source, BgcQuaternionFP64* destination);
extern inline void bgc_fp64_quaternion_convert_to_fp32(const BGC_FP64_Quaternion* source, BGC_FP32_Quaternion* destination);
extern inline void bgc_fp32_quaternion_convert_to_fp64(const BGC_FP32_Quaternion* source, BGC_FP64_Quaternion* destination);
extern inline void bgc_quaternion_add_fp32(const BgcQuaternionFP32* quaternion1, const BgcQuaternionFP32* quaternion2, BgcQuaternionFP32* sum);
extern inline void bgc_quaternion_add_fp64(const BgcQuaternionFP64* quaternion1, const BgcQuaternionFP64* quaternion2, BgcQuaternionFP64* sum);
extern inline void bgc_fp32_quaternion_add(const BGC_FP32_Quaternion* quaternion1, const BGC_FP32_Quaternion* quaternion2, BGC_FP32_Quaternion* sum);
extern inline void bgc_fp64_quaternion_add(const BGC_FP64_Quaternion* quaternion1, const BGC_FP64_Quaternion* quaternion2, BGC_FP64_Quaternion* sum);
extern inline void bgc_quaternion_add_scaled_fp32(const BgcQuaternionFP32* basic_quaternion, const BgcQuaternionFP32* scalable_quaternion, const float scale, BgcQuaternionFP32* sum);
extern inline void bgc_quaternion_add_scaled_fp64(const BgcQuaternionFP64* basic_quaternion, const BgcQuaternionFP64* scalable_quaternion, const double scale, BgcQuaternionFP64* sum);
extern inline void bgc_fp32_quaternion_add_scaled(const BGC_FP32_Quaternion* basic_quaternion, const BGC_FP32_Quaternion* scalable_quaternion, const float scale, BGC_FP32_Quaternion* sum);
extern inline void bgc_fp64_quaternion_add_scaled(const BGC_FP64_Quaternion* basic_quaternion, const BGC_FP64_Quaternion* scalable_quaternion, const double scale, BGC_FP64_Quaternion* sum);
extern inline void bgc_quaternion_subtract_fp32(const BgcQuaternionFP32* minuend, const BgcQuaternionFP32* subtrahend, BgcQuaternionFP32* difference);
extern inline void bgc_quaternion_subtract_fp64(const BgcQuaternionFP64* minuend, const BgcQuaternionFP64* subtrahend, BgcQuaternionFP64* difference);
extern inline void bgc_fp32_quaternion_subtract(const BGC_FP32_Quaternion* minuend, const BGC_FP32_Quaternion* subtrahend, BGC_FP32_Quaternion* difference);
extern inline void bgc_fp64_quaternion_subtract(const BGC_FP64_Quaternion* minuend, const BGC_FP64_Quaternion* subtrahend, BGC_FP64_Quaternion* difference);
extern inline void bgc_quaternion_multiply_fp32(const BgcQuaternionFP32* left, const BgcQuaternionFP32* right, BgcQuaternionFP32* product);
extern inline void bgc_quaternion_multiply_fp64(const BgcQuaternionFP64* left, const BgcQuaternionFP64* right, BgcQuaternionFP64* product);
extern inline void bgc_fp32_quaternion_get_product(const BGC_FP32_Quaternion* left, const BGC_FP32_Quaternion* right, BGC_FP32_Quaternion* product);
extern inline void bgc_fp64_quaternion_get_product(const BGC_FP64_Quaternion* left, const BGC_FP64_Quaternion* right, BGC_FP64_Quaternion* product);
extern inline void bgc_quaternion_multiply_by_number_fp32(const BgcQuaternionFP32* multiplicand, const float multipier, BgcQuaternionFP32* product);
extern inline void bgc_quaternion_multiply_by_number_fp64(const BgcQuaternionFP64* multiplicand, const double multipier, BgcQuaternionFP64* product);
extern inline void bgc_fp32_quaternion_multiply(const BGC_FP32_Quaternion* multiplicand, const float multipier, BGC_FP32_Quaternion* product);
extern inline void bgc_fp64_quaternion_multiply(const BGC_FP64_Quaternion* multiplicand, const double multipier, BGC_FP64_Quaternion* product);
extern inline int bgc_quaternion_divide_fp32(const BgcQuaternionFP32* divident, const BgcQuaternionFP32* divisor, BgcQuaternionFP32* quotient);
extern inline int bgc_quaternion_divide_fp64(const BgcQuaternionFP64* divident, const BgcQuaternionFP64* divisor, BgcQuaternionFP64* quotient);
extern inline int bgc_fp32_quaternion_get_ratio(const BGC_FP32_Quaternion* divident, const BGC_FP32_Quaternion* divisor, BGC_FP32_Quaternion* quotient);
extern inline int bgc_fp64_quaternion_get_ratio(const BGC_FP64_Quaternion* divident, const BGC_FP64_Quaternion* divisor, BGC_FP64_Quaternion* quotient);
extern inline void bgc_quaternion_divide_by_number_fp32(const BgcQuaternionFP32* dividend, const float divisor, BgcQuaternionFP32* quotient);
extern inline void bgc_quaternion_divide_by_number_fp64(const BgcQuaternionFP64* dividend, const double divisor, BgcQuaternionFP64* quotient);
extern inline void bgc_fp32_quaternion_divide(const BGC_FP32_Quaternion* dividend, const float divisor, BGC_FP32_Quaternion* quotient);
extern inline void bgc_fp64_quaternion_divide(const BGC_FP64_Quaternion* dividend, const double divisor, BGC_FP64_Quaternion* quotient);
extern inline void bgc_quaternion_get_mean_of_two_fp32(const BgcQuaternionFP32* vector1, const BgcQuaternionFP32* vector2, BgcQuaternionFP32* mean);
extern inline void bgc_quaternion_get_mean_of_two_fp64(const BgcQuaternionFP64* vector1, const BgcQuaternionFP64* vector2, BgcQuaternionFP64* mean);
extern inline void bgc_fp32_quaternion_get_mean2(const BGC_FP32_Quaternion* vector1, const BGC_FP32_Quaternion* vector2, BGC_FP32_Quaternion* mean);
extern inline void bgc_fp64_quaternion_get_mean2(const BGC_FP64_Quaternion* vector1, const BGC_FP64_Quaternion* vector2, BGC_FP64_Quaternion* mean);
extern inline void bgc_quaternion_get_mean_of_three_fp32(const BgcQuaternionFP32* vector1, const BgcQuaternionFP32* vector2, const BgcQuaternionFP32* vector3, BgcQuaternionFP32* mean);
extern inline void bgc_quaternion_get_mean_of_three_fp64(const BgcQuaternionFP64* vector1, const BgcQuaternionFP64* vector2, const BgcQuaternionFP64* vector3, BgcQuaternionFP64* mean);
extern inline void bgc_fp32_quaternion_get_mean3(const BGC_FP32_Quaternion* vector1, const BGC_FP32_Quaternion* vector2, const BGC_FP32_Quaternion* vector3, BGC_FP32_Quaternion* mean);
extern inline void bgc_fp64_quaternion_get_mean3(const BGC_FP64_Quaternion* vector1, const BGC_FP64_Quaternion* vector2, const BGC_FP64_Quaternion* vector3, BGC_FP64_Quaternion* mean);
extern inline void bgc_quaternion_interpolate_fp32(const BgcQuaternionFP32* vector1, const BgcQuaternionFP32* vector2, const float phase, BgcQuaternionFP32* interpolation);
extern inline void bgc_quaternion_interpolate_fp64(const BgcQuaternionFP64* vector1, const BgcQuaternionFP64* vector2, const double phase, BgcQuaternionFP64* interpolation);
extern inline void bgc_fp32_quaternion_interpolate(const BGC_FP32_Quaternion* vector1, const BGC_FP32_Quaternion* vector2, const float phase, BGC_FP32_Quaternion* interpolation);
extern inline void bgc_fp64_quaternion_interpolate(const BGC_FP64_Quaternion* vector1, const BGC_FP64_Quaternion* vector2, const double phase, BGC_FP64_Quaternion* interpolation);
extern inline void bgc_quaternion_conjugate_fp32(BgcQuaternionFP32* quaternion);
extern inline void bgc_quaternion_conjugate_fp64(BgcQuaternionFP64* quaternion);
extern inline void bgc_fp32_quaternion_conjugate(BGC_FP32_Quaternion* quaternion);
extern inline void bgc_fp64_quaternion_conjugate(BGC_FP64_Quaternion* quaternion);
extern inline void bgc_quaternion_get_conjugate_fp32(const BgcQuaternionFP32* quaternion, BgcQuaternionFP32* conjugate);
extern inline void bgc_quaternion_get_conjugate_fp64(const BgcQuaternionFP64* quaternion, BgcQuaternionFP64* conjugate);
extern inline void bgc_fp32_quaternion_get_conjugate(const BGC_FP32_Quaternion* quaternion, BGC_FP32_Quaternion* conjugate);
extern inline void bgc_fp64_quaternion_get_conjugate(const BGC_FP64_Quaternion* quaternion, BGC_FP64_Quaternion* conjugate);
extern inline void bgc_quaternion_make_opposite_fp32(BgcQuaternionFP32* quaternion);
extern inline void bgc_quaternion_make_opposite_fp64(BgcQuaternionFP64* quaternion);
extern inline void bgc_fp32_quaternion_revert(BGC_FP32_Quaternion* quaternion);
extern inline void bgc_fp64_quaternion_revert(BGC_FP64_Quaternion* quaternion);
extern inline void bgc_quaternion_get_opposite_fp32(const BgcQuaternionFP32* quaternion, BgcQuaternionFP32* opposite);
extern inline void bgc_quaternion_get_opposite_fp64(const BgcQuaternionFP64* quaternion, BgcQuaternionFP64* opposite);
extern inline void bgc_fp32_quaternion_get_reverse(const BGC_FP32_Quaternion* quaternion, BGC_FP32_Quaternion* opposite);
extern inline void bgc_fp64_quaternion_get_reverse(const BGC_FP64_Quaternion* quaternion, BGC_FP64_Quaternion* opposite);
extern inline int bgc_quaternion_invert_fp32(BgcQuaternionFP32* quaternion);
extern inline int bgc_quaternion_invert_fp64(BgcQuaternionFP64* quaternion);
extern inline int bgc_fp32_quaternion_invert(BGC_FP32_Quaternion* quaternion);
extern inline int bgc_fp64_quaternion_invert(BGC_FP64_Quaternion* quaternion);
extern inline int bgc_quaternion_get_inverse_fp32(const BgcQuaternionFP32* quaternion, BgcQuaternionFP32* inverse);
extern inline int bgc_quaternion_get_inverse_fp64(const BgcQuaternionFP64* quaternion, BgcQuaternionFP64* inverse);
extern inline int bgc_fp32_quaternion_get_inverse(const BGC_FP32_Quaternion* quaternion, BGC_FP32_Quaternion* inverse);
extern inline int bgc_fp64_quaternion_get_inverse(const BGC_FP64_Quaternion* quaternion, BGC_FP64_Quaternion* inverse);
extern inline int bgc_quaternion_normalize_fp32(BgcQuaternionFP32* quaternion);
extern inline int bgc_quaternion_normalize_fp64(BgcQuaternionFP64* quaternion);
extern inline int bgc_fp32_quaternion_normalize(BGC_FP32_Quaternion* quaternion);
extern inline int bgc_fp64_quaternion_normalize(BGC_FP64_Quaternion* quaternion);
extern inline int bgc_quaternion_get_normalized_fp32(const BgcQuaternionFP32* quaternion, BgcQuaternionFP32* normalized);
extern inline int bgc_quaternion_get_normalized_fp64(const BgcQuaternionFP64* quaternion, BgcQuaternionFP64* normalized);
extern inline int bgc_fp32_quaternion_get_normalized(const BGC_FP32_Quaternion* quaternion, BGC_FP32_Quaternion* normalized);
extern inline int bgc_fp64_quaternion_get_normalized(const BGC_FP64_Quaternion* quaternion, BGC_FP64_Quaternion* normalized);
extern inline int bgc_quaternion_get_rotation_matrix_fp32(const BgcQuaternionFP32* quaternion, BgcMatrix3x3FP32* rotation);
extern inline int bgc_quaternion_get_rotation_matrix_fp64(const BgcQuaternionFP64* quaternion, BgcMatrix3x3FP64* rotation);
extern inline int bgc_fp32_quaternion_get_rotation_matrix(const BGC_FP32_Quaternion* quaternion, BGC_FP32_Matrix3x3* rotation);
extern inline int bgc_fp64_quaternion_get_rotation_matrix(const BGC_FP64_Quaternion* quaternion, BGC_FP64_Matrix3x3* rotation);
extern inline int bgc_quaternion_get_reverse_matrix_fp32(const BgcQuaternionFP32* quaternion, BgcMatrix3x3FP32* reverse);
extern inline int bgc_quaternion_get_reverse_matrix_fp64(const BgcQuaternionFP64* quaternion, BgcMatrix3x3FP64* reverse);
extern inline int bgc_fp32_quaternion_get_reverse_matrix(const BGC_FP32_Quaternion* quaternion, BGC_FP32_Matrix3x3* reverse);
extern inline int bgc_fp64_quaternion_get_reverse_matrix(const BGC_FP64_Quaternion* quaternion, BGC_FP64_Matrix3x3* reverse);
extern inline int bgc_quaternion_get_both_matrices_fp32(const BgcQuaternionFP32* quaternion, BgcMatrix3x3FP32* rotation, BgcMatrix3x3FP32* reverse);
extern inline int bgc_quaternion_get_both_matrices_fp64(const BgcQuaternionFP64* quaternion, BgcMatrix3x3FP64* rotation, BgcMatrix3x3FP64* reverse);
extern inline int bgc_fp32_quaternion_get_both_matrices(const BGC_FP32_Quaternion* quaternion, BGC_FP32_Matrix3x3* rotation, BGC_FP32_Matrix3x3* reverse);
extern inline int bgc_fp64_quaternion_get_both_matrices(const BGC_FP64_Quaternion* quaternion, BGC_FP64_Matrix3x3* rotation, BGC_FP64_Matrix3x3* reverse);
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_fp32_quaternion_are_close(const BGC_FP32_Quaternion* quaternion1, const BGC_FP32_Quaternion* quaternion2);
extern inline int bgc_fp64_quaternion_are_close(const BGC_FP64_Quaternion* quaternion1, const BGC_FP64_Quaternion* quaternion2);
// =============== Get Exponation =============== //
int bgc_quaternion_get_exponation_fp32(const BgcQuaternionFP32* base, const float exponent, BgcQuaternionFP32* power)
int bgc_fp32_quaternion_get_exponation(const BGC_FP32_Quaternion* base, const float exponent, BGC_FP32_Quaternion* power)
{
const float s0s0 = base->s0 * base->s0;
const float x1x1 = base->x1 * base->x1;
@ -109,12 +109,12 @@ int bgc_quaternion_get_exponation_fp32(const BgcQuaternionFP32* base, const floa
const float square_vector = x1x1 + (x2x2 + x3x3);
const float square_modulus = (s0s0 + x1x1) + (x2x2 + x3x3);
// square_modulus != square_modulus means checking for NaN value at square_modulus
if (square_modulus != square_modulus) {
// isnan(square_modulus) means checking for NaN value at square_modulus
if (isnan(square_modulus)) {
return 0;
}
if (square_vector <= BGC_SQUARE_EPSYLON_FP32) {
if (square_vector <= BGC_FP32_SQUARE_EPSYLON) {
if (base->s0 < 0.0f) {
return 0;
}
@ -140,7 +140,7 @@ int bgc_quaternion_get_exponation_fp32(const BgcQuaternionFP32* base, const floa
return 1;
}
int bgc_quaternion_get_exponation_fp64(const BgcQuaternionFP64* base, const double exponent, BgcQuaternionFP64* power)
int bgc_fp64_quaternion_get_exponation(const BGC_FP64_Quaternion* base, const double exponent, BGC_FP64_Quaternion* power)
{
const double s0s0 = base->s0 * base->s0;
const double x1x1 = base->x1 * base->x1;
@ -149,13 +149,13 @@ int bgc_quaternion_get_exponation_fp64(const BgcQuaternionFP64* base, const doub
const double square_vector = x1x1 + (x2x2 + x3x3);
const double square_modulus = (s0s0 + x1x1) + (x2x2 + x3x3);
// square_modulus != square_modulus means checking for NaN value at square_modulus
if (square_modulus != square_modulus) {
// isnan(square_modulus) means checking for NaN value at square_modulus
if (isnan(square_modulus)) {
return 0;
}
if (square_vector <= BGC_SQUARE_EPSYLON_FP64) {
if (square_vector <= BGC_FP64_SQUARE_EPSYLON) {
if (base->s0 < 0.0) {
return 0;
}