Добавлено умножение дуальных кватернионов с прочими сущностями

This commit is contained in:
Andrey Pokidov 2026-02-17 21:28:51 +07:00
parent b621191698
commit a8a22cdcc1
4 changed files with 105 additions and 10 deletions

View file

@ -31,16 +31,25 @@ extern inline void bgc_fp32_dual_quaternion_subtract_scaled(BGC_FP32_DualQuatern
extern inline void bgc_fp64_dual_quaternion_subtract_scaled(BGC_FP64_DualQuaternion* difference, const BGC_FP64_DualQuaternion* base_quaternion, const BGC_FP64_DualQuaternion* scalable_quaternion, const double scale);
extern inline void bgc_fp32_dual_quaternion_multiply_by_real_number(BGC_FP32_DualQuaternion* product, const BGC_FP32_DualQuaternion* multiplicand, const float multiplier);
extern inline void bgc_fp64_dual_quaternion_multiply_by_real(BGC_FP64_DualQuaternion* product, const BGC_FP64_DualQuaternion* multiplicand, const double multiplier);
extern inline void bgc_fp64_dual_quaternion_multiply_by_real_number(BGC_FP64_DualQuaternion* product, const BGC_FP64_DualQuaternion* multiplicand, const double multiplier);
extern inline void bgc_fp32_dual_quaternion_multiply_by_dual_number(BGC_FP32_DualQuaternion* product, const BGC_FP32_DualQuaternion* multiplicand, const BGC_FP32_DualNumber* multiplier);
extern inline void bgc_fp64_dual_quaternion_multiply_by_dual_number(BGC_FP64_DualQuaternion* product, const BGC_FP64_DualQuaternion* multiplicand, const BGC_FP64_DualNumber* multiplier);
extern inline void bgc_fp32_dual_quaternion_multiply_by_conjugate_number(BGC_FP32_DualQuaternion* product, const BGC_FP32_DualQuaternion* multiplicand, const BGC_FP32_DualNumber* multiplier_to_conjugate);
extern inline void bgc_fp64_dual_quaternion_multiply_by_conjugate_number(BGC_FP64_DualQuaternion* product, const BGC_FP64_DualQuaternion* multiplicand, const BGC_FP64_DualNumber* multiplier_to_conjugate);
extern inline void bgc_fp32_dual_quaternion_multiply_by_conjugate_dual_number(BGC_FP32_DualQuaternion* product, const BGC_FP32_DualQuaternion* multiplicand, const BGC_FP32_DualNumber* multiplier_to_conjugate);
extern inline void bgc_fp64_dual_quaternion_multiply_by_conjugate_dual_number(BGC_FP64_DualQuaternion* product, const BGC_FP64_DualQuaternion* multiplicand, const BGC_FP64_DualNumber* multiplier_to_conjugate);
extern inline int bgc_fp32_dual_quaternion_divide_by_real(BGC_FP32_DualQuaternion* quotient, const BGC_FP32_DualQuaternion* divident, const float divisor);
extern inline int bgc_fp64_dual_quaternion_divide_by_real(BGC_FP64_DualQuaternion* quotient, const BGC_FP64_DualQuaternion* divident, const double divisor);
extern inline void bgc_fp32_dual_quaternion_multiply_by_quaternion(BGC_FP32_DualQuaternion* product, const BGC_FP32_DualQuaternion* multiplicand, const BGC_FP32_Quaternion* multiplier);
extern inline void bgc_fp64_dual_quaternion_multiply_by_quaternion(BGC_FP64_DualQuaternion* product, const BGC_FP64_DualQuaternion* multiplicand, const BGC_FP64_Quaternion* multiplier);
extern inline void bgc_fp32_dual_quaternion_multiply_by_conjugate_quaternion(BGC_FP32_DualQuaternion* product, const BGC_FP32_DualQuaternion* multiplicand, const BGC_FP32_Quaternion* multiplier_to_conjugate);
extern inline void bgc_fp64_dual_quaternion_multiply_by_conjugate_quaternion(BGC_FP64_DualQuaternion* product, const BGC_FP64_DualQuaternion* multiplicand, const BGC_FP64_Quaternion* multiplier_to_conjugate);
extern inline void bgc_fp32_dual_quaternion_multiply_by_dual_quaternion(BGC_FP32_DualQuaternion* product, const BGC_FP32_DualQuaternion* left, const BGC_FP32_DualQuaternion* right);
extern inline void bgc_fp64_dual_quaternion_multiply_by_dual_quaternion(BGC_FP64_DualQuaternion* product, const BGC_FP64_DualQuaternion* left, const BGC_FP64_DualQuaternion* right);
extern inline int bgc_fp32_dual_quaternion_divide_by_real_number(BGC_FP32_DualQuaternion* quotient, const BGC_FP32_DualQuaternion* divident, const float divisor);
extern inline int bgc_fp64_dual_quaternion_divide_by_real_number(BGC_FP64_DualQuaternion* quotient, const BGC_FP64_DualQuaternion* divident, const double divisor);
extern inline int bgc_fp32_dual_quaternion_divide_by_dual_number(BGC_FP32_DualQuaternion* quotient, const BGC_FP32_DualQuaternion* dividend, const BGC_FP32_DualNumber* divisor);
extern inline int bgc_fp64_dual_quaternion_divide_by_dual_number(BGC_FP64_DualQuaternion* quotient, const BGC_FP64_DualQuaternion* dividend, const BGC_FP64_DualNumber* divisor);

View file

@ -152,7 +152,7 @@ inline void bgc_fp32_dual_quaternion_multiply_by_real_number(BGC_FP32_DualQuater
bgc_fp32_quaternion_multiply_by_real(&product->dual_part, &multiplicand->dual_part, multiplier);
}
inline void bgc_fp64_dual_quaternion_multiply_by_real(BGC_FP64_DualQuaternion* product, const BGC_FP64_DualQuaternion* multiplicand, const double multiplier)
inline void bgc_fp64_dual_quaternion_multiply_by_real_number(BGC_FP64_DualQuaternion* product, const BGC_FP64_DualQuaternion* multiplicand, const double multiplier)
{
bgc_fp64_quaternion_multiply_by_real(&product->real_part, &multiplicand->real_part, multiplier);
bgc_fp64_quaternion_multiply_by_real(&product->dual_part, &multiplicand->dual_part, multiplier);
@ -206,9 +206,61 @@ inline void bgc_fp64_dual_quaternion_multiply_by_conjugate_number(BGC_FP64_DualQ
bgc_fp64_quaternion_copy(&product->dual_part, &dual_part);
}
// ====== Multiply by (Regular) Quaternion ====== //
inline void bgc_fp32_dual_quaternion_multiply_by_quaternion(BGC_FP32_DualQuaternion* product, const BGC_FP32_DualQuaternion* multiplicand, const BGC_FP32_Quaternion* multiplier)
{
bgc_fp32_quaternion_multiply_by_quaternion(&product->real_part, &multiplicand->real_part, multiplier);
bgc_fp32_quaternion_multiply_by_quaternion(&product->dual_part, &multiplicand->dual_part, multiplier);
}
inline void bgc_fp64_dual_quaternion_multiply_by_quaternion(BGC_FP64_DualQuaternion* product, const BGC_FP64_DualQuaternion* multiplicand, const BGC_FP64_Quaternion* multiplier)
{
bgc_fp64_quaternion_multiply_by_quaternion(&product->real_part, &multiplicand->real_part, multiplier);
bgc_fp64_quaternion_multiply_by_quaternion(&product->dual_part, &multiplicand->dual_part, multiplier);
}
// ====== Multiply by Conjugate Quaternion ====== //
inline void bgc_fp32_dual_quaternion_multiply_by_conjugate_quaternion(BGC_FP32_DualQuaternion* product, const BGC_FP32_DualQuaternion* multiplicand, const BGC_FP32_Quaternion* multiplier_to_conjugate)
{
bgc_fp32_quaternion_multiply_by_conjugate(&product->real_part, &multiplicand->real_part, multiplier_to_conjugate);
bgc_fp32_quaternion_multiply_by_conjugate(&product->dual_part, &multiplicand->dual_part, multiplier_to_conjugate);
}
inline void bgc_fp64_dual_quaternion_multiply_by_conjugate_quaternion(BGC_FP64_DualQuaternion* product, const BGC_FP64_DualQuaternion* multiplicand, const BGC_FP64_Quaternion* multiplier_to_conjugate)
{
bgc_fp64_quaternion_multiply_by_conjugate(&product->real_part, &multiplicand->real_part, multiplier_to_conjugate);
bgc_fp64_quaternion_multiply_by_conjugate(&product->dual_part, &multiplicand->dual_part, multiplier_to_conjugate);
}
// ======== Multiply by Dual Quaternion ========= //
inline void bgc_fp32_dual_quaternion_multiply_by_dual_quaternion(BGC_FP32_DualQuaternion* product, const BGC_FP32_DualQuaternion* left, const BGC_FP32_DualQuaternion* right)
{
BGC_FP32_Quaternion dual_part1, dual_part2;
bgc_fp32_quaternion_multiply_by_quaternion(&dual_part1, &left->real_part, &right->dual_part);
bgc_fp32_quaternion_multiply_by_quaternion(&dual_part2, &left->dual_part, &right->real_part);
bgc_fp32_quaternion_multiply_by_quaternion(&product->real_part, &left->real_part, &right->real_part);
bgc_fp32_quaternion_add(&product->dual_part, &dual_part1, &dual_part2);
}
inline void bgc_fp64_dual_quaternion_multiply_by_dual_quaternion(BGC_FP64_DualQuaternion* product, const BGC_FP64_DualQuaternion* left, const BGC_FP64_DualQuaternion* right)
{
BGC_FP64_Quaternion dual_part1, dual_part2;
bgc_fp64_quaternion_multiply_by_quaternion(&dual_part1, &left->real_part, &right->dual_part);
bgc_fp64_quaternion_multiply_by_quaternion(&dual_part2, &left->dual_part, &right->real_part);
bgc_fp64_quaternion_multiply_by_quaternion(&product->real_part, &left->real_part, &right->real_part);
bgc_fp64_quaternion_add(&product->dual_part, &dual_part1, &dual_part2);
}
// =================== Divide =================== //
inline int bgc_fp32_dual_quaternion_divide_by_real(BGC_FP32_DualQuaternion* quotient, const BGC_FP32_DualQuaternion* dividend, const float divisor)
inline int bgc_fp32_dual_quaternion_divide_by_real_number(BGC_FP32_DualQuaternion* quotient, const BGC_FP32_DualQuaternion* dividend, const float divisor)
{
if (bgc_fp32_is_zero(divisor)) {
return BGC_FAILURE;
@ -222,7 +274,7 @@ inline int bgc_fp32_dual_quaternion_divide_by_real(BGC_FP32_DualQuaternion* quot
return BGC_SUCCESS;
}
inline int bgc_fp64_dual_quaternion_divide_by_real(BGC_FP64_DualQuaternion* quotient, const BGC_FP64_DualQuaternion* dividend, const double divisor)
inline int bgc_fp64_dual_quaternion_divide_by_real_number(BGC_FP64_DualQuaternion* quotient, const BGC_FP64_DualQuaternion* dividend, const double divisor)
{
if (bgc_fp64_is_zero(divisor)) {
return BGC_FAILURE;
@ -261,7 +313,7 @@ inline int bgc_fp64_dual_quaternion_divide_by_dual_number(BGC_FP64_DualQuaternio
}
bgc_fp64_dual_quaternion_multiply_by_conjugate_number(quotient, dividend, divisor);
bgc_fp64_dual_quaternion_multiply_by_real(quotient, quotient, 1.0 / square_modulus);
bgc_fp64_dual_quaternion_multiply_by_real_number(quotient, quotient, 1.0 / square_modulus);
return BGC_SUCCESS;
}
@ -291,7 +343,7 @@ inline int bgc_fp64_dual_quaternion_divide_by_conjugate_number(BGC_FP64_DualQuat
}
bgc_fp64_dual_quaternion_multiply_by_dual_number(quotient, dividend, divisor_to_conjugate);
bgc_fp64_dual_quaternion_multiply_by_real(quotient, quotient, 1.0 / square_modulus);
bgc_fp64_dual_quaternion_multiply_by_real_number(quotient, quotient, 1.0 / square_modulus);
return BGC_SUCCESS;
}

View file

@ -49,6 +49,12 @@ extern inline void bgc_fp64_quaternion_multiply_by_real(BGC_FP64_Quaternion* pro
extern inline void bgc_fp32_quaternion_multiply_by_quaternion(BGC_FP32_Quaternion* product, const BGC_FP32_Quaternion* left, const BGC_FP32_Quaternion* right);
extern inline void bgc_fp64_quaternion_multiply_by_quaternion(BGC_FP64_Quaternion* product, const BGC_FP64_Quaternion* left, const BGC_FP64_Quaternion* right);
extern inline void bgc_fp32_quaternion_multiply_by_dual_number(BGC_FP32_DualQuaternion* product, const BGC_FP32_Quaternion* multiplicand, const BGC_FP32_DualNumber* multiplier);
extern inline void bgc_fp64_quaternion_multiply_by_dual_number(BGC_FP64_DualQuaternion* product, const BGC_FP64_Quaternion* multiplicand, const BGC_FP64_DualNumber* multiplier);
extern inline void bgc_fp32_quaternion_multiply_by_dual_quaternion(BGC_FP32_DualQuaternion* product, const BGC_FP32_Quaternion* left, const BGC_FP32_DualQuaternion* right);
extern inline void bgc_fp64_quaternion_multiply_by_dual_quaternion(BGC_FP64_DualQuaternion* product, const BGC_FP64_Quaternion* left, const BGC_FP64_DualQuaternion* right);
extern inline void bgc_fp32_quaternion_multiply_by_conjugate(BGC_FP32_Quaternion* product, const BGC_FP32_Quaternion* left, const BGC_FP32_Quaternion* right);
extern inline void bgc_fp64_quaternion_multiply_by_conjugate(BGC_FP64_Quaternion* product, const BGC_FP64_Quaternion* left, const BGC_FP64_Quaternion* right);

View file

@ -330,6 +330,34 @@ inline void bgc_fp64_quaternion_multiply_by_conjugate(BGC_FP64_Quaternion* produ
product->x3 = x3;
}
// ========== Multiply By Dual Number =========== //
inline void bgc_fp32_quaternion_multiply_by_dual_number(BGC_FP32_DualQuaternion* product, const BGC_FP32_Quaternion* multiplicand, const BGC_FP32_DualNumber* multiplier)
{
bgc_fp32_quaternion_multiply_by_real(&product->real_part, multiplicand, multiplier->real_part);
bgc_fp32_quaternion_multiply_by_real(&product->dual_part, multiplicand, multiplier->dual_part);
}
inline void bgc_fp64_quaternion_multiply_by_dual_number(BGC_FP64_DualQuaternion* product, const BGC_FP64_Quaternion* multiplicand, const BGC_FP64_DualNumber* multiplier)
{
bgc_fp64_quaternion_multiply_by_real(&product->real_part, multiplicand, multiplier->real_part);
bgc_fp64_quaternion_multiply_by_real(&product->dual_part, multiplicand, multiplier->dual_part);
}
// ======== Multiply By Dual Quaternion ========= //
inline void bgc_fp32_quaternion_multiply_by_dual_quaternion(BGC_FP32_DualQuaternion* product, const BGC_FP32_Quaternion* left, const BGC_FP32_DualQuaternion* right)
{
bgc_fp32_quaternion_multiply_by_quaternion(&product->real_part, left, &right->real_part);
bgc_fp32_quaternion_multiply_by_quaternion(&product->dual_part, left, &right->dual_part);
}
inline void bgc_fp64_quaternion_multiply_by_dual_quaternion(BGC_FP64_DualQuaternion* product, const BGC_FP64_Quaternion* left, const BGC_FP64_DualQuaternion* right)
{
bgc_fp64_quaternion_multiply_by_quaternion(&product->real_part, left, &right->real_part);
bgc_fp64_quaternion_multiply_by_quaternion(&product->dual_part, left, &right->dual_part);
}
// ============== Divide By Number ============== //
inline int bgc_fp32_quaternion_divide_by_real(BGC_FP32_Quaternion* quotient, const BGC_FP32_Quaternion* dividend, const float divisor)