diff --git a/basic-geometry/basic-geometry.vcxproj b/basic-geometry/basic-geometry.vcxproj index bd39f43..8984b17 100644 --- a/basic-geometry/basic-geometry.vcxproj +++ b/basic-geometry/basic-geometry.vcxproj @@ -26,8 +26,9 @@ + - + @@ -52,8 +53,9 @@ + - + diff --git a/basic-geometry/basic-geometry.vcxproj.filters b/basic-geometry/basic-geometry.vcxproj.filters index 4f47928..b855491 100644 --- a/basic-geometry/basic-geometry.vcxproj.filters +++ b/basic-geometry/basic-geometry.vcxproj.filters @@ -90,10 +90,13 @@ Файлы заголовков - + Файлы заголовков - + + Файлы заголовков + + Файлы заголовков @@ -152,14 +155,17 @@ Исходные файлы - - Исходные файлы - Исходные файлы Исходные файлы + + Исходные файлы + + + Исходные файлы + \ No newline at end of file diff --git a/basic-geometry/dual-quaternion.c b/basic-geometry/dual-quaternion.c index a0a1d22..8cfeede 100644 --- a/basic-geometry/dual-quaternion.c +++ b/basic-geometry/dual-quaternion.c @@ -8,3 +8,15 @@ extern inline void bgc_fp64_dual_quaternion_copy(BGC_FP64_DualQuaternion* destin extern inline void bgc_fp32_dual_quaternion_swap(BGC_FP32_DualQuaternion* first, BGC_FP32_DualQuaternion* second); extern inline void bgc_fp64_dual_quaternion_swap(BGC_FP64_DualQuaternion* first, BGC_FP64_DualQuaternion* second); + +extern inline void bgc_fp32_dual_quaternion_convert_to_fp64(BGC_FP64_DualQuaternion* destination, const BGC_FP32_DualQuaternion* source); +extern inline void bgc_fp64_dual_quaternion_convert_to_fp32(BGC_FP32_DualQuaternion* destination, const BGC_FP64_DualQuaternion* source); + +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); + +extern inline void bgc_fp32_dual_quaternion_add(BGC_FP32_DualQuaternion* sum, const BGC_FP32_DualQuaternion* base_quaternion, const BGC_FP32_DualQuaternion* scalable_quaternion, const float scale); +extern inline void bgc_fp64_dual_quaternion_add(BGC_FP64_DualQuaternion* sum, const BGC_FP64_DualQuaternion* base_quaternion, const BGC_FP64_DualQuaternion* scalable_quaternion, const double scale); + +extern inline void bgc_fp32_dual_quaternion_subtract(BGC_FP32_DualQuaternion* difference, const BGC_FP32_DualQuaternion* minuend, const BGC_FP32_DualQuaternion* subtrahend); +extern inline void bgc_fp64_dual_quaternion_subtract(BGC_FP64_DualQuaternion* difference, const BGC_FP64_DualQuaternion* minuend, const BGC_FP64_DualQuaternion* subtrahend); diff --git a/basic-geometry/dual-quaternion.h b/basic-geometry/dual-quaternion.h index d7961a9..12b3343 100644 --- a/basic-geometry/dual-quaternion.h +++ b/basic-geometry/dual-quaternion.h @@ -55,4 +55,60 @@ inline void bgc_fp64_dual_quaternion_swap(BGC_FP64_DualQuaternion* first, BGC_FP bgc_fp64_quaternion_swap(&first->dual, &second->dual); } +// ================== Convert =================== // + +inline void bgc_fp32_dual_quaternion_convert_to_fp64(BGC_FP64_DualQuaternion* destination, const BGC_FP32_DualQuaternion* source) +{ + bgc_fp32_quaternion_convert_to_fp64(&destination->real, &source->real); + bgc_fp32_quaternion_convert_to_fp64(&destination->dual, &source->dual); +} + +inline void bgc_fp64_dual_quaternion_convert_to_fp32(BGC_FP32_DualQuaternion* destination, const BGC_FP64_DualQuaternion* source) +{ + bgc_fp64_quaternion_convert_to_fp32(&destination->real, &source->real); + bgc_fp64_quaternion_convert_to_fp32(&destination->dual, &source->dual); +} + +// ==================== Add ===================== // + +inline void bgc_fp32_dual_quaternion_add(BGC_FP32_DualQuaternion* sum, const BGC_FP32_DualQuaternion* first, const BGC_FP32_DualQuaternion* second) +{ + bgc_fp32_quaternion_add(&sum->real, &first->real, &second->real); + bgc_fp32_quaternion_add(&sum->dual, &first->dual, &second->dual); +} + +inline void bgc_fp64_dual_quaternion_add(BGC_FP64_DualQuaternion* sum, const BGC_FP64_DualQuaternion* first, const BGC_FP64_DualQuaternion* second) +{ + bgc_fp64_quaternion_add(&sum->real, &first->real, &second->real); + bgc_fp64_quaternion_add(&sum->dual, &first->dual, &second->dual); +} + +// ================= Add Scaled ================= // + +inline void bgc_fp32_dual_quaternion_add(BGC_FP32_DualQuaternion* sum, const BGC_FP32_DualQuaternion* base_quaternion, const BGC_FP32_DualQuaternion* scalable_quaternion, const float scale) +{ + bgc_fp32_quaternion_add_scaled(&sum->real, &base_quaternion->real, &scalable_quaternion->real, scale); + bgc_fp32_quaternion_add_scaled(&sum->dual, &base_quaternion->dual, &scalable_quaternion->dual, scale); +} + +inline void bgc_fp64_dual_quaternion_add(BGC_FP64_DualQuaternion* sum, const BGC_FP64_DualQuaternion* base_quaternion, const BGC_FP64_DualQuaternion* scalable_quaternion, const double scale) +{ + bgc_fp64_quaternion_add_scaled(&sum->real, &base_quaternion->real, &scalable_quaternion->real, scale); + bgc_fp64_quaternion_add_scaled(&sum->dual, &base_quaternion->dual, &scalable_quaternion->dual, scale); +} + +// ================== Subtract ================== // + +inline void bgc_fp32_dual_quaternion_subtract(BGC_FP32_DualQuaternion* difference, const BGC_FP32_DualQuaternion* minuend, const BGC_FP32_DualQuaternion* subtrahend) +{ + bgc_fp32_quaternion_subtract(&difference->real, &minuend->real, &subtrahend->real); + bgc_fp32_quaternion_subtract(&difference->dual, &minuend->dual, &subtrahend->dual); +} + +inline void bgc_fp64_dual_quaternion_subtract(BGC_FP64_DualQuaternion* difference, const BGC_FP64_DualQuaternion* minuend, const BGC_FP64_DualQuaternion* subtrahend) +{ + bgc_fp64_quaternion_subtract(&difference->real, &minuend->real, &subtrahend->real); + bgc_fp64_quaternion_subtract(&difference->dual, &minuend->dual, &subtrahend->dual); +} + #endif