diff --git a/basic-geometry/dual-quaternion.c b/basic-geometry/dual-quaternion.c index 8a625b7..ab14d0f 100644 --- a/basic-geometry/dual-quaternion.c +++ b/basic-geometry/dual-quaternion.c @@ -18,6 +18,24 @@ extern inline void bgc_fp64_dual_quaternion_revert(BGC_FP64_DualQuaternion* quat extern inline void bgc_fp32_dual_quaternion_get_reverse(BGC_FP32_DualQuaternion* reverse, const BGC_FP32_DualQuaternion* quaternion); extern inline void bgc_fp64_dual_quaternion_get_reverse(BGC_FP64_DualQuaternion* reverse, const BGC_FP64_DualQuaternion* quaternion); +extern inline void bgc_fp32_dual_quaternion_component_conjugate(BGC_FP32_DualQuaternion* quaternion); +extern inline void bgc_fp64_dual_quaternion_component_conjugate(BGC_FP64_DualQuaternion* quaternion); + +extern inline void bgc_fp32_dual_quaternion_get_component_conjugate(BGC_FP32_DualQuaternion* conjugate, const BGC_FP32_DualQuaternion* quaternion); +extern inline void bgc_fp64_dual_quaternion_get_component_conjugate(BGC_FP64_DualQuaternion* conjugate, const BGC_FP64_DualQuaternion* quaternion); + +extern inline void bgc_fp32_dual_quaternion_dual_conjugate(BGC_FP32_DualQuaternion* quaternion); +extern inline void bgc_fp64_dual_quaternion_dual_conjugate(BGC_FP64_DualQuaternion* quaternion); + +extern inline void bgc_fp32_dual_quaternion_get_dual_conjugate(BGC_FP32_DualQuaternion* conjugate, const BGC_FP32_DualQuaternion* quaternion); +extern inline void bgc_fp64_dual_quaternion_get_dual_conjugate(BGC_FP64_DualQuaternion* conjugate, const BGC_FP64_DualQuaternion* quaternion); + +extern inline void bgc_fp32_dual_quaternion_fully_conjugate(BGC_FP32_DualQuaternion* quaternion); +extern inline void bgc_fp64_dual_quaternion_fully_conjugate(BGC_FP64_DualQuaternion* quaternion); + +extern inline void bgc_fp32_dual_quaternion_get_fully_conjugate(BGC_FP32_DualQuaternion* conjugate, const BGC_FP32_DualQuaternion* quaternion); +extern inline void bgc_fp64_dual_quaternion_get_fully_conjugate(BGC_FP64_DualQuaternion* conjugate, const BGC_FP64_DualQuaternion* quaternion); + extern inline void bgc_fp32_dual_quaternion_add(BGC_FP32_DualQuaternion* sum, const BGC_FP32_DualQuaternion* first, const BGC_FP32_DualQuaternion* second); extern inline void bgc_fp64_dual_quaternion_add(BGC_FP64_DualQuaternion* sum, const BGC_FP64_DualQuaternion* first, const BGC_FP64_DualQuaternion* second); diff --git a/basic-geometry/dual-quaternion.h b/basic-geometry/dual-quaternion.h index a666694..4c9450d 100644 --- a/basic-geometry/dual-quaternion.h +++ b/basic-geometry/dual-quaternion.h @@ -88,6 +88,108 @@ inline void bgc_fp64_dual_quaternion_get_reverse(BGC_FP64_DualQuaternion* revers bgc_fp64_quaternion_get_reverse(&reverse->dual_part, &quaternion->dual_part); } +// ============ Component Conjugate ============= // + +inline void bgc_fp32_dual_quaternion_component_conjugate(BGC_FP32_DualQuaternion* quaternion) +{ + bgc_fp32_quaternion_conjugate(&quaternion->real_part); + bgc_fp32_quaternion_conjugate(&quaternion->dual_part); +} + +inline void bgc_fp64_dual_quaternion_component_conjugate(BGC_FP64_DualQuaternion* quaternion) +{ + bgc_fp64_quaternion_conjugate(&quaternion->real_part); + bgc_fp64_quaternion_conjugate(&quaternion->dual_part); +} + +// ========== Get Component Conjugate =========== // + +inline void bgc_fp32_dual_quaternion_get_component_conjugate(BGC_FP32_DualQuaternion* conjugate, const BGC_FP32_DualQuaternion* quaternion) +{ + bgc_fp32_quaternion_get_conjugate(&conjugate->real_part, &quaternion->real_part); + bgc_fp32_quaternion_get_conjugate(&conjugate->dual_part, &quaternion->dual_part); +} + +inline void bgc_fp64_dual_quaternion_get_component_conjugate(BGC_FP64_DualQuaternion* conjugate, const BGC_FP64_DualQuaternion* quaternion) +{ + bgc_fp64_quaternion_get_conjugate(&conjugate->real_part, &quaternion->real_part); + bgc_fp64_quaternion_get_conjugate(&conjugate->dual_part, &quaternion->dual_part); +} + +// =============== Dual Conjugate =============== // + +inline void bgc_fp32_dual_quaternion_dual_conjugate(BGC_FP32_DualQuaternion* quaternion) +{ + bgc_fp32_quaternion_revert(&quaternion->dual_part); +} + +inline void bgc_fp64_dual_quaternion_dual_conjugate(BGC_FP64_DualQuaternion* quaternion) +{ + bgc_fp64_quaternion_revert(&quaternion->dual_part); +} + +// ============= Get Dual Conjugate ============= // + +inline void bgc_fp32_dual_quaternion_get_dual_conjugate(BGC_FP32_DualQuaternion* conjugate, const BGC_FP32_DualQuaternion* quaternion) +{ + bgc_fp32_quaternion_copy(&conjugate->real_part, &quaternion->dual_part); + bgc_fp32_quaternion_get_reverse(&conjugate->real_part, &quaternion->dual_part); +} + +inline void bgc_fp64_dual_quaternion_get_dual_conjugate(BGC_FP64_DualQuaternion* conjugate, const BGC_FP64_DualQuaternion* quaternion) +{ + bgc_fp64_quaternion_copy(&conjugate->real_part, &quaternion->dual_part); + bgc_fp64_quaternion_get_reverse(&conjugate->real_part, &quaternion->dual_part); +} + +// ============== Fully Conjugate =============== // + +inline void bgc_fp32_dual_quaternion_fully_conjugate(BGC_FP32_DualQuaternion* quaternion) +{ + quaternion->real_part.x1 = -quaternion->real_part.x1; + quaternion->real_part.x2 = -quaternion->real_part.x2; + quaternion->real_part.x3 = -quaternion->real_part.x3; + + quaternion->dual_part.s0 = -quaternion->dual_part.s0; +} + +inline void bgc_fp64_dual_quaternion_fully_conjugate(BGC_FP64_DualQuaternion* quaternion) +{ + quaternion->real_part.x1 = -quaternion->real_part.x1; + quaternion->real_part.x2 = -quaternion->real_part.x2; + quaternion->real_part.x3 = -quaternion->real_part.x3; + + quaternion->dual_part.s0 = -quaternion->dual_part.s0; +} + +// ============ Get Fully Conjugate ============= // + +inline void bgc_fp32_dual_quaternion_get_fully_conjugate(BGC_FP32_DualQuaternion* conjugate, const BGC_FP32_DualQuaternion* quaternion) +{ + conjugate->real_part.s0 = quaternion->real_part.s0; + conjugate->real_part.x1 = -quaternion->real_part.x1; + conjugate->real_part.x2 = -quaternion->real_part.x2; + conjugate->real_part.x3 = -quaternion->real_part.x3; + + conjugate->dual_part.s0 = -quaternion->dual_part.s0; + conjugate->dual_part.x1 = quaternion->dual_part.x1; + conjugate->dual_part.x2 = quaternion->dual_part.x2; + conjugate->dual_part.x3 = quaternion->dual_part.x3; +} + +inline void bgc_fp64_dual_quaternion_get_fully_conjugate(BGC_FP64_DualQuaternion* conjugate, const BGC_FP64_DualQuaternion* quaternion) +{ + conjugate->real_part.s0 = quaternion->real_part.s0; + conjugate->real_part.x1 = -quaternion->real_part.x1; + conjugate->real_part.x2 = -quaternion->real_part.x2; + conjugate->real_part.x3 = -quaternion->real_part.x3; + + conjugate->dual_part.s0 = -quaternion->dual_part.s0; + conjugate->dual_part.x1 = quaternion->dual_part.x1; + conjugate->dual_part.x2 = quaternion->dual_part.x2; + conjugate->dual_part.x3 = quaternion->dual_part.x3; +} + // ==================== Add ===================== // inline void bgc_fp32_dual_quaternion_add(BGC_FP32_DualQuaternion* sum, const BGC_FP32_DualQuaternion* first, const BGC_FP32_DualQuaternion* second) @@ -258,30 +360,6 @@ inline void bgc_fp64_dual_quaternion_multiply_by_dual_quaternion(BGC_FP64_DualQu bgc_fp64_quaternion_add(&product->dual_part, &dual_part1, &dual_part2); } -// === Multiply by Conjugate Dual Quaternion ==== // - -inline void bgc_fp32_dual_quaternion_multiply_by_conjugate_dual_quaternion(BGC_FP32_DualQuaternion* product, const BGC_FP32_DualQuaternion* multiplicand, const BGC_FP32_DualQuaternion* multiplier_to_conjugate) -{ - BGC_FP32_Quaternion dual_part1, dual_part2; - - bgc_fp32_quaternion_multiply_by_conjugate(&dual_part1, &multiplicand->real_part, &multiplier_to_conjugate->dual_part); - bgc_fp32_quaternion_multiply_by_conjugate(&dual_part2, &multiplicand->dual_part, &multiplier_to_conjugate->real_part); - - bgc_fp32_quaternion_multiply_by_conjugate(&product->real_part, &multiplicand->real_part, &multiplier_to_conjugate->real_part); - bgc_fp32_quaternion_add(&product->dual_part, &dual_part1, &dual_part2); -} - -inline void bgc_fp64_dual_quaternion_multiply_by_conjugate_dual_quaternion(BGC_FP64_DualQuaternion* product, const BGC_FP64_DualQuaternion* multiplicand, const BGC_FP64_DualQuaternion* multiplier_to_conjugate) -{ - BGC_FP64_Quaternion dual_part1, dual_part2; - - bgc_fp64_quaternion_multiply_by_conjugate(&dual_part1, &multiplicand->real_part, &multiplier_to_conjugate->dual_part); - bgc_fp64_quaternion_multiply_by_conjugate(&dual_part2, &multiplicand->dual_part, &multiplier_to_conjugate->real_part); - - bgc_fp64_quaternion_multiply_by_quaternion(&product->real_part, &multiplicand->real_part, &multiplier_to_conjugate->real_part); - bgc_fp64_quaternion_add(&product->dual_part, &dual_part1, &dual_part2); -} - // =================== Divide =================== // inline int bgc_fp32_dual_quaternion_divide_by_real_number(BGC_FP32_DualQuaternion* quotient, const BGC_FP32_DualQuaternion* dividend, const float divisor)