From a8a22cdcc12a2bc717ad3a99a6a6b1ce8e27cb80 Mon Sep 17 00:00:00 2001 From: Andrey Pokidov Date: Tue, 17 Feb 2026 21:28:51 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D1=83=D0=BC=D0=BD=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B4=D1=83=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20?= =?UTF-8?q?=D0=BA=D0=B2=D0=B0=D1=82=D0=B5=D1=80=D0=BD=D0=B8=D0=BE=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=20=D1=81=20=D0=BF=D1=80=D0=BE=D1=87=D0=B8=D0=BC?= =?UTF-8?q?=D0=B8=20=D1=81=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82=D1=8F=D0=BC?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic-geometry/dual-quaternion.c | 19 +++++++--- basic-geometry/dual-quaternion.h | 62 +++++++++++++++++++++++++++++--- basic-geometry/quaternion.c | 6 ++++ basic-geometry/quaternion.h | 28 +++++++++++++++ 4 files changed, 105 insertions(+), 10 deletions(-) diff --git a/basic-geometry/dual-quaternion.c b/basic-geometry/dual-quaternion.c index ad980cf..35bb852 100644 --- a/basic-geometry/dual-quaternion.c +++ b/basic-geometry/dual-quaternion.c @@ -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); diff --git a/basic-geometry/dual-quaternion.h b/basic-geometry/dual-quaternion.h index 8d3d291..308d8a8 100644 --- a/basic-geometry/dual-quaternion.h +++ b/basic-geometry/dual-quaternion.h @@ -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; } diff --git a/basic-geometry/quaternion.c b/basic-geometry/quaternion.c index 97a1769..1a6d100 100644 --- a/basic-geometry/quaternion.c +++ b/basic-geometry/quaternion.c @@ -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); diff --git a/basic-geometry/quaternion.h b/basic-geometry/quaternion.h index c4e3fcd..3501483 100644 --- a/basic-geometry/quaternion.h +++ b/basic-geometry/quaternion.h @@ -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)