diff --git a/basic-geometry/basic-geometry.cbp b/basic-geometry/basic-geometry.cbp
index 4d62d04..cab3b51 100644
--- a/basic-geometry/basic-geometry.cbp
+++ b/basic-geometry/basic-geometry.cbp
@@ -60,30 +60,26 @@
-
-
-
-
+
+
+
+
-
+
-
-
+
+
-
-
-
-
-
+
@@ -112,10 +108,10 @@
-
+
-
+
@@ -124,6 +120,7 @@
+
diff --git a/basic-geometry/basic-geometry.h b/basic-geometry/basic-geometry.h
index 5384baa..bff27ea 100644
--- a/basic-geometry/basic-geometry.h
+++ b/basic-geometry/basic-geometry.h
@@ -24,9 +24,9 @@
#include "./turn2.h"
#include "./turn3.h"
+#include "./slerp3.h"
+
#include "./position2.h"
#include "./position3.h"
-#include "./slerp.h"
-
#endif
diff --git a/basic-geometry/basic-geometry.vcxproj b/basic-geometry/basic-geometry.vcxproj
index 02dec81..01be767 100644
--- a/basic-geometry/basic-geometry.vcxproj
+++ b/basic-geometry/basic-geometry.vcxproj
@@ -24,11 +24,11 @@
-
+
-
-
+
+
@@ -40,7 +40,7 @@
-
+
@@ -49,11 +49,11 @@
-
+
-
-
+
+
@@ -64,7 +64,7 @@
-
+
diff --git a/basic-geometry/dual-number.c b/basic-geometry/dual-number.c
deleted file mode 100644
index fb9cfed..0000000
--- a/basic-geometry/dual-number.c
+++ /dev/null
@@ -1,55 +0,0 @@
-#include "./dual-number.h"
-
-extern inline void bgc_fp32_dual_number_reset(BGC_FP32_DualNumber* number);
-extern inline void bgc_fp64_dual_number_reset(BGC_FP64_DualNumber* number);
-
-extern inline void bgc_fp32_dual_number_make(BGC_FP32_DualNumber* number, const float real, const float dual);
-extern inline void bgc_fp64_dual_number_make(BGC_FP64_DualNumber* number, const double real, const double dual);
-
-extern inline void bgc_fp32_dual_number_copy(BGC_FP32_DualNumber* destination, const BGC_FP32_DualNumber* source);
-extern inline void bgc_fp64_dual_number_copy(BGC_FP64_DualNumber* destination, const BGC_FP64_DualNumber* source);
-
-extern inline void bgc_fp32_dual_number_swap(BGC_FP32_DualNumber* first, BGC_FP32_DualNumber* second);
-extern inline void bgc_fp64_dual_number_swap(BGC_FP64_DualNumber* first, BGC_FP64_DualNumber* second);
-
-extern inline void bgc_fp32_dual_number_revert(BGC_FP32_DualNumber* number);
-extern inline void bgc_fp64_dual_number_revert(BGC_FP64_DualNumber* number);
-
-extern inline void bgc_fp32_number_get_reverse(BGC_FP32_DualNumber* reverse, const BGC_FP32_DualNumber* number);
-extern inline void bgc_fp64_number_get_reverse(BGC_FP64_DualNumber* reverse, const BGC_FP64_DualNumber* number);
-
-extern inline void bgc_fp32_dual_number_conjugate(BGC_FP32_DualNumber* number);
-extern inline void bgc_fp64_dual_number_conjugate(BGC_FP64_DualNumber* number);
-
-extern inline void bgc_fp32_dual_number_get_conjugate(BGC_FP32_DualNumber* conjugate, const BGC_FP32_DualNumber* number);
-extern inline void bgc_fp64_dual_number_get_conjugate(BGC_FP64_DualNumber* conjugate, const BGC_FP64_DualNumber* number);
-
-extern inline void bgc_fp32_dual_number_add(BGC_FP32_DualNumber* sum, const BGC_FP32_DualNumber* first, const BGC_FP32_DualNumber* second);
-extern inline void bgc_fp64_dual_number_add(BGC_FP64_DualNumber* sum, const BGC_FP64_DualNumber* first, const BGC_FP64_DualNumber* second);
-
-extern inline void bgc_fp32_dual_number_add_scaled(BGC_FP32_DualNumber* sum, const BGC_FP32_DualNumber* base_number, const BGC_FP32_DualNumber* scalable_number, const float scale);
-extern inline void bgc_fp64_dual_number_add_scaled(BGC_FP64_DualNumber* sum, const BGC_FP64_DualNumber* base_number, const BGC_FP64_DualNumber* scalable_number, const double scale);
-
-extern inline void bgc_fp32_dual_number_subtract(BGC_FP32_DualNumber* difference, const BGC_FP32_DualNumber* minuend, const BGC_FP32_DualNumber* subtrahend);
-extern inline void bgc_fp64_dual_number_subtract(BGC_FP64_DualNumber* difference, const BGC_FP64_DualNumber* minuend, const BGC_FP64_DualNumber* subtrahend);
-
-extern inline void bgc_fp32_dual_number_multiply_by_real_number(BGC_FP32_DualNumber* product, const BGC_FP32_DualNumber* multiplicand, const float multiplier);
-extern inline void bgc_fp64_dual_number_multiply_by_real_number(BGC_FP64_DualNumber* product, const BGC_FP64_DualNumber* multiplicand, const double multiplier);
-
-extern inline void bgc_fp32_dual_number_multiply_by_dual_number(BGC_FP32_DualNumber* product, const BGC_FP32_DualNumber* first, const BGC_FP32_DualNumber* second);
-extern inline void bgc_fp64_dual_number_multiply_by_dual_number(BGC_FP64_DualNumber* product, const BGC_FP64_DualNumber* first, const BGC_FP64_DualNumber* second);
-
-extern inline void bgc_fp32_dual_number_divide_by_real_number(BGC_FP32_DualNumber* quotient, const BGC_FP32_DualNumber* dividend, const float divisor);
-extern inline void bgc_fp64_dual_number_divide_by_real_number(BGC_FP64_DualNumber* quotient, const BGC_FP64_DualNumber* dividend, const double divisor);
-
-extern inline void bgc_fp32_dual_number_divide_by_dual_number(BGC_FP32_DualNumber* quotient, const BGC_FP32_DualNumber* dividend, const BGC_FP32_DualNumber* divisor);
-extern inline void bgc_fp64_dual_number_divide_by_dual_number(BGC_FP64_DualNumber* quotient, const BGC_FP64_DualNumber* dividend, const BGC_FP64_DualNumber* divisor);
-
-extern inline void bgc_fp32_dual_number_get_mean2(BGC_FP32_DualNumber* mean, const BGC_FP32_DualNumber* first, const BGC_FP32_DualNumber* second);
-extern inline void bgc_fp64_dual_number_get_mean2(BGC_FP64_DualNumber* mean, const BGC_FP64_DualNumber* first, const BGC_FP64_DualNumber* second);
-
-extern inline void bgc_fp32_dual_number_get_mean3(BGC_FP32_DualNumber* mean, const BGC_FP32_DualNumber* first, const BGC_FP32_DualNumber* second, const BGC_FP32_DualNumber* third);
-extern inline void bgc_fp64_dual_number_get_mean3(BGC_FP64_DualNumber* mean, const BGC_FP64_DualNumber* first, const BGC_FP64_DualNumber* second, const BGC_FP64_DualNumber* third);
-
-extern inline void bgc_fp32_dual_number_interpolate(BGC_FP32_DualNumber* interpolation, const BGC_FP32_DualNumber* first, const BGC_FP32_DualNumber* second, const float phase);
-extern inline void bgc_fp64_dual_number_interpolate(BGC_FP64_DualNumber* interpolation, const BGC_FP64_DualNumber* first, const BGC_FP64_DualNumber* second, const double phase);
diff --git a/basic-geometry/dual-number.h b/basic-geometry/dual-number.h
deleted file mode 100644
index 41a4840..0000000
--- a/basic-geometry/dual-number.h
+++ /dev/null
@@ -1,273 +0,0 @@
-#ifndef _BGC_DUAL_NUMBER_H_INCLUDED_
-#define _BGC_DUAL_NUMBER_H_INCLUDED_
-
-#include "./utilities.h"
-#include "./types.h"
-
-// =================== Reset ==================== //
-
-inline void bgc_fp32_dual_number_reset(BGC_FP32_DualNumber* number)
-{
- number->real = 0.0f;
- number->dual = 0.0f;
-}
-
-inline void bgc_fp64_dual_number_reset(BGC_FP64_DualNumber* number)
-{
- number->real = 0.0;
- number->dual = 0.0;
-}
-
-// ==================== Make ==================== //
-
-inline void bgc_fp32_dual_number_make(BGC_FP32_DualNumber* number, const float real, const float dual)
-{
- number->real = real;
- number->dual = dual;
-}
-
-inline void bgc_fp64_dual_number_make(BGC_FP64_DualNumber* number, const double real, const double dual)
-{
- number->real = real;
- number->dual = dual;
-}
-
-// ==================== Copy ==================== //
-
-inline void bgc_fp32_dual_number_copy(BGC_FP32_DualNumber* destination, const BGC_FP32_DualNumber* source)
-{
- destination->real = source->real;
- destination->dual = source->dual;
-}
-
-inline void bgc_fp64_dual_number_copy(BGC_FP64_DualNumber* destination, const BGC_FP64_DualNumber* source)
-{
- destination->real = source->real;
- destination->dual = source->dual;
-}
-
-// ==================== Swap ==================== //
-
-inline void bgc_fp32_dual_number_swap(BGC_FP32_DualNumber* first, BGC_FP32_DualNumber* second)
-{
- first->real = second->real;
- first->dual = second->dual;
-}
-
-inline void bgc_fp64_dual_number_swap(BGC_FP64_DualNumber* first, BGC_FP64_DualNumber* second)
-{
- first->real = second->real;
- first->dual = second->dual;
-}
-
-// ================== Convert =================== //
-
-inline void bgc_fp64_dual_number_convert_to_fp32(BGC_FP32_DualNumber* first, BGC_FP64_DualNumber* second)
-{
- first->real = (float) second->real;
- first->dual = (float) second->dual;
-}
-
-inline void bgc_fp32_dual_number_convert_to_fp64(BGC_FP64_DualNumber* first, BGC_FP32_DualNumber* second)
-{
- first->real = second->real;
- first->dual = second->dual;
-}
-
-// =================== Revert =================== //
-
-inline void bgc_fp32_dual_number_revert(BGC_FP32_DualNumber* number)
-{
- number->real = -number->real;
- number->dual = -number->dual;
-}
-
-inline void bgc_fp64_dual_number_revert(BGC_FP64_DualNumber* number)
-{
- number->real = -number->real;
- number->dual = -number->dual;
-}
-
-// ================ Get Reverse ================= //
-
-inline void bgc_fp32_number_get_reverse(BGC_FP32_DualNumber* reverse, const BGC_FP32_DualNumber* number)
-{
- reverse->real = -number->real;
- reverse->dual = -number->dual;
-}
-
-inline void bgc_fp64_number_get_reverse(BGC_FP64_DualNumber* reverse, const BGC_FP64_DualNumber* number)
-{
- reverse->real = -number->real;
- reverse->dual = -number->dual;
-}
-
-// ================= Conjugate ================== //
-
-inline void bgc_fp32_dual_number_conjugate(BGC_FP32_DualNumber* number)
-{
- number->dual = -number->dual;
-}
-
-inline void bgc_fp64_dual_number_conjugate(BGC_FP64_DualNumber* number)
-{
- number->dual = -number->dual;
-}
-
-// =============== Get Conjugate ================ //
-
-inline void bgc_fp32_dual_number_get_conjugate(BGC_FP32_DualNumber* conjugate, const BGC_FP32_DualNumber* number)
-{
- conjugate->real = number->real;
- conjugate->dual = -number->dual;
-}
-
-inline void bgc_fp64_dual_number_get_conjugate(BGC_FP64_DualNumber* conjugate, const BGC_FP64_DualNumber* number)
-{
- conjugate->real = number->real;
- conjugate->dual = -number->dual;
-}
-
-// ==================== Add ===================== //
-
-inline void bgc_fp32_dual_number_add(BGC_FP32_DualNumber* sum, const BGC_FP32_DualNumber* first, const BGC_FP32_DualNumber* second)
-{
- sum->real = first->real + second->real;
- sum->dual = first->dual + second->dual;
-}
-
-inline void bgc_fp64_dual_number_add(BGC_FP64_DualNumber* sum, const BGC_FP64_DualNumber* first, const BGC_FP64_DualNumber* second)
-{
- sum->real = first->real + second->real;
- sum->dual = first->dual + second->dual;
-}
-
-// ================= Add Scaled ================= //
-
-inline void bgc_fp32_dual_number_add_scaled(BGC_FP32_DualNumber* sum, const BGC_FP32_DualNumber* base_number, const BGC_FP32_DualNumber* scalable_number, const float scale)
-{
- sum->real = base_number->real + scalable_number->real * scale;
- sum->dual = base_number->dual + scalable_number->dual * scale;
-}
-
-inline void bgc_fp64_dual_number_add_scaled(BGC_FP64_DualNumber* sum, const BGC_FP64_DualNumber* base_number, const BGC_FP64_DualNumber* scalable_number, const double scale)
-{
- sum->real = base_number->real + scalable_number->real * scale;
- sum->dual = base_number->dual + scalable_number->dual * scale;
-}
-
-// ================== Subtract ================== //
-
-inline void bgc_fp32_dual_number_subtract(BGC_FP32_DualNumber* difference, const BGC_FP32_DualNumber* minuend, const BGC_FP32_DualNumber* subtrahend)
-{
- difference->real = minuend->real - subtrahend->real;
- difference->dual = minuend->dual - subtrahend->dual;
-}
-
-inline void bgc_fp64_dual_number_subtract(BGC_FP64_DualNumber* difference, const BGC_FP64_DualNumber* minuend, const BGC_FP64_DualNumber* subtrahend)
-{
- difference->real = minuend->real - subtrahend->real;
- difference->dual = minuend->dual - subtrahend->dual;
-}
-
-// ================== Multiply ================== //
-
-inline void bgc_fp32_dual_number_multiply_by_real_number(BGC_FP32_DualNumber* product, const BGC_FP32_DualNumber* multiplicand, const float multiplier)
-{
- product->real = multiplicand->real * multiplier;
- product->dual = multiplicand->dual * multiplier;
-}
-
-inline void bgc_fp64_dual_number_multiply_by_real_number(BGC_FP64_DualNumber* product, const BGC_FP64_DualNumber* multiplicand, const double multiplier)
-{
- product->real = multiplicand->real * multiplier;
- product->dual = multiplicand->dual * multiplier;
-}
-
-inline void bgc_fp32_dual_number_multiply_by_dual_number(BGC_FP32_DualNumber* product, const BGC_FP32_DualNumber* first, const BGC_FP32_DualNumber* second)
-{
- product->real = first->real * second->real;
- product->dual = first->dual * second->real + first->real * second->dual;
-}
-
-inline void bgc_fp64_dual_number_multiply_by_dual_number(BGC_FP64_DualNumber* product, const BGC_FP64_DualNumber* first, const BGC_FP64_DualNumber* second)
-{
- product->real = first->real * second->real;
- product->dual = first->dual * second->real + first->real * second->dual;
-}
-
-// =================== Divide =================== //
-
-inline void bgc_fp32_dual_number_divide_by_real_number(BGC_FP32_DualNumber* quotient, const BGC_FP32_DualNumber* dividend, const float divisor)
-{
- bgc_fp32_dual_number_multiply_by_real_number(quotient, dividend, 1.0f / divisor);
-}
-
-inline void bgc_fp64_dual_number_divide_by_real_number(BGC_FP64_DualNumber* quotient, const BGC_FP64_DualNumber* dividend, const double divisor)
-{
- bgc_fp64_dual_number_multiply_by_real_number(quotient, dividend, 1.0 / divisor);
-}
-
-inline void bgc_fp32_dual_number_divide_by_dual_number(BGC_FP32_DualNumber* quotient, const BGC_FP32_DualNumber* dividend, const BGC_FP32_DualNumber* divisor)
-{
- const float mutliplier_real = 1 / divisor->real;
-
- quotient->real = dividend->real * mutliplier_real;
- quotient->dual = dividend->dual * mutliplier_real - dividend->real * divisor->dual / (divisor->real * divisor->real);
-}
-
-inline void bgc_fp64_dual_number_divide_by_dual_number(BGC_FP64_DualNumber* quotient, const BGC_FP64_DualNumber* dividend, const BGC_FP64_DualNumber* divisor)
-{
- const double mutliplier_real = 1 / divisor->real;
-
- quotient->real = dividend->real * mutliplier_real;
- quotient->dual = dividend->dual * mutliplier_real - dividend->real * divisor->dual / (divisor->real * divisor->real);
-}
-
-// ================ Mean of Two ================= //
-
-inline void bgc_fp32_dual_number_get_mean2(BGC_FP32_DualNumber* mean, const BGC_FP32_DualNumber* first, const BGC_FP32_DualNumber* second)
-{
- mean->real = (first->real + second->real) * 0.5f;
- mean->dual = (first->dual + second->dual) * 0.5f;
-}
-
-inline void bgc_fp64_dual_number_get_mean2(BGC_FP64_DualNumber* mean, const BGC_FP64_DualNumber* first, const BGC_FP64_DualNumber* second)
-{
- mean->real = (first->real + second->real) * 0.5;
- mean->dual = (first->dual + second->dual) * 0.5;
-}
-
-// =============== Mean of Three ================ //
-
-inline void bgc_fp32_dual_number_get_mean3(BGC_FP32_DualNumber* mean, const BGC_FP32_DualNumber* first, const BGC_FP32_DualNumber* second, const BGC_FP32_DualNumber* third)
-{
- mean->real = (first->real + second->real + third->real) * BGC_FP32_ONE_THIRD;
- mean->dual = (first->dual + second->dual + third->dual) * BGC_FP32_ONE_THIRD;
-}
-
-inline void bgc_fp64_dual_number_get_mean3(BGC_FP64_DualNumber* mean, const BGC_FP64_DualNumber* first, const BGC_FP64_DualNumber* second, const BGC_FP64_DualNumber* third)
-{
- mean->real = (first->real + second->real + third->real) * BGC_FP64_ONE_THIRD;
- mean->dual = (first->dual + second->dual + third->dual) * BGC_FP64_ONE_THIRD;
-}
-
-// ============ Linear Interpolation ============ //
-
-inline void bgc_fp32_dual_number_interpolate(BGC_FP32_DualNumber* interpolation, const BGC_FP32_DualNumber* first, const BGC_FP32_DualNumber* second, const float phase)
-{
- const float counter_phase = 1.0f - phase;
-
- interpolation->real = first->real *counter_phase + second->real * phase;
- interpolation->dual = first->dual *counter_phase + second->dual * phase;
-}
-
-inline void bgc_fp64_dual_number_interpolate(BGC_FP64_DualNumber* interpolation, const BGC_FP64_DualNumber* first, const BGC_FP64_DualNumber* second, const double phase)
-{
- const double counter_phase = 1.0 - phase;
-
- interpolation->real = first->real * counter_phase + second->real * phase;
- interpolation->dual = first->dual * counter_phase + second->dual * phase;
-}
-
-#endif
diff --git a/basic-geometry/dual-quaternion.h b/basic-geometry/dual-quaternion.h
index 8ac3236..58e8026 100644
--- a/basic-geometry/dual-quaternion.h
+++ b/basic-geometry/dual-quaternion.h
@@ -8,112 +8,112 @@
inline void bgc_fp32_dual_quaternion_reset(BGC_FP32_DualQuaternion* quaternion)
{
- bgc_fp32_quaternion_reset(&quaternion->real);
- bgc_fp32_quaternion_reset(&quaternion->dual);
+ bgc_fp32_quaternion_reset(&quaternion->real_part);
+ bgc_fp32_quaternion_reset(&quaternion->dual_part);
}
inline void bgc_fp64_dual_quaternion_reset(BGC_FP64_DualQuaternion* quaternion)
{
- bgc_fp64_quaternion_reset(&quaternion->real);
- bgc_fp64_quaternion_reset(&quaternion->dual);
+ bgc_fp64_quaternion_reset(&quaternion->real_part);
+ bgc_fp64_quaternion_reset(&quaternion->dual_part);
}
// ==================== Copy ==================== //
inline void bgc_fp32_dual_quaternion_copy(BGC_FP32_DualQuaternion* destination, const BGC_FP32_DualQuaternion* source)
{
- bgc_fp32_quaternion_copy(&destination->real, &source->real);
- bgc_fp32_quaternion_copy(&destination->dual, &source->dual);
+ bgc_fp32_quaternion_copy(&destination->real_part, &source->real_part);
+ bgc_fp32_quaternion_copy(&destination->dual_part, &source->dual_part);
}
inline void bgc_fp64_dual_quaternion_copy(BGC_FP64_DualQuaternion* destination, const BGC_FP64_DualQuaternion* source)
{
- bgc_fp64_quaternion_copy(&destination->real, &source->real);
- bgc_fp64_quaternion_copy(&destination->dual, &source->dual);
+ bgc_fp64_quaternion_copy(&destination->real_part, &source->real_part);
+ bgc_fp64_quaternion_copy(&destination->dual_part, &source->dual_part);
}
// ==================== Swap ==================== //
inline void bgc_fp32_dual_quaternion_swap(BGC_FP32_DualQuaternion* first, BGC_FP32_DualQuaternion* second)
{
- bgc_fp32_quaternion_swap(&first->real, &second->real);
- bgc_fp32_quaternion_swap(&first->dual, &second->dual);
+ bgc_fp32_quaternion_swap(&first->real_part, &second->real_part);
+ bgc_fp32_quaternion_swap(&first->dual_part, &second->dual_part);
}
inline void bgc_fp64_dual_quaternion_swap(BGC_FP64_DualQuaternion* first, BGC_FP64_DualQuaternion* second)
{
- bgc_fp64_quaternion_swap(&first->real, &second->real);
- bgc_fp64_quaternion_swap(&first->dual, &second->dual);
+ bgc_fp64_quaternion_swap(&first->real_part, &second->real_part);
+ bgc_fp64_quaternion_swap(&first->dual_part, &second->dual_part);
}
// ================== 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);
+ bgc_fp32_quaternion_convert_to_fp64(&destination->real_part, &source->real_part);
+ bgc_fp32_quaternion_convert_to_fp64(&destination->dual_part, &source->dual_part);
}
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);
+ bgc_fp64_quaternion_convert_to_fp32(&destination->real_part, &source->real_part);
+ bgc_fp64_quaternion_convert_to_fp32(&destination->dual_part, &source->dual_part);
}
// ==================== 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);
+ bgc_fp32_quaternion_add(&sum->real_part, &first->real_part, &second->real_part);
+ bgc_fp32_quaternion_add(&sum->dual_part, &first->dual_part, &second->dual_part);
}
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);
+ bgc_fp64_quaternion_add(&sum->real_part, &first->real_part, &second->real_part);
+ bgc_fp64_quaternion_add(&sum->dual_part, &first->dual_part, &second->dual_part);
}
// ================= Add Scaled ================= //
inline void bgc_fp32_dual_quaternion_add_scaled(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);
+ bgc_fp32_quaternion_add_scaled(&sum->real_part, &base_quaternion->real_part, &scalable_quaternion->real_part, scale);
+ bgc_fp32_quaternion_add_scaled(&sum->dual_part, &base_quaternion->dual_part, &scalable_quaternion->dual_part, scale);
}
inline void bgc_fp64_dual_quaternion_add_scaled(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);
+ bgc_fp64_quaternion_add_scaled(&sum->real_part, &base_quaternion->real_part, &scalable_quaternion->real_part, scale);
+ bgc_fp64_quaternion_add_scaled(&sum->dual_part, &base_quaternion->dual_part, &scalable_quaternion->dual_part, 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);
+ bgc_fp32_quaternion_subtract(&difference->real_part, &minuend->real_part, &subtrahend->real_part);
+ bgc_fp32_quaternion_subtract(&difference->dual_part, &minuend->dual_part, &subtrahend->dual_part);
}
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);
+ bgc_fp64_quaternion_subtract(&difference->real_part, &minuend->real_part, &subtrahend->real_part);
+ bgc_fp64_quaternion_subtract(&difference->dual_part, &minuend->dual_part, &subtrahend->dual_part);
}
// ================== Multiply ================== //
inline void bgc_fp32_dual_quaternion_multiply_by_real(BGC_FP32_DualQuaternion* product, const BGC_FP32_DualQuaternion* multiplicand, const float multipier)
{
- bgc_fp32_quaternion_multiply_by_real(&product->real, &multiplicand->real, multipier);
- bgc_fp32_quaternion_multiply_by_real(&product->dual, &multiplicand->dual, multipier);
+ bgc_fp32_quaternion_multiply_by_real(&product->real_part, &multiplicand->real_part, multipier);
+ bgc_fp32_quaternion_multiply_by_real(&product->dual_part, &multiplicand->dual_part, multipier);
}
inline void bgc_fp64_dual_quaternion_multiply_by_real(BGC_FP64_DualQuaternion* product, const BGC_FP64_DualQuaternion* multiplicand, const double multipier)
{
- bgc_fp64_quaternion_multiply_by_real(&product->real, &multiplicand->real, multipier);
- bgc_fp64_quaternion_multiply_by_real(&product->dual, &multiplicand->dual, multipier);
+ bgc_fp64_quaternion_multiply_by_real(&product->real_part, &multiplicand->real_part, multipier);
+ bgc_fp64_quaternion_multiply_by_real(&product->dual_part, &multiplicand->dual_part, multipier);
}
// =================== Divide =================== //
@@ -132,70 +132,70 @@ inline void bgc_fp64_dual_quaternion_divide_by_real(BGC_FP64_DualQuaternion* quo
inline void bgc_fp32_dual_quaternion_get_mean2(BGC_FP32_DualQuaternion* mean, const BGC_FP32_DualQuaternion* quaternion1, const BGC_FP32_DualQuaternion* quaternion2)
{
- bgc_fp32_quaternion_get_mean2(&mean->real, &quaternion1->real, &quaternion2->real);
- bgc_fp32_quaternion_get_mean2(&mean->dual, &quaternion1->dual, &quaternion2->dual);
+ bgc_fp32_quaternion_get_mean2(&mean->real_part, &quaternion1->real_part, &quaternion2->real_part);
+ bgc_fp32_quaternion_get_mean2(&mean->dual_part, &quaternion1->dual_part, &quaternion2->dual_part);
}
inline void bgc_fp64_dual_quaternion_get_mean2(BGC_FP64_DualQuaternion* mean, const BGC_FP64_DualQuaternion* quaternion1, const BGC_FP64_DualQuaternion* quaternion2)
{
- bgc_fp64_quaternion_get_mean2(&mean->real, &quaternion1->real, &quaternion2->real);
- bgc_fp64_quaternion_get_mean2(&mean->dual, &quaternion1->dual, &quaternion2->dual);
+ bgc_fp64_quaternion_get_mean2(&mean->real_part, &quaternion1->real_part, &quaternion2->real_part);
+ bgc_fp64_quaternion_get_mean2(&mean->dual_part, &quaternion1->dual_part, &quaternion2->dual_part);
}
// =============== Mean of Three ================ //
inline void bgc_fp32_dual_quaternion_get_mean3(BGC_FP32_DualQuaternion* mean, const BGC_FP32_DualQuaternion* quaternion1, const BGC_FP32_DualQuaternion* quaternion2, const BGC_FP32_DualQuaternion* quaternion3)
{
- bgc_fp32_quaternion_get_mean3(&mean->real, &quaternion1->real, &quaternion2->real, &quaternion3->real);
- bgc_fp32_quaternion_get_mean3(&mean->dual, &quaternion1->dual, &quaternion2->dual, &quaternion3->dual);
+ bgc_fp32_quaternion_get_mean3(&mean->real_part, &quaternion1->real_part, &quaternion2->real_part, &quaternion3->real_part);
+ bgc_fp32_quaternion_get_mean3(&mean->dual_part, &quaternion1->dual_part, &quaternion2->dual_part, &quaternion3->dual_part);
}
inline void bgc_fp64_dual_quaternion_get_mean3(BGC_FP64_DualQuaternion* mean, const BGC_FP64_DualQuaternion* quaternion1, const BGC_FP64_DualQuaternion* quaternion2, const BGC_FP64_DualQuaternion* quaternion3)
{
- bgc_fp64_quaternion_get_mean3(&mean->real, &quaternion1->real, &quaternion2->real, &quaternion3->real);
- bgc_fp64_quaternion_get_mean3(&mean->dual, &quaternion1->dual, &quaternion2->dual, &quaternion3->dual);
+ bgc_fp64_quaternion_get_mean3(&mean->real_part, &quaternion1->real_part, &quaternion2->real_part, &quaternion3->real_part);
+ bgc_fp64_quaternion_get_mean3(&mean->dual_part, &quaternion1->dual_part, &quaternion2->dual_part, &quaternion3->dual_part);
}
// ============ Linear Interpolation ============ //
inline void bgc_fp32_dual_quaternion_interpolate(BGC_FP32_DualQuaternion* interpolation, const BGC_FP32_DualQuaternion* first, const BGC_FP32_DualQuaternion* second, const float phase)
{
- bgc_fp32_quaternion_interpolate(&interpolation->real, &first->real, &second->real, phase);
- bgc_fp32_quaternion_interpolate(&interpolation->dual, &first->dual, &second->dual, phase);
+ bgc_fp32_quaternion_interpolate(&interpolation->real_part, &first->real_part, &second->real_part, phase);
+ bgc_fp32_quaternion_interpolate(&interpolation->dual_part, &first->dual_part, &second->dual_part, phase);
}
inline void bgc_fp64_dual_quaternion_interpolate(BGC_FP64_DualQuaternion* interpolation, const BGC_FP64_DualQuaternion* first, const BGC_FP64_DualQuaternion* second, const double phase)
{
- bgc_fp64_quaternion_interpolate(&interpolation->real, &first->real, &second->real, phase);
- bgc_fp64_quaternion_interpolate(&interpolation->dual, &first->dual, &second->dual, phase);
+ bgc_fp64_quaternion_interpolate(&interpolation->real_part, &first->real_part, &second->real_part, phase);
+ bgc_fp64_quaternion_interpolate(&interpolation->dual_part, &first->dual_part, &second->dual_part, phase);
}
// =================== Revert =================== //
inline void bgc_fp32_dual_quaternion_revert(BGC_FP32_DualQuaternion* quaternion)
{
- bgc_fp32_quaternion_revert(&quaternion->real);
- bgc_fp32_quaternion_revert(&quaternion->dual);
+ bgc_fp32_quaternion_revert(&quaternion->real_part);
+ bgc_fp32_quaternion_revert(&quaternion->dual_part);
}
inline void bgc_fp64_dual_quaternion_revert(BGC_FP64_DualQuaternion* quaternion)
{
- bgc_fp64_quaternion_revert(&quaternion->real);
- bgc_fp64_quaternion_revert(&quaternion->dual);
+ bgc_fp64_quaternion_revert(&quaternion->real_part);
+ bgc_fp64_quaternion_revert(&quaternion->dual_part);
}
// ================ Get Reverse ================= //
inline void bgc_fp32_dual_quaternion_get_reverse(BGC_FP32_DualQuaternion* reverse, const BGC_FP32_DualQuaternion* quaternion)
{
- bgc_fp32_quaternion_get_reverse(&reverse->real, &quaternion->real);
- bgc_fp32_quaternion_get_reverse(&reverse->dual, &quaternion->dual);
+ bgc_fp32_quaternion_get_reverse(&reverse->real_part, &quaternion->real_part);
+ bgc_fp32_quaternion_get_reverse(&reverse->dual_part, &quaternion->dual_part);
}
inline void bgc_fp64_dual_quaternion_get_reverse(BGC_FP64_DualQuaternion* reverse, const BGC_FP64_DualQuaternion* quaternion)
{
- bgc_fp64_quaternion_get_reverse(&reverse->real, &quaternion->real);
- bgc_fp64_quaternion_get_reverse(&reverse->dual, &quaternion->dual);
+ bgc_fp64_quaternion_get_reverse(&reverse->real_part, &quaternion->real_part);
+ bgc_fp64_quaternion_get_reverse(&reverse->dual_part, &quaternion->dual_part);
}
#endif
diff --git a/basic-geometry/dual-scalar.c b/basic-geometry/dual-scalar.c
new file mode 100644
index 0000000..aaa7a46
--- /dev/null
+++ b/basic-geometry/dual-scalar.c
@@ -0,0 +1,61 @@
+#include "./dual-scalar.h"
+
+extern inline void bgc_fp32_dual_scalar_reset(BGC_FP32_DualScalar* number);
+extern inline void bgc_fp64_dual_scalar_reset(BGC_FP64_DualScalar* number);
+
+extern inline void bgc_fp32_dual_scalar_make(BGC_FP32_DualScalar* number, const float real_part, const float dual_part);
+extern inline void bgc_fp64_dual_scalar_make(BGC_FP64_DualScalar* number, const double real_part, const double dual_part);
+
+extern inline void bgc_fp32_dual_scalar_copy(BGC_FP32_DualScalar* destination, const BGC_FP32_DualScalar* source);
+extern inline void bgc_fp64_dual_scalar_copy(BGC_FP64_DualScalar* destination, const BGC_FP64_DualScalar* source);
+
+extern inline void bgc_fp32_dual_scalar_swap(BGC_FP32_DualScalar* first, BGC_FP32_DualScalar* second);
+extern inline void bgc_fp64_dual_scalar_swap(BGC_FP64_DualScalar* first, BGC_FP64_DualScalar* second);
+
+extern inline void bgc_fp32_dual_scalar_revert(BGC_FP32_DualScalar* number);
+extern inline void bgc_fp64_dual_scalar_revert(BGC_FP64_DualScalar* number);
+
+extern inline void bgc_fp32_number_get_reverse(BGC_FP32_DualScalar* reverse, const BGC_FP32_DualScalar* number);
+extern inline void bgc_fp64_number_get_reverse(BGC_FP64_DualScalar* reverse, const BGC_FP64_DualScalar* number);
+
+extern inline void bgc_fp32_dual_scalar_conjugate(BGC_FP32_DualScalar* number);
+extern inline void bgc_fp64_dual_scalar_conjugate(BGC_FP64_DualScalar* number);
+
+extern inline void bgc_fp32_dual_scalar_get_conjugate(BGC_FP32_DualScalar* conjugate, const BGC_FP32_DualScalar* number);
+extern inline void bgc_fp64_dual_scalar_get_conjugate(BGC_FP64_DualScalar* conjugate, const BGC_FP64_DualScalar* number);
+
+extern inline void bgc_fp32_dual_scalar_add(BGC_FP32_DualScalar* sum, const BGC_FP32_DualScalar* first, const BGC_FP32_DualScalar* second);
+extern inline void bgc_fp64_dual_scalar_add(BGC_FP64_DualScalar* sum, const BGC_FP64_DualScalar* first, const BGC_FP64_DualScalar* second);
+
+extern inline void bgc_fp32_dual_scalar_add_scaled(BGC_FP32_DualScalar* sum, const BGC_FP32_DualScalar* base_number, const BGC_FP32_DualScalar* scalable_number, const float scale);
+extern inline void bgc_fp64_dual_scalar_add_scaled(BGC_FP64_DualScalar* sum, const BGC_FP64_DualScalar* base_number, const BGC_FP64_DualScalar* scalable_number, const double scale);
+
+extern inline void bgc_fp32_dual_scalar_subtract(BGC_FP32_DualScalar* difference, const BGC_FP32_DualScalar* minuend, const BGC_FP32_DualScalar* subtrahend);
+extern inline void bgc_fp64_dual_scalar_subtract(BGC_FP64_DualScalar* difference, const BGC_FP64_DualScalar* minuend, const BGC_FP64_DualScalar* subtrahend);
+
+extern inline void bgc_fp32_dual_scalar_multiply_by_real(BGC_FP32_DualScalar* product, const BGC_FP32_DualScalar* multiplicand, const float multiplier);
+extern inline void bgc_fp64_dual_scalar_multiply_by_real(BGC_FP64_DualScalar* product, const BGC_FP64_DualScalar* multiplicand, const double multiplier);
+
+extern inline void bgc_fp32_dual_scalar_multiply_by_dual(BGC_FP32_DualScalar* product, const BGC_FP32_DualScalar* multiplicand, const BGC_FP32_DualScalar* multiplier);
+extern inline void bgc_fp64_dual_scalar_multiply_by_dual(BGC_FP64_DualScalar* product, const BGC_FP64_DualScalar* multiplicand, const BGC_FP64_DualScalar* multiplier);
+
+extern inline void bgc_fp32_dual_scalar_multiply_by_conjugate(BGC_FP32_DualScalar* product, const BGC_FP32_DualScalar* multiplicand, const BGC_FP32_DualScalar* multiplier_to_conjugate);
+extern inline void bgc_fp64_dual_scalar_multiply_by_conjugate(BGC_FP64_DualScalar* product, const BGC_FP64_DualScalar* multiplicand, const BGC_FP64_DualScalar* multiplier_to_conjugate);
+
+extern inline int bgc_fp32_dual_scalar_divide_by_real(BGC_FP32_DualScalar* quotient, const BGC_FP32_DualScalar* dividend, const float divisor);
+extern inline int bgc_fp64_dual_scalar_divide_by_real(BGC_FP64_DualScalar* quotient, const BGC_FP64_DualScalar* dividend, const double divisor);
+
+extern inline int bgc_fp32_dual_scalar_divide_by_dual(BGC_FP32_DualScalar* quotient, const BGC_FP32_DualScalar* dividend, const BGC_FP32_DualScalar* divisor);
+extern inline int bgc_fp64_dual_scalar_divide_by_dual(BGC_FP64_DualScalar* quotient, const BGC_FP64_DualScalar* dividend, const BGC_FP64_DualScalar* divisor);
+
+extern inline int bgc_fp32_dual_scalar_divide_by_conjugate(BGC_FP32_DualScalar* quotient, const BGC_FP32_DualScalar* dividend, const BGC_FP32_DualScalar* divisor_to_conjugate);
+extern inline int bgc_fp64_dual_scalar_divide_by_conjugate(BGC_FP64_DualScalar* quotient, const BGC_FP64_DualScalar* dividend, const BGC_FP64_DualScalar* divisor_to_conjugate);
+
+extern inline void bgc_fp32_dual_scalar_get_mean2(BGC_FP32_DualScalar* mean, const BGC_FP32_DualScalar* first, const BGC_FP32_DualScalar* second);
+extern inline void bgc_fp64_dual_scalar_get_mean2(BGC_FP64_DualScalar* mean, const BGC_FP64_DualScalar* first, const BGC_FP64_DualScalar* second);
+
+extern inline void bgc_fp32_dual_scalar_get_mean3(BGC_FP32_DualScalar* mean, const BGC_FP32_DualScalar* first, const BGC_FP32_DualScalar* second, const BGC_FP32_DualScalar* third);
+extern inline void bgc_fp64_dual_scalar_get_mean3(BGC_FP64_DualScalar* mean, const BGC_FP64_DualScalar* first, const BGC_FP64_DualScalar* second, const BGC_FP64_DualScalar* third);
+
+extern inline void bgc_fp32_dual_scalar_interpolate(BGC_FP32_DualScalar* interpolation, const BGC_FP32_DualScalar* first, const BGC_FP32_DualScalar* second, const float phase);
+extern inline void bgc_fp64_dual_scalar_interpolate(BGC_FP64_DualScalar* interpolation, const BGC_FP64_DualScalar* first, const BGC_FP64_DualScalar* second, const double phase);
diff --git a/basic-geometry/dual-scalar.h b/basic-geometry/dual-scalar.h
new file mode 100644
index 0000000..b0cb15a
--- /dev/null
+++ b/basic-geometry/dual-scalar.h
@@ -0,0 +1,360 @@
+#ifndef _BGC_DUAL_NUMBER_H_INCLUDED_
+#define _BGC_DUAL_NUMBER_H_INCLUDED_
+
+#include
+
+#include "./utilities.h"
+#include "./types.h"
+
+// =================== Reset ==================== //
+
+inline void bgc_fp32_dual_scalar_reset(BGC_FP32_DualScalar* number)
+{
+ number->real_part = 0.0f;
+ number->dual_part = 0.0f;
+}
+
+inline void bgc_fp64_dual_scalar_reset(BGC_FP64_DualScalar* number)
+{
+ number->real_part = 0.0;
+ number->dual_part = 0.0;
+}
+
+// ==================== Make ==================== //
+
+inline void bgc_fp32_dual_scalar_make(BGC_FP32_DualScalar* number, const float real_part, const float dual_part)
+{
+ number->real_part = real_part;
+ number->dual_part = dual_part;
+}
+
+inline void bgc_fp64_dual_scalar_make(BGC_FP64_DualScalar* number, const double real_part, const double dual_part)
+{
+ number->real_part = real_part;
+ number->dual_part = dual_part;
+}
+
+// ==================== Copy ==================== //
+
+inline void bgc_fp32_dual_scalar_copy(BGC_FP32_DualScalar* destination, const BGC_FP32_DualScalar* source)
+{
+ destination->real_part = source->real_part;
+ destination->dual_part = source->dual_part;
+}
+
+inline void bgc_fp64_dual_scalar_copy(BGC_FP64_DualScalar* destination, const BGC_FP64_DualScalar* source)
+{
+ destination->real_part = source->real_part;
+ destination->dual_part = source->dual_part;
+}
+
+// ==================== Swap ==================== //
+
+inline void bgc_fp32_dual_scalar_swap(BGC_FP32_DualScalar* first, BGC_FP32_DualScalar* second)
+{
+ first->real_part = second->real_part;
+ first->dual_part = second->dual_part;
+}
+
+inline void bgc_fp64_dual_scalar_swap(BGC_FP64_DualScalar* first, BGC_FP64_DualScalar* second)
+{
+ first->real_part = second->real_part;
+ first->dual_part = second->dual_part;
+}
+
+// ================== Convert =================== //
+
+inline void bgc_fp64_dual_scalar_convert_to_fp32(BGC_FP32_DualScalar* first, BGC_FP64_DualScalar* second)
+{
+ first->real_part = (float) second->real_part;
+ first->dual_part = (float) second->dual_part;
+}
+
+inline void bgc_fp32_dual_scalar_convert_to_fp64(BGC_FP64_DualScalar* first, BGC_FP32_DualScalar* second)
+{
+ first->real_part = second->real_part;
+ first->dual_part = second->dual_part;
+}
+
+// =================== Revert =================== //
+
+inline void bgc_fp32_dual_scalar_revert(BGC_FP32_DualScalar* number)
+{
+ number->real_part = -number->real_part;
+ number->dual_part = -number->dual_part;
+}
+
+inline void bgc_fp64_dual_scalar_revert(BGC_FP64_DualScalar* number)
+{
+ number->real_part = -number->real_part;
+ number->dual_part = -number->dual_part;
+}
+
+// ================ Get Reverse ================= //
+
+inline void bgc_fp32_number_get_reverse(BGC_FP32_DualScalar* reverse, const BGC_FP32_DualScalar* number)
+{
+ reverse->real_part = -number->real_part;
+ reverse->dual_part = -number->dual_part;
+}
+
+inline void bgc_fp64_number_get_reverse(BGC_FP64_DualScalar* reverse, const BGC_FP64_DualScalar* number)
+{
+ reverse->real_part = -number->real_part;
+ reverse->dual_part = -number->dual_part;
+}
+
+// ================= Conjugate ================== //
+
+inline void bgc_fp32_dual_scalar_conjugate(BGC_FP32_DualScalar* number)
+{
+ number->dual_part = -number->dual_part;
+}
+
+inline void bgc_fp64_dual_scalar_conjugate(BGC_FP64_DualScalar* number)
+{
+ number->dual_part = -number->dual_part;
+}
+
+// =============== Get Conjugate ================ //
+
+inline void bgc_fp32_dual_scalar_get_conjugate(BGC_FP32_DualScalar* conjugate, const BGC_FP32_DualScalar* number)
+{
+ conjugate->real_part = number->real_part;
+ conjugate->dual_part = -number->dual_part;
+}
+
+inline void bgc_fp64_dual_scalar_get_conjugate(BGC_FP64_DualScalar* conjugate, const BGC_FP64_DualScalar* number)
+{
+ conjugate->real_part = number->real_part;
+ conjugate->dual_part = -number->dual_part;
+}
+
+// ==================== Add ===================== //
+
+inline void bgc_fp32_dual_scalar_add(BGC_FP32_DualScalar* sum, const BGC_FP32_DualScalar* first, const BGC_FP32_DualScalar* second)
+{
+ sum->real_part = first->real_part + second->real_part;
+ sum->dual_part = first->dual_part + second->dual_part;
+}
+
+inline void bgc_fp64_dual_scalar_add(BGC_FP64_DualScalar* sum, const BGC_FP64_DualScalar* first, const BGC_FP64_DualScalar* second)
+{
+ sum->real_part = first->real_part + second->real_part;
+ sum->dual_part = first->dual_part + second->dual_part;
+}
+
+// ================= Add Scaled ================= //
+
+inline void bgc_fp32_dual_scalar_add_scaled(BGC_FP32_DualScalar* sum, const BGC_FP32_DualScalar* base_number, const BGC_FP32_DualScalar* scalable_number, const float scale)
+{
+ sum->real_part = base_number->real_part + scalable_number->real_part * scale;
+ sum->dual_part = base_number->dual_part + scalable_number->dual_part * scale;
+}
+
+inline void bgc_fp64_dual_scalar_add_scaled(BGC_FP64_DualScalar* sum, const BGC_FP64_DualScalar* base_number, const BGC_FP64_DualScalar* scalable_number, const double scale)
+{
+ sum->real_part = base_number->real_part + scalable_number->real_part * scale;
+ sum->dual_part = base_number->dual_part + scalable_number->dual_part * scale;
+}
+
+// ================== Subtract ================== //
+
+inline void bgc_fp32_dual_scalar_subtract(BGC_FP32_DualScalar* difference, const BGC_FP32_DualScalar* minuend, const BGC_FP32_DualScalar* subtrahend)
+{
+ difference->real_part = minuend->real_part - subtrahend->real_part;
+ difference->dual_part = minuend->dual_part - subtrahend->dual_part;
+}
+
+inline void bgc_fp64_dual_scalar_subtract(BGC_FP64_DualScalar* difference, const BGC_FP64_DualScalar* minuend, const BGC_FP64_DualScalar* subtrahend)
+{
+ difference->real_part = minuend->real_part - subtrahend->real_part;
+ difference->dual_part = minuend->dual_part - subtrahend->dual_part;
+}
+
+// ================== Multiply ================== //
+
+inline void bgc_fp32_dual_scalar_multiply_by_real(BGC_FP32_DualScalar* product, const BGC_FP32_DualScalar* multiplicand, const float multiplier)
+{
+ product->real_part = multiplicand->real_part * multiplier;
+ product->dual_part = multiplicand->dual_part * multiplier;
+}
+
+inline void bgc_fp64_dual_scalar_multiply_by_real(BGC_FP64_DualScalar* product, const BGC_FP64_DualScalar* multiplicand, const double multiplier)
+{
+ product->real_part = multiplicand->real_part * multiplier;
+ product->dual_part = multiplicand->dual_part * multiplier;
+}
+
+inline void bgc_fp32_dual_scalar_multiply_by_dual(BGC_FP32_DualScalar* product, const BGC_FP32_DualScalar* multiplicand, const BGC_FP32_DualScalar* multiplier)
+{
+ const float real_part = multiplicand->real_part * multiplier->real_part;
+ const float dual_part = multiplicand->dual_part * multiplier->real_part + multiplicand->real_part * multiplier->dual_part;
+
+ product->real_part = real_part;
+ product->dual_part = dual_part;
+}
+
+inline void bgc_fp64_dual_scalar_multiply_by_dual(BGC_FP64_DualScalar* product, const BGC_FP64_DualScalar* multiplicand, const BGC_FP64_DualScalar* multiplier)
+{
+ const double real_part = multiplicand->real_part * multiplier->real_part;
+ const double dual_part = multiplicand->dual_part * multiplier->real_part + multiplicand->real_part * multiplier->dual_part;
+
+ product->real_part = real_part;
+ product->dual_part = dual_part;
+}
+
+inline void bgc_fp32_dual_scalar_multiply_by_conjugate(BGC_FP32_DualScalar* product, const BGC_FP32_DualScalar* multiplicand, const BGC_FP32_DualScalar* multiplier_to_conjugate)
+{
+ const float real_part = multiplicand->real_part * multiplier_to_conjugate->real_part;
+ const float dual_part = multiplicand->dual_part * multiplier_to_conjugate->real_part - multiplicand->real_part * multiplier_to_conjugate->dual_part;
+
+ product->real_part = real_part;
+ product->dual_part = dual_part;
+}
+
+inline void bgc_fp64_dual_scalar_multiply_by_conjugate(BGC_FP64_DualScalar* product, const BGC_FP64_DualScalar* multiplicand, const BGC_FP64_DualScalar* multiplier_to_conjugate)
+{
+ const double real_part = multiplicand->real_part * multiplier_to_conjugate->real_part;
+ const double dual_part = multiplicand->dual_part * multiplier_to_conjugate->real_part - multiplicand->real_part * multiplier_to_conjugate->dual_part;
+
+ product->real_part = real_part;
+ product->dual_part = dual_part;
+}
+// =================== Divide =================== //
+
+inline int bgc_fp32_dual_scalar_divide_by_real(BGC_FP32_DualScalar* quotient, const BGC_FP32_DualScalar* dividend, const float divisor)
+{
+ if (bgc_fp32_is_zero(divisor) || isnan(divisor)) {
+ return BGC_FAILURE;
+ }
+
+ bgc_fp32_dual_scalar_multiply_by_real(quotient, dividend, 1.0f / divisor);
+ return BGC_SUCCESS;
+}
+
+inline int bgc_fp64_dual_scalar_divide_by_real(BGC_FP64_DualScalar* quotient, const BGC_FP64_DualScalar* dividend, const double divisor)
+{
+ if (bgc_fp64_is_zero(divisor) || isnan(divisor)) {
+ return BGC_FAILURE;
+ }
+
+ bgc_fp64_dual_scalar_multiply_by_real(quotient, dividend, 1.0 / divisor);
+ return BGC_SUCCESS;
+}
+
+inline int bgc_fp32_dual_scalar_divide_by_dual(BGC_FP32_DualScalar* quotient, const BGC_FP32_DualScalar* dividend, const BGC_FP32_DualScalar* divisor)
+{
+ if (bgc_fp32_is_zero(divisor->real_part)) {
+ return BGC_FAILURE;
+ }
+
+ const float multiplier = 1.0f / divisor->real_part;
+
+ const float real_part = dividend->real_part * multiplier;
+ const float dual_part = dividend->dual_part * multiplier - (dividend->real_part * multiplier) * (divisor->dual_part * multiplier);
+
+ quotient->real_part = real_part;
+ quotient->dual_part = dual_part;
+
+ return BGC_SUCCESS;
+}
+
+inline int bgc_fp64_dual_scalar_divide_by_dual(BGC_FP64_DualScalar* quotient, const BGC_FP64_DualScalar* dividend, const BGC_FP64_DualScalar* divisor)
+{
+ if (bgc_fp64_is_zero(divisor->real_part)) {
+ return BGC_FAILURE;
+ }
+
+ const double multiplier = 1.0 / divisor->real_part;
+
+ const double real_part = dividend->real_part * multiplier;
+ const double dual_part = dividend->dual_part * multiplier - (dividend->real_part * multiplier) * (divisor->dual_part * multiplier);
+
+ quotient->real_part = real_part;
+ quotient->dual_part = dual_part;
+
+ return BGC_SUCCESS;
+}
+
+inline int bgc_fp32_dual_scalar_divide_by_conjugate(BGC_FP32_DualScalar* quotient, const BGC_FP32_DualScalar* dividend, const BGC_FP32_DualScalar* divisor_to_conjugate)
+{
+ if (bgc_fp32_is_zero(divisor_to_conjugate->real_part)) {
+ return BGC_FAILURE;
+ }
+
+ const float multiplier = 1.0f / divisor_to_conjugate->real_part;
+
+ const float real_part = dividend->real_part * multiplier;
+ const float dual_part = dividend->dual_part * multiplier + (dividend->real_part * multiplier) * (divisor_to_conjugate->dual_part * multiplier);
+
+ quotient->real_part = real_part;
+ quotient->dual_part = dual_part;
+
+ return BGC_SUCCESS;
+}
+
+inline int bgc_fp64_dual_scalar_divide_by_conjugate(BGC_FP64_DualScalar* quotient, const BGC_FP64_DualScalar* dividend, const BGC_FP64_DualScalar* divisor_to_conjugate)
+{
+ if (bgc_fp64_is_zero(divisor_to_conjugate->real_part)) {
+ return BGC_FAILURE;
+ }
+
+ const double multiplier = 1.0 / divisor_to_conjugate->real_part;
+
+ const double real_part = dividend->real_part * multiplier;
+ const double dual_part = dividend->dual_part * multiplier + (dividend->real_part * multiplier) * (divisor_to_conjugate->dual_part * multiplier);
+
+ quotient->real_part = real_part;
+ quotient->dual_part = dual_part;
+
+ return BGC_SUCCESS;
+}
+
+// ================ Mean of Two ================= //
+
+inline void bgc_fp32_dual_scalar_get_mean2(BGC_FP32_DualScalar* mean, const BGC_FP32_DualScalar* first, const BGC_FP32_DualScalar* second)
+{
+ mean->real_part = (first->real_part + second->real_part) * 0.5f;
+ mean->dual_part = (first->dual_part + second->dual_part) * 0.5f;
+}
+
+inline void bgc_fp64_dual_scalar_get_mean2(BGC_FP64_DualScalar* mean, const BGC_FP64_DualScalar* first, const BGC_FP64_DualScalar* second)
+{
+ mean->real_part = (first->real_part + second->real_part) * 0.5;
+ mean->dual_part = (first->dual_part + second->dual_part) * 0.5;
+}
+
+// =============== Mean of Three ================ //
+
+inline void bgc_fp32_dual_scalar_get_mean3(BGC_FP32_DualScalar* mean, const BGC_FP32_DualScalar* first, const BGC_FP32_DualScalar* second, const BGC_FP32_DualScalar* third)
+{
+ mean->real_part = (first->real_part + second->real_part + third->real_part) * BGC_FP32_ONE_THIRD;
+ mean->dual_part = (first->dual_part + second->dual_part + third->dual_part) * BGC_FP32_ONE_THIRD;
+}
+
+inline void bgc_fp64_dual_scalar_get_mean3(BGC_FP64_DualScalar* mean, const BGC_FP64_DualScalar* first, const BGC_FP64_DualScalar* second, const BGC_FP64_DualScalar* third)
+{
+ mean->real_part = (first->real_part + second->real_part + third->real_part) * BGC_FP64_ONE_THIRD;
+ mean->dual_part = (first->dual_part + second->dual_part + third->dual_part) * BGC_FP64_ONE_THIRD;
+}
+
+// ============ Linear Interpolation ============ //
+
+inline void bgc_fp32_dual_scalar_interpolate(BGC_FP32_DualScalar* interpolation, const BGC_FP32_DualScalar* first, const BGC_FP32_DualScalar* second, const float phase)
+{
+ const float counter_phase = 1.0f - phase;
+
+ interpolation->real_part = first->real_part * counter_phase + second->real_part * phase;
+ interpolation->dual_part = first->dual_part * counter_phase + second->dual_part * phase;
+}
+
+inline void bgc_fp64_dual_scalar_interpolate(BGC_FP64_DualScalar* interpolation, const BGC_FP64_DualScalar* first, const BGC_FP64_DualScalar* second, const double phase)
+{
+ const double counter_phase = 1.0 - phase;
+
+ interpolation->real_part = first->real_part * counter_phase + second->real_part * phase;
+ interpolation->dual_part = first->dual_part * counter_phase + second->dual_part * phase;
+}
+
+#endif
diff --git a/basic-geometry/dual-vector3.c b/basic-geometry/dual-vector3.c
index 77ba653..b5248d4 100644
--- a/basic-geometry/dual-vector3.c
+++ b/basic-geometry/dual-vector3.c
@@ -12,12 +12,6 @@ extern inline void bgc_fp64_dual_vector3_copy(BGC_FP64_DualVector3* destination,
extern inline void bgc_fp32_dual_vector3_swap(BGC_FP32_DualVector3* first, BGC_FP32_DualVector3* second);
extern inline void bgc_fp64_dual_vector3_swap(BGC_FP64_DualVector3* first, BGC_FP64_DualVector3* second);
-extern inline void bgc_fp32_dual_vector3_set_real_values(BGC_FP32_DualVector3* vector, const float x1, const float x2, const float x3);
-extern inline void bgc_fp64_dual_vector3_set_real_values(BGC_FP64_DualVector3* vector, const double x1, const double x2, const double x3);
-
-extern inline void bgc_fp32_dual_vector3_set_dual_values(BGC_FP32_DualVector3* vector, const float x1, const float x2, const float x3);
-extern inline void bgc_fp64_dual_vector3_set_dual_values(BGC_FP64_DualVector3* vector, const double x1, const double x2, const double x3);
-
extern inline void bgc_fp32_dual_vector3_add(BGC_FP32_DualVector3* sum, const BGC_FP32_DualVector3* first, const BGC_FP32_DualVector3* second);
extern inline void bgc_fp64_dual_vector3_add(BGC_FP64_DualVector3* sum, const BGC_FP64_DualVector3* first, const BGC_FP64_DualVector3* second);
@@ -27,11 +21,17 @@ extern inline void bgc_fp64_dual_vector3_add_scaled(BGC_FP64_DualVector3* sum, c
extern inline void bgc_fp32_dual_vector3_subtract(BGC_FP32_DualVector3* difference, const BGC_FP32_DualVector3* minuend, const BGC_FP32_DualVector3* subtrahend);
extern inline void bgc_fp64_dual_vector3_subtract(BGC_FP64_DualVector3* difference, const BGC_FP64_DualVector3* minuend, const BGC_FP64_DualVector3* subtrahend);
-extern inline void bgc_fp32_dual_vector3_multiply(BGC_FP32_DualVector3* product, const BGC_FP32_DualVector3* multiplicand, const float multiplier);
-extern inline void bgc_fp64_dual_vector3_multiply(BGC_FP64_DualVector3* product, const BGC_FP64_DualVector3* multiplicand, const double multiplier);
+extern inline void bgc_fp32_dual_vector3_multiply_by_real(BGC_FP32_DualVector3* product, const BGC_FP32_DualVector3* multiplicand, const float multiplier);
+extern inline void bgc_fp64_dual_vector3_multiply_by_real(BGC_FP64_DualVector3* product, const BGC_FP64_DualVector3* multiplicand, const double multiplier);
-extern inline int bgc_fp32_dual_vector3_divide(BGC_FP32_DualVector3* quotient, const BGC_FP32_DualVector3* dividend, const float divisor);
-extern inline int bgc_fp64_dual_vector3_divide(BGC_FP64_DualVector3* quotient, const BGC_FP64_DualVector3* dividend, const double divisor);
+extern inline void bgc_fp32_dual_vector3_multiply_by_dual(BGC_FP32_DualVector3* product, const BGC_FP32_DualVector3* multiplicand, const BGC_FP32_DualScalar* multiplier);
+extern inline void bgc_fp64_dual_vector3_multiply_by_dual(BGC_FP64_DualVector3* product, const BGC_FP64_DualVector3* multiplicand, const BGC_FP64_DualScalar* multiplier);
+
+extern inline void bgc_fp32_dual_vector3_multiply_by_conjugate(BGC_FP32_DualVector3* product, const BGC_FP32_DualVector3* multiplicand, const BGC_FP32_DualScalar* multiplier_to_conjugate);
+extern inline void bgc_fp64_dual_vector3_multiply_by_conjugate(BGC_FP64_DualVector3* product, const BGC_FP64_DualVector3* multiplicand, const BGC_FP64_DualScalar* multiplier_to_conjugate);
+
+extern inline int bgc_fp32_dual_vector3_divide_by_real(BGC_FP32_DualVector3* quotient, const BGC_FP32_DualVector3* dividend, const float divisor);
+extern inline int bgc_fp64_dual_vector3_divide_by_real(BGC_FP64_DualVector3* quotient, const BGC_FP64_DualVector3* dividend, const double divisor);
extern inline void bgc_fp32_dual_vector3_get_mean2(BGC_FP32_DualVector3* mean, const BGC_FP32_DualVector3* vector1, const BGC_FP32_DualVector3* vector2);
extern inline void bgc_fp64_dual_vector3_get_mean2(BGC_FP64_DualVector3* mean, const BGC_FP64_DualVector3* vector1, const BGC_FP64_DualVector3* vector2);
diff --git a/basic-geometry/dual-vector3.h b/basic-geometry/dual-vector3.h
index 324274c..72d4a02 100644
--- a/basic-geometry/dual-vector3.h
+++ b/basic-geometry/dual-vector3.h
@@ -8,172 +8,216 @@
inline void bgc_fp32_dual_vector3_reset(BGC_FP32_DualVector3* vector)
{
- bgc_fp32_vector3_reset(&vector->real);
- bgc_fp32_vector3_reset(&vector->dual);
+ bgc_fp32_vector3_reset(&vector->real_part);
+ bgc_fp32_vector3_reset(&vector->dual_part);
}
inline void bgc_fp64_dual_vector3_reset(BGC_FP64_DualVector3* vector)
{
- bgc_fp64_vector3_reset(&vector->real);
- bgc_fp64_vector3_reset(&vector->dual);
+ bgc_fp64_vector3_reset(&vector->real_part);
+ bgc_fp64_vector3_reset(&vector->dual_part);
}
// ==================== Make ==================== //
-inline void bgc_fp32_dual_vector3_make(BGC_FP32_DualVector3* vector, const BGC_FP32_Vector3* real, const BGC_FP32_Vector3* dual)
+inline void bgc_fp32_dual_vector3_make(BGC_FP32_DualVector3* vector, const BGC_FP32_Vector3* real_part, const BGC_FP32_Vector3* dual_part)
{
- bgc_fp32_vector3_copy(&vector->real, real);
- bgc_fp32_vector3_copy(&vector->dual, dual);
+ bgc_fp32_vector3_copy(&vector->real_part, real_part);
+ bgc_fp32_vector3_copy(&vector->dual_part, dual_part);
}
-inline void bgc_fp64_dual_vector3_make(BGC_FP64_DualVector3* vector, const BGC_FP64_Vector3* real, const BGC_FP64_Vector3* dual)
+inline void bgc_fp64_dual_vector3_make(BGC_FP64_DualVector3* vector, const BGC_FP64_Vector3* real_part, const BGC_FP64_Vector3* dual_part)
{
- bgc_fp64_vector3_copy(&vector->real, real);
- bgc_fp64_vector3_copy(&vector->dual, dual);
+ bgc_fp64_vector3_copy(&vector->real_part, real_part);
+ bgc_fp64_vector3_copy(&vector->dual_part, dual_part);
}
// ==================== Copy ==================== //
inline void bgc_fp32_dual_vector3_copy(BGC_FP32_DualVector3* destination, const BGC_FP32_DualVector3* source)
{
- bgc_fp32_vector3_copy(&destination->real, &source->real);
- bgc_fp32_vector3_copy(&destination->dual, &source->dual);
+ bgc_fp32_vector3_copy(&destination->real_part, &source->real_part);
+ bgc_fp32_vector3_copy(&destination->dual_part, &source->dual_part);
}
inline void bgc_fp64_dual_vector3_copy(BGC_FP64_DualVector3* destination, const BGC_FP64_DualVector3* source)
{
- bgc_fp64_vector3_copy(&destination->real, &source->real);
- bgc_fp64_vector3_copy(&destination->dual, &source->dual);
+ bgc_fp64_vector3_copy(&destination->real_part, &source->real_part);
+ bgc_fp64_vector3_copy(&destination->dual_part, &source->dual_part);
}
// ==================== Swap ==================== //
inline void bgc_fp32_dual_vector3_swap(BGC_FP32_DualVector3* first, BGC_FP32_DualVector3* second)
{
- bgc_fp32_vector3_swap(&first->real, &second->real);
- bgc_fp32_vector3_swap(&first->dual, &second->dual);
+ bgc_fp32_vector3_swap(&first->real_part, &second->real_part);
+ bgc_fp32_vector3_swap(&first->dual_part, &second->dual_part);
}
inline void bgc_fp64_dual_vector3_swap(BGC_FP64_DualVector3* first, BGC_FP64_DualVector3* second)
{
- bgc_fp64_vector3_swap(&first->real, &second->real);
- bgc_fp64_vector3_swap(&first->dual, &second->dual);
-}
-
-// ================== Set Real ================== //
-
-inline void bgc_fp32_dual_vector3_set_real_values(BGC_FP32_DualVector3* vector, const float x1, const float x2, const float x3)
-{
- vector->real.x1 = x1;
- vector->real.x2 = x2;
- vector->real.x3 = x3;
-}
-
-inline void bgc_fp64_dual_vector3_set_real_values(BGC_FP64_DualVector3* vector, const double x1, const double x2, const double x3)
-{
- vector->real.x1 = x1;
- vector->real.x2 = x2;
- vector->real.x3 = x3;
-}
-
-// ================== Set Dual ================== //
-
-inline void bgc_fp32_dual_vector3_set_dual_values(BGC_FP32_DualVector3* vector, const float x1, const float x2, const float x3)
-{
- vector->dual.x1 = x1;
- vector->dual.x2 = x2;
- vector->dual.x3 = x3;
-}
-
-inline void bgc_fp64_dual_vector3_set_dual_values(BGC_FP64_DualVector3* vector, const double x1, const double x2, const double x3)
-{
- vector->dual.x1 = x1;
- vector->dual.x2 = x2;
- vector->dual.x3 = x3;
+ bgc_fp64_vector3_swap(&first->real_part, &second->real_part);
+ bgc_fp64_vector3_swap(&first->dual_part, &second->dual_part);
}
// ==================== Add ===================== //
inline void bgc_fp32_dual_vector3_add(BGC_FP32_DualVector3* sum, const BGC_FP32_DualVector3* first, const BGC_FP32_DualVector3* second)
{
- bgc_fp32_vector3_add(&sum->real, &first->real, &second->real);
- bgc_fp32_vector3_add(&sum->dual, &first->dual, &second->dual);
+ bgc_fp32_vector3_add(&sum->real_part, &first->real_part, &second->real_part);
+ bgc_fp32_vector3_add(&sum->dual_part, &first->dual_part, &second->dual_part);
}
inline void bgc_fp64_dual_vector3_add(BGC_FP64_DualVector3* sum, const BGC_FP64_DualVector3* first, const BGC_FP64_DualVector3* second)
{
- bgc_fp64_vector3_add(&sum->real, &first->real, &second->real);
- bgc_fp64_vector3_add(&sum->dual, &first->dual, &second->dual);
+ bgc_fp64_vector3_add(&sum->real_part, &first->real_part, &second->real_part);
+ bgc_fp64_vector3_add(&sum->dual_part, &first->dual_part, &second->dual_part);
}
// ================= Add Scaled ================= //
inline void bgc_fp32_dual_vector3_add_scaled(BGC_FP32_DualVector3* sum, const BGC_FP32_DualVector3* base_vector, const BGC_FP32_DualVector3* scalable_vector, const float scale)
{
- bgc_fp32_vector3_add_scaled(&sum->real, &base_vector->real, &scalable_vector->real, scale);
- bgc_fp32_vector3_add_scaled(&sum->dual, &base_vector->dual, &scalable_vector->dual, scale);
+ bgc_fp32_vector3_add_scaled(&sum->real_part, &base_vector->real_part, &scalable_vector->real_part, scale);
+ bgc_fp32_vector3_add_scaled(&sum->dual_part, &base_vector->dual_part, &scalable_vector->dual_part, scale);
}
inline void bgc_fp64_dual_vector3_add_scaled(BGC_FP64_DualVector3* sum, const BGC_FP64_DualVector3* base_vector, const BGC_FP64_DualVector3* scalable_vector, const double scale)
{
- bgc_fp64_vector3_add_scaled(&sum->real, &base_vector->real, &scalable_vector->real, scale);
- bgc_fp64_vector3_add_scaled(&sum->dual, &base_vector->dual, &scalable_vector->dual, scale);
+ bgc_fp64_vector3_add_scaled(&sum->real_part, &base_vector->real_part, &scalable_vector->real_part, scale);
+ bgc_fp64_vector3_add_scaled(&sum->dual_part, &base_vector->dual_part, &scalable_vector->dual_part, scale);
}
// ================== Subtract ================== //
inline void bgc_fp32_dual_vector3_subtract(BGC_FP32_DualVector3* difference, const BGC_FP32_DualVector3* minuend, const BGC_FP32_DualVector3* subtrahend)
{
- bgc_fp32_vector3_subtract(&difference->real, &minuend->real, &subtrahend->real);
- bgc_fp32_vector3_subtract(&difference->dual, &minuend->dual, &subtrahend->dual);
+ bgc_fp32_vector3_subtract(&difference->real_part, &minuend->real_part, &subtrahend->real_part);
+ bgc_fp32_vector3_subtract(&difference->dual_part, &minuend->dual_part, &subtrahend->dual_part);
}
inline void bgc_fp64_dual_vector3_subtract(BGC_FP64_DualVector3* difference, const BGC_FP64_DualVector3* minuend, const BGC_FP64_DualVector3* subtrahend)
{
- bgc_fp64_vector3_subtract(&difference->real, &minuend->real, &subtrahend->real);
- bgc_fp64_vector3_subtract(&difference->dual, &minuend->dual, &subtrahend->dual);
+ bgc_fp64_vector3_subtract(&difference->real_part, &minuend->real_part, &subtrahend->real_part);
+ bgc_fp64_vector3_subtract(&difference->dual_part, &minuend->dual_part, &subtrahend->dual_part);
}
// ================== Multiply ================== //
-inline void bgc_fp32_dual_vector3_multiply(BGC_FP32_DualVector3* product, const BGC_FP32_DualVector3* multiplicand, const float multiplier)
+inline void bgc_fp32_dual_vector3_multiply_by_real(BGC_FP32_DualVector3* product, const BGC_FP32_DualVector3* multiplicand, const float multiplier)
{
- bgc_fp32_vector3_multiply_by_real(&product->real, &multiplicand->real, multiplier);
- bgc_fp32_vector3_multiply_by_real(&product->dual, &multiplicand->dual, multiplier);
+ bgc_fp32_vector3_multiply_by_real(&product->real_part, &multiplicand->real_part, multiplier);
+ bgc_fp32_vector3_multiply_by_real(&product->dual_part, &multiplicand->dual_part, multiplier);
}
-inline void bgc_fp64_dual_vector3_multiply(BGC_FP64_DualVector3* product, const BGC_FP64_DualVector3* multiplicand, const double multiplier)
+inline void bgc_fp64_dual_vector3_multiply_by_real(BGC_FP64_DualVector3* product, const BGC_FP64_DualVector3* multiplicand, const double multiplier)
{
- bgc_fp64_vector3_multiply_by_real(&product->real, &multiplicand->real, multiplier);
- bgc_fp64_vector3_multiply_by_real(&product->dual, &multiplicand->dual, multiplier);
+ bgc_fp64_vector3_multiply_by_real(&product->real_part, &multiplicand->real_part, multiplier);
+ bgc_fp64_vector3_multiply_by_real(&product->dual_part, &multiplicand->dual_part, multiplier);
+}
+
+inline void bgc_fp32_dual_vector3_multiply_by_dual(BGC_FP32_DualVector3* product, const BGC_FP32_DualVector3* multiplicand, const BGC_FP32_DualScalar* multiplier)
+{
+ const float real_x1 = multiplicand->real_part.x1 * multiplier->real_part;
+ const float real_x2 = multiplicand->real_part.x2 * multiplier->real_part;
+ const float real_x3 = multiplicand->real_part.x3 * multiplier->real_part;
+
+ const float dual_x1 = multiplicand->dual_part.x1 * multiplier->real_part + multiplicand->real_part.x1 * multiplier->dual_part;
+ const float dual_x2 = multiplicand->dual_part.x2 * multiplier->real_part + multiplicand->real_part.x2 * multiplier->dual_part;
+ const float dual_x3 = multiplicand->dual_part.x3 * multiplier->real_part + multiplicand->real_part.x3 * multiplier->dual_part;
+
+ product->real_part.x1 = real_x1;
+ product->real_part.x2 = real_x2;
+ product->real_part.x3 = real_x3;
+
+ product->dual_part.x1 = dual_x1;
+ product->dual_part.x2 = dual_x2;
+ product->dual_part.x3 = dual_x3;
+}
+
+inline void bgc_fp64_dual_vector3_multiply_by_dual(BGC_FP64_DualVector3* product, const BGC_FP64_DualVector3* multiplicand, const BGC_FP64_DualScalar* multiplier)
+{
+ const double real_x1 = multiplicand->real_part.x1 * multiplier->real_part;
+ const double real_x2 = multiplicand->real_part.x2 * multiplier->real_part;
+ const double real_x3 = multiplicand->real_part.x3 * multiplier->real_part;
+
+ const double dual_x1 = multiplicand->dual_part.x1 * multiplier->real_part + multiplicand->real_part.x1 * multiplier->dual_part;
+ const double dual_x2 = multiplicand->dual_part.x2 * multiplier->real_part + multiplicand->real_part.x2 * multiplier->dual_part;
+ const double dual_x3 = multiplicand->dual_part.x3 * multiplier->real_part + multiplicand->real_part.x3 * multiplier->dual_part;
+
+ product->real_part.x1 = real_x1;
+ product->real_part.x2 = real_x2;
+ product->real_part.x3 = real_x3;
+
+ product->dual_part.x1 = dual_x1;
+ product->dual_part.x2 = dual_x2;
+ product->dual_part.x3 = dual_x3;
+}
+
+inline void bgc_fp32_dual_vector3_multiply_by_conjugate(BGC_FP32_DualVector3* product, const BGC_FP32_DualVector3* multiplicand, const BGC_FP32_DualScalar* multiplier_to_conjugate)
+{
+ const float real_x1 = multiplicand->real_part.x1 * multiplier_to_conjugate->real_part;
+ const float real_x2 = multiplicand->real_part.x2 * multiplier_to_conjugate->real_part;
+ const float real_x3 = multiplicand->real_part.x3 * multiplier_to_conjugate->real_part;
+
+ const float dual_x1 = multiplicand->dual_part.x1 * multiplier_to_conjugate->real_part - multiplicand->real_part.x1 * multiplier_to_conjugate->dual_part;
+ const float dual_x2 = multiplicand->dual_part.x2 * multiplier_to_conjugate->real_part - multiplicand->real_part.x2 * multiplier_to_conjugate->dual_part;
+ const float dual_x3 = multiplicand->dual_part.x3 * multiplier_to_conjugate->real_part - multiplicand->real_part.x3 * multiplier_to_conjugate->dual_part;
+
+ product->real_part.x1 = real_x1;
+ product->real_part.x2 = real_x2;
+ product->real_part.x3 = real_x3;
+
+ product->dual_part.x1 = dual_x1;
+ product->dual_part.x2 = dual_x2;
+ product->dual_part.x3 = dual_x3;
+}
+
+inline void bgc_fp64_dual_vector3_multiply_by_conjugate(BGC_FP64_DualVector3* product, const BGC_FP64_DualVector3* multiplicand, const BGC_FP64_DualScalar* multiplier_to_conjugate)
+{
+ const double real_x1 = multiplicand->real_part.x1 * multiplier_to_conjugate->real_part;
+ const double real_x2 = multiplicand->real_part.x2 * multiplier_to_conjugate->real_part;
+ const double real_x3 = multiplicand->real_part.x3 * multiplier_to_conjugate->real_part;
+
+ const double dual_x1 = multiplicand->dual_part.x1 * multiplier_to_conjugate->real_part - multiplicand->real_part.x1 * multiplier_to_conjugate->dual_part;
+ const double dual_x2 = multiplicand->dual_part.x2 * multiplier_to_conjugate->real_part - multiplicand->real_part.x2 * multiplier_to_conjugate->dual_part;
+ const double dual_x3 = multiplicand->dual_part.x3 * multiplier_to_conjugate->real_part - multiplicand->real_part.x3 * multiplier_to_conjugate->dual_part;
+
+ product->real_part.x1 = real_x1;
+ product->real_part.x2 = real_x2;
+ product->real_part.x3 = real_x3;
+
+ product->dual_part.x1 = dual_x1;
+ product->dual_part.x2 = dual_x2;
+ product->dual_part.x3 = dual_x3;
}
// =================== Divide =================== //
-inline int bgc_fp32_dual_vector3_divide(BGC_FP32_DualVector3* quotient, const BGC_FP32_DualVector3* dividend, const float divisor)
+inline int bgc_fp32_dual_vector3_divide_by_real(BGC_FP32_DualVector3* quotient, const BGC_FP32_DualVector3* dividend, const float divisor)
{
- if (bgc_fp32_is_zero(divisor) || isnan(divisor)) {
+ if (bgc_fp32_is_zero(divisor)) {
return BGC_FAILURE;
}
const float multiplier = 1.0f / divisor;
- bgc_fp32_vector3_multiply_by_real("ient->real, ÷nd->real, multiplier);
- bgc_fp32_vector3_multiply_by_real("ient->dual, ÷nd->dual, multiplier);
+ bgc_fp32_vector3_multiply_by_real("ient->real_part, ÷nd->real_part, multiplier);
+ bgc_fp32_vector3_multiply_by_real("ient->dual_part, ÷nd->dual_part, multiplier);
return BGC_SUCCESS;
}
-inline int bgc_fp64_dual_vector3_divide(BGC_FP64_DualVector3* quotient, const BGC_FP64_DualVector3* dividend, const double divisor)
+inline int bgc_fp64_dual_vector3_divide_by_real(BGC_FP64_DualVector3* quotient, const BGC_FP64_DualVector3* dividend, const double divisor)
{
- if (bgc_fp64_is_zero(divisor) || isnan(divisor)) {
+ if (bgc_fp64_is_zero(divisor)) {
return BGC_FAILURE;
}
const double multiplier = 1.0 / divisor;
- bgc_fp64_vector3_multiply_by_real("ient->real, ÷nd->real, multiplier);
- bgc_fp64_vector3_multiply_by_real("ient->dual, ÷nd->dual, multiplier);
+ bgc_fp64_vector3_multiply_by_real("ient->real_part, ÷nd->real_part, multiplier);
+ bgc_fp64_vector3_multiply_by_real("ient->dual_part, ÷nd->dual_part, multiplier);
return BGC_SUCCESS;
}
@@ -182,70 +226,70 @@ inline int bgc_fp64_dual_vector3_divide(BGC_FP64_DualVector3* quotient, const BG
inline void bgc_fp32_dual_vector3_get_mean2(BGC_FP32_DualVector3* mean, const BGC_FP32_DualVector3* vector1, const BGC_FP32_DualVector3* vector2)
{
- bgc_fp32_vector3_get_mean2(&mean->real, &vector1->real, &vector2->real);
- bgc_fp32_vector3_get_mean2(&mean->dual, &vector1->dual, &vector2->dual);
+ bgc_fp32_vector3_get_mean2(&mean->real_part, &vector1->real_part, &vector2->real_part);
+ bgc_fp32_vector3_get_mean2(&mean->dual_part, &vector1->dual_part, &vector2->dual_part);
}
inline void bgc_fp64_dual_vector3_get_mean2(BGC_FP64_DualVector3* mean, const BGC_FP64_DualVector3* vector1, const BGC_FP64_DualVector3* vector2)
{
- bgc_fp64_vector3_get_mean2(&mean->real, &vector1->real, &vector2->real);
- bgc_fp64_vector3_get_mean2(&mean->dual, &vector1->dual, &vector2->dual);
+ bgc_fp64_vector3_get_mean2(&mean->real_part, &vector1->real_part, &vector2->real_part);
+ bgc_fp64_vector3_get_mean2(&mean->dual_part, &vector1->dual_part, &vector2->dual_part);
}
// =============== Mean of Three ================ //
inline void bgc_fp32_dual_vector3_get_mean3(BGC_FP32_DualVector3* mean, const BGC_FP32_DualVector3* vector1, const BGC_FP32_DualVector3* vector2, const BGC_FP32_DualVector3* vector3)
{
- bgc_fp32_vector3_get_mean3(&mean->real, &vector1->real, &vector2->real, &vector3->real);
- bgc_fp32_vector3_get_mean3(&mean->dual, &vector1->dual, &vector2->dual, &vector3->dual);
+ bgc_fp32_vector3_get_mean3(&mean->real_part, &vector1->real_part, &vector2->real_part, &vector3->real_part);
+ bgc_fp32_vector3_get_mean3(&mean->dual_part, &vector1->dual_part, &vector2->dual_part, &vector3->dual_part);
}
inline void bgc_fp64_dual_vector3_get_mean3(BGC_FP64_DualVector3* mean, const BGC_FP64_DualVector3* vector1, const BGC_FP64_DualVector3* vector2, const BGC_FP64_DualVector3* vector3)
{
- bgc_fp64_vector3_get_mean3(&mean->real, &vector1->real, &vector2->real, &vector3->real);
- bgc_fp64_vector3_get_mean3(&mean->dual, &vector1->dual, &vector2->dual, &vector3->dual);
+ bgc_fp64_vector3_get_mean3(&mean->real_part, &vector1->real_part, &vector2->real_part, &vector3->real_part);
+ bgc_fp64_vector3_get_mean3(&mean->dual_part, &vector1->dual_part, &vector2->dual_part, &vector3->dual_part);
}
// ============ Linear Interpolation ============ //
inline void bgc_fp32_dual_vector3_interpolate(BGC_FP32_DualVector3* interpolation, const BGC_FP32_DualVector3* first, const BGC_FP32_DualVector3* second, const float phase)
{
- bgc_fp32_vector3_interpolate(&interpolation->real, &first->real, &second->real, phase);
- bgc_fp32_vector3_interpolate(&interpolation->dual, &first->dual, &second->dual, phase);
+ bgc_fp32_vector3_interpolate(&interpolation->real_part, &first->real_part, &second->real_part, phase);
+ bgc_fp32_vector3_interpolate(&interpolation->dual_part, &first->dual_part, &second->dual_part, phase);
}
inline void bgc_fp64_dual_vector3_interpolate(BGC_FP64_DualVector3* interpolation, const BGC_FP64_DualVector3* first, const BGC_FP64_DualVector3* second, const double phase)
{
- bgc_fp64_vector3_interpolate(&interpolation->real, &first->real, &second->real, phase);
- bgc_fp64_vector3_interpolate(&interpolation->dual, &first->dual, &second->dual, phase);
+ bgc_fp64_vector3_interpolate(&interpolation->real_part, &first->real_part, &second->real_part, phase);
+ bgc_fp64_vector3_interpolate(&interpolation->dual_part, &first->dual_part, &second->dual_part, phase);
}
// =================== Revert =================== //
inline void bgc_fp32_dual_vector3_revert(BGC_FP32_DualVector3* vector)
{
- bgc_fp32_vector3_revert(&vector->real);
- bgc_fp32_vector3_revert(&vector->dual);
+ bgc_fp32_vector3_revert(&vector->real_part);
+ bgc_fp32_vector3_revert(&vector->dual_part);
}
inline void bgc_fp64_dual_vector3_revert(BGC_FP64_DualVector3* vector)
{
- bgc_fp64_vector3_revert(&vector->real);
- bgc_fp64_vector3_revert(&vector->dual);
+ bgc_fp64_vector3_revert(&vector->real_part);
+ bgc_fp64_vector3_revert(&vector->dual_part);
}
// ================ Get Reverse ================= //
inline void bgc_fp32_dual_vector3_get_reverse(BGC_FP32_DualVector3* reverse, const BGC_FP32_DualVector3* vector)
{
- bgc_fp32_vector3_get_reverse(&reverse->real, &vector->real);
- bgc_fp32_vector3_get_reverse(&reverse->dual, &vector->dual);
+ bgc_fp32_vector3_get_reverse(&reverse->real_part, &vector->real_part);
+ bgc_fp32_vector3_get_reverse(&reverse->dual_part, &vector->dual_part);
}
inline void bgc_fp64_dual_vector3_get_reverse(BGC_FP64_DualVector3* reverse, const BGC_FP64_DualVector3* vector)
{
- bgc_fp64_vector3_get_reverse(&reverse->real, &vector->real);
- bgc_fp64_vector3_get_reverse(&reverse->dual, &vector->dual);
+ bgc_fp64_vector3_get_reverse(&reverse->real_part, &vector->real_part);
+ bgc_fp64_vector3_get_reverse(&reverse->dual_part, &vector->dual_part);
}
#endif
diff --git a/basic-geometry/hg-matrix3x3.c b/basic-geometry/hg-matrix3x3.c
deleted file mode 100644
index e0155ee..0000000
--- a/basic-geometry/hg-matrix3x3.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "./hg-matrix3x3.h"
-
-inline void bgc_fp32_hg_matrix3x3_reset(BGC_FP32_HgMatrix3x3* homogeneous_matrix);
-inline void bgc_fp64_hg_matrix3x3_reset(BGC_FP64_HgMatrix3x3* homogeneous_matrix);
-
-inline void bgc_fp32_hg_matrix3x3_make(BGC_FP32_HgMatrix3x3* homogeneous_matrix, const BGC_FP32_Matrix3x3* linear_matrix, const BGC_FP32_Vector3* shift);
-inline void bgc_fp64_hg_matrix3x3_make(BGC_FP64_HgMatrix3x3* homogeneous_matrix, const BGC_FP64_Matrix3x3* linear_matrix, const BGC_FP64_Vector3* shift);
diff --git a/basic-geometry/hg-vector3.c b/basic-geometry/hg-vector3.c
deleted file mode 100644
index 02d5a59..0000000
--- a/basic-geometry/hg-vector3.c
+++ /dev/null
@@ -1,28 +0,0 @@
-#include "./hg-vector3.h"
-
-extern inline void bgc_fp32_hg_vector3_reset_point(BGC_FP32_HgVector3* homogeneous_vector);
-extern inline void bgc_fp64_hg_vector3_reset_point(BGC_FP64_HgVector3* homogeneous_vector);
-
-extern inline void bgc_fp32_hg_vector3_reset_vector(BGC_FP32_HgVector3* homogeneous_vector);
-extern inline void bgc_fp64_hg_vector3_reset_vector(BGC_FP64_HgVector3* homogeneous_vector);
-
-extern inline void bgc_fp32_hg_vector3_make(BGC_FP32_HgVector3* homogeneous_vector, const float x1, const float x2, const float x3, const float ratio);
-extern inline void bgc_fp64_hg_vector3_make(BGC_FP64_HgVector3* homogeneous_vector, const double x1, const double x2, const double x3, const double ratio);
-
-extern inline void bgc_fp32_hg_vector3_make_point(BGC_FP32_HgVector3* homogeneous_vector, const BGC_FP32_Vector3* regular_vector);
-extern inline void bgc_fp64_hg_vector3_make_point(BGC_FP64_HgVector3* homogeneous_vector, const BGC_FP64_Vector3* regular_vector);
-
-extern inline void bgc_fp32_hg_vector3_make_vector(BGC_FP32_HgVector3* homogeneous_vector, const BGC_FP32_Vector3* regular_vector);
-extern inline void bgc_fp64_hg_vector3_make_vector(BGC_FP64_HgVector3* homogeneous_vector, const BGC_FP64_Vector3* regular_vector);
-
-extern inline int bgc_fp32_hg_vector3_is_point(const BGC_FP32_HgVector3* homogeneous_vector);
-extern inline int bgc_fp64_hg_vector3_is_point(const BGC_FP64_HgVector3* homogeneous_vector);
-
-extern inline int bgc_fp32_hg_vector3_is_vector(const BGC_FP32_HgVector3* homogeneous_vector);
-extern inline int bgc_fp64_hg_vector3_is_vector(const BGC_FP64_HgVector3* homogeneous_vector);
-
-extern inline void bgc_fp32_hg_vector3_copy(BGC_FP32_HgVector3* destination, const BGC_FP32_HgVector3* source);
-extern inline void bgc_fp64_hg_vector3_copy(BGC_FP64_HgVector3* destination, const BGC_FP64_HgVector3* source);
-
-extern inline void bgc_fp32_hg_vector3_swap(BGC_FP32_HgVector3* first, BGC_FP32_HgVector3* second);
-extern inline void bgc_fp64_hg_vector3_swap(BGC_FP64_HgVector3* first, BGC_FP64_HgVector3* second);
diff --git a/basic-geometry/hmg-matrix3x3.c b/basic-geometry/hmg-matrix3x3.c
new file mode 100644
index 0000000..8ce329e
--- /dev/null
+++ b/basic-geometry/hmg-matrix3x3.c
@@ -0,0 +1,7 @@
+#include "./hmg-matrix3x3.h"
+
+inline void bgc_fp32_hg_matrix3x3_reset(BGC_FP32_HmgMatrix3x3* homogeneous_matrix);
+inline void bgc_fp64_hg_matrix3x3_reset(BGC_FP64_HmgMatrix3x3* homogeneous_matrix);
+
+inline void bgc_fp32_hg_matrix3x3_make(BGC_FP32_HmgMatrix3x3* homogeneous_matrix, const BGC_FP32_Matrix3x3* linear_matrix, const BGC_FP32_Vector3* shift);
+inline void bgc_fp64_hg_matrix3x3_make(BGC_FP64_HmgMatrix3x3* homogeneous_matrix, const BGC_FP64_Matrix3x3* linear_matrix, const BGC_FP64_Vector3* shift);
diff --git a/basic-geometry/hg-matrix3x3.h b/basic-geometry/hmg-matrix3x3.h
similarity index 83%
rename from basic-geometry/hg-matrix3x3.h
rename to basic-geometry/hmg-matrix3x3.h
index 9261acb..05cdc7b 100644
--- a/basic-geometry/hg-matrix3x3.h
+++ b/basic-geometry/hmg-matrix3x3.h
@@ -1,14 +1,12 @@
#ifndef _BGC_HG_MATRIX3X3_H_INCLUDED_
#define _BGC_HG_MATRIX3X3_H_INCLUDED_
-#include "./vector3.h"
#include "./types.h"
-
-#include "./hg-vector3.h"
+#include "./hmg-vector3.h"
// =================== Reset ==================== //
-inline void bgc_fp32_hg_matrix3x3_reset(BGC_FP32_HgMatrix3x3* homogeneous_matrix)
+inline void bgc_fp32_hg_matrix3x3_reset(BGC_FP32_HmgMatrix3x3* homogeneous_matrix)
{
homogeneous_matrix->r1c1 = 1.0f;
homogeneous_matrix->r1c2 = 0.0f;
@@ -31,7 +29,7 @@ inline void bgc_fp32_hg_matrix3x3_reset(BGC_FP32_HgMatrix3x3* homogeneous_matrix
homogeneous_matrix->d0d0 = 1.0f;
}
-inline void bgc_fp64_hg_matrix3x3_reset(BGC_FP64_HgMatrix3x3* homogeneous_matrix)
+inline void bgc_fp64_hg_matrix3x3_reset(BGC_FP64_HmgMatrix3x3* homogeneous_matrix)
{
homogeneous_matrix->r1c1 = 1.0;
homogeneous_matrix->r1c2 = 0.0;
@@ -54,9 +52,10 @@ inline void bgc_fp64_hg_matrix3x3_reset(BGC_FP64_HgMatrix3x3* homogeneous_matrix
homogeneous_matrix->d0d0 = 1.0;
}
+// ==================== Make ==================== //
// ==================== Make ==================== //
-inline void bgc_fp32_hg_matrix3x3_make(BGC_FP32_HgMatrix3x3* homogeneous_matrix, const BGC_FP32_Matrix3x3* linear_matrix, const BGC_FP32_Vector3* shift)
+inline void bgc_fp32_hg_matrix3x3_make(BGC_FP32_HmgMatrix3x3* homogeneous_matrix, const BGC_FP32_Matrix3x3* linear_matrix, const BGC_FP32_Vector3* shift)
{
homogeneous_matrix->r1c1 = linear_matrix->r1c1;
homogeneous_matrix->r1c2 = linear_matrix->r1c2;
@@ -79,7 +78,7 @@ inline void bgc_fp32_hg_matrix3x3_make(BGC_FP32_HgMatrix3x3* homogeneous_matrix,
homogeneous_matrix->d0d0 = 1.0f;
}
-inline void bgc_fp64_hg_matrix3x3_make(BGC_FP64_HgMatrix3x3* homogeneous_matrix, const BGC_FP64_Matrix3x3* linear_matrix, const BGC_FP64_Vector3* shift)
+inline void bgc_fp64_hg_matrix3x3_make(BGC_FP64_HmgMatrix3x3* homogeneous_matrix, const BGC_FP64_Matrix3x3* linear_matrix, const BGC_FP64_Vector3* shift)
{
homogeneous_matrix->r1c1 = linear_matrix->r1c1;
homogeneous_matrix->r1c2 = linear_matrix->r1c2;
diff --git a/basic-geometry/hmg-vector3.c b/basic-geometry/hmg-vector3.c
new file mode 100644
index 0000000..58831b9
--- /dev/null
+++ b/basic-geometry/hmg-vector3.c
@@ -0,0 +1,28 @@
+#include "./hmg-vector3.h"
+
+extern inline void bgc_fp32_hg_vector3_reset_point(BGC_FP32_HmgVector3* homogeneous_vector);
+extern inline void bgc_fp64_hg_vector3_reset_point(BGC_FP64_HmgVector3* homogeneous_vector);
+
+extern inline void bgc_fp32_hg_vector3_reset_vector(BGC_FP32_HmgVector3* homogeneous_vector);
+extern inline void bgc_fp64_hg_vector3_reset_vector(BGC_FP64_HmgVector3* homogeneous_vector);
+
+extern inline void bgc_fp32_hg_vector3_make(BGC_FP32_HmgVector3* homogeneous_vector, const float x1, const float x2, const float x3, const float ratio);
+extern inline void bgc_fp64_hg_vector3_make(BGC_FP64_HmgVector3* homogeneous_vector, const double x1, const double x2, const double x3, const double ratio);
+
+extern inline void bgc_fp32_hg_vector3_make_point(BGC_FP32_HmgVector3* homogeneous_vector, const BGC_FP32_Vector3* regular_vector);
+extern inline void bgc_fp64_hg_vector3_make_point(BGC_FP64_HmgVector3* homogeneous_vector, const BGC_FP64_Vector3* regular_vector);
+
+extern inline void bgc_fp32_hg_vector3_make_vector(BGC_FP32_HmgVector3* homogeneous_vector, const BGC_FP32_Vector3* regular_vector);
+extern inline void bgc_fp64_hg_vector3_make_vector(BGC_FP64_HmgVector3* homogeneous_vector, const BGC_FP64_Vector3* regular_vector);
+
+extern inline int bgc_fp32_hg_vector3_is_point(const BGC_FP32_HmgVector3* homogeneous_vector);
+extern inline int bgc_fp64_hg_vector3_is_point(const BGC_FP64_HmgVector3* homogeneous_vector);
+
+extern inline int bgc_fp32_hg_vector3_is_vector(const BGC_FP32_HmgVector3* homogeneous_vector);
+extern inline int bgc_fp64_hg_vector3_is_vector(const BGC_FP64_HmgVector3* homogeneous_vector);
+
+extern inline void bgc_fp32_hg_vector3_copy(BGC_FP32_HmgVector3* destination, const BGC_FP32_HmgVector3* source);
+extern inline void bgc_fp64_hg_vector3_copy(BGC_FP64_HmgVector3* destination, const BGC_FP64_HmgVector3* source);
+
+extern inline void bgc_fp32_hg_vector3_swap(BGC_FP32_HmgVector3* first, BGC_FP32_HmgVector3* second);
+extern inline void bgc_fp64_hg_vector3_swap(BGC_FP64_HmgVector3* first, BGC_FP64_HmgVector3* second);
diff --git a/basic-geometry/hg-vector3.h b/basic-geometry/hmg-vector3.h
similarity index 70%
rename from basic-geometry/hg-vector3.h
rename to basic-geometry/hmg-vector3.h
index 47bf0e5..16d8fac 100644
--- a/basic-geometry/hg-vector3.h
+++ b/basic-geometry/hmg-vector3.h
@@ -6,7 +6,7 @@
// ================ Reset Point ================= //
-inline void bgc_fp32_hg_vector3_reset_point(BGC_FP32_HgVector3* homogeneous_vector)
+inline void bgc_fp32_hg_vector3_reset_point(BGC_FP32_HmgVector3* homogeneous_vector)
{
homogeneous_vector->x1 = 0.0f;
homogeneous_vector->x2 = 0.0f;
@@ -14,7 +14,7 @@ inline void bgc_fp32_hg_vector3_reset_point(BGC_FP32_HgVector3* homogeneous_vect
homogeneous_vector->d0 = 1.0f;
}
-inline void bgc_fp64_hg_vector3_reset_point(BGC_FP64_HgVector3* homogeneous_vector)
+inline void bgc_fp64_hg_vector3_reset_point(BGC_FP64_HmgVector3* homogeneous_vector)
{
homogeneous_vector->x1 = 0.0;
homogeneous_vector->x2 = 0.0;
@@ -24,7 +24,7 @@ inline void bgc_fp64_hg_vector3_reset_point(BGC_FP64_HgVector3* homogeneous_vect
// ================ Reset Point ================= //
-inline void bgc_fp32_hg_vector3_reset_vector(BGC_FP32_HgVector3* homogeneous_vector)
+inline void bgc_fp32_hg_vector3_reset_vector(BGC_FP32_HmgVector3* homogeneous_vector)
{
homogeneous_vector->x1 = 0.0f;
homogeneous_vector->x2 = 0.0f;
@@ -32,7 +32,7 @@ inline void bgc_fp32_hg_vector3_reset_vector(BGC_FP32_HgVector3* homogeneous_vec
homogeneous_vector->d0 = 0.0f;
}
-inline void bgc_fp64_hg_vector3_reset_vector(BGC_FP64_HgVector3* homogeneous_vector)
+inline void bgc_fp64_hg_vector3_reset_vector(BGC_FP64_HmgVector3* homogeneous_vector)
{
homogeneous_vector->x1 = 0.0;
homogeneous_vector->x2 = 0.0;
@@ -42,7 +42,7 @@ inline void bgc_fp64_hg_vector3_reset_vector(BGC_FP64_HgVector3* homogeneous_vec
// ==================== Make ==================== //
-inline void bgc_fp32_hg_vector3_make(BGC_FP32_HgVector3* homogeneous_vector, const float x1, const float x2, const float x3, const float d0)
+inline void bgc_fp32_hg_vector3_make(BGC_FP32_HmgVector3* homogeneous_vector, const float x1, const float x2, const float x3, const float d0)
{
homogeneous_vector->x1 = x1;
homogeneous_vector->x2 = x2;
@@ -50,7 +50,7 @@ inline void bgc_fp32_hg_vector3_make(BGC_FP32_HgVector3* homogeneous_vector, con
homogeneous_vector->d0 = d0;
}
-inline void bgc_fp64_hg_vector3_make(BGC_FP64_HgVector3* homogeneous_vector, const double x1, const double x2, const double x3, const double d0)
+inline void bgc_fp64_hg_vector3_make(BGC_FP64_HmgVector3* homogeneous_vector, const double x1, const double x2, const double x3, const double d0)
{
homogeneous_vector->x1 = x1;
homogeneous_vector->x2 = x2;
@@ -60,7 +60,7 @@ inline void bgc_fp64_hg_vector3_make(BGC_FP64_HgVector3* homogeneous_vector, con
// ================= Make Point ================= //
-inline void bgc_fp32_hg_vector3_make_point(BGC_FP32_HgVector3* homogeneous_vector, const BGC_FP32_Vector3* regular_vector)
+inline void bgc_fp32_hg_vector3_make_point(BGC_FP32_HmgVector3* homogeneous_vector, const BGC_FP32_Vector3* regular_vector)
{
homogeneous_vector->x1 = regular_vector->x1;
homogeneous_vector->x2 = regular_vector->x2;
@@ -68,7 +68,7 @@ inline void bgc_fp32_hg_vector3_make_point(BGC_FP32_HgVector3* homogeneous_vecto
homogeneous_vector->d0 = 1.0f;
}
-inline void bgc_fp64_hg_vector3_make_point(BGC_FP64_HgVector3* homogeneous_vector, const BGC_FP64_Vector3* regular_vector)
+inline void bgc_fp64_hg_vector3_make_point(BGC_FP64_HmgVector3* homogeneous_vector, const BGC_FP64_Vector3* regular_vector)
{
homogeneous_vector->x1 = regular_vector->x1;
homogeneous_vector->x2 = regular_vector->x2;
@@ -78,7 +78,7 @@ inline void bgc_fp64_hg_vector3_make_point(BGC_FP64_HgVector3* homogeneous_vecto
// ================ Make Vector ================= //
-inline void bgc_fp32_hg_vector3_make_vector(BGC_FP32_HgVector3* homogeneous_vector, const BGC_FP32_Vector3* regular_vector)
+inline void bgc_fp32_hg_vector3_make_vector(BGC_FP32_HmgVector3* homogeneous_vector, const BGC_FP32_Vector3* regular_vector)
{
homogeneous_vector->x1 = regular_vector->x1;
homogeneous_vector->x2 = regular_vector->x2;
@@ -86,7 +86,7 @@ inline void bgc_fp32_hg_vector3_make_vector(BGC_FP32_HgVector3* homogeneous_vect
homogeneous_vector->d0 = 0.0f;
}
-inline void bgc_fp64_hg_vector3_make_vector(BGC_FP64_HgVector3* homogeneous_vector, const BGC_FP64_Vector3* regular_vector)
+inline void bgc_fp64_hg_vector3_make_vector(BGC_FP64_HmgVector3* homogeneous_vector, const BGC_FP64_Vector3* regular_vector)
{
homogeneous_vector->x1 = regular_vector->x1;
homogeneous_vector->x2 = regular_vector->x2;
@@ -96,31 +96,31 @@ inline void bgc_fp64_hg_vector3_make_vector(BGC_FP64_HgVector3* homogeneous_vect
// ================== Is Point ================== //
-inline int bgc_fp32_hg_vector3_is_point(const BGC_FP32_HgVector3* homogeneous_vector)
+inline int bgc_fp32_hg_vector3_is_point(const BGC_FP32_HmgVector3* homogeneous_vector)
{
return !bgc_fp32_is_zero(homogeneous_vector->d0);
}
-inline int bgc_fp64_hg_vector3_is_point(const BGC_FP64_HgVector3* homogeneous_vector)
+inline int bgc_fp64_hg_vector3_is_point(const BGC_FP64_HmgVector3* homogeneous_vector)
{
return !bgc_fp64_is_zero(homogeneous_vector->d0);
}
// ================= Is Vector ================== //
-inline int bgc_fp32_hg_vector3_is_vector(const BGC_FP32_HgVector3* homogeneous_vector)
+inline int bgc_fp32_hg_vector3_is_vector(const BGC_FP32_HmgVector3* homogeneous_vector)
{
return bgc_fp32_is_zero(homogeneous_vector->d0);
}
-inline int bgc_fp64_hg_vector3_is_vector(const BGC_FP64_HgVector3* homogeneous_vector)
+inline int bgc_fp64_hg_vector3_is_vector(const BGC_FP64_HmgVector3* homogeneous_vector)
{
return bgc_fp64_is_zero(homogeneous_vector->d0);
}
// ==================== Copy ==================== //
-inline void bgc_fp32_hg_vector3_copy(BGC_FP32_HgVector3* destination, const BGC_FP32_HgVector3* source)
+inline void bgc_fp32_hg_vector3_copy(BGC_FP32_HmgVector3* destination, const BGC_FP32_HmgVector3* source)
{
destination->x1 = source->x1;
destination->x2 = source->x2;
@@ -128,7 +128,7 @@ inline void bgc_fp32_hg_vector3_copy(BGC_FP32_HgVector3* destination, const BGC_
destination->d0 = source->d0;
}
-inline void bgc_fp64_hg_vector3_copy(BGC_FP64_HgVector3* destination, const BGC_FP64_HgVector3* source)
+inline void bgc_fp64_hg_vector3_copy(BGC_FP64_HmgVector3* destination, const BGC_FP64_HmgVector3* source)
{
destination->x1 = source->x1;
destination->x2 = source->x2;
@@ -138,7 +138,7 @@ inline void bgc_fp64_hg_vector3_copy(BGC_FP64_HgVector3* destination, const BGC_
// ==================== Swap ==================== //
-inline void bgc_fp32_hg_vector3_swap(BGC_FP32_HgVector3* first, BGC_FP32_HgVector3* second)
+inline void bgc_fp32_hg_vector3_swap(BGC_FP32_HmgVector3* first, BGC_FP32_HmgVector3* second)
{
const float x1 = first->x1;
const float x2 = first->x2;
@@ -156,7 +156,7 @@ inline void bgc_fp32_hg_vector3_swap(BGC_FP32_HgVector3* first, BGC_FP32_HgVecto
second->d0 = d0;
}
-inline void bgc_fp64_hg_vector3_swap(BGC_FP64_HgVector3* first, BGC_FP64_HgVector3* second)
+inline void bgc_fp64_hg_vector3_swap(BGC_FP64_HmgVector3* first, BGC_FP64_HmgVector3* second)
{
const double x1 = first->x1;
const double x2 = first->x2;
@@ -176,7 +176,7 @@ inline void bgc_fp64_hg_vector3_swap(BGC_FP64_HgVector3* first, BGC_FP64_HgVecto
// ================== Rescale =================== //
-inline int bgc_fp32_hg_vector3_rescale(BGC_FP32_HgVector3* homogeneous_vector, const float new_ratio)
+inline int bgc_fp32_hg_vector3_rescale(BGC_FP32_HmgVector3* homogeneous_vector, const float new_ratio)
{
if (bgc_fp32_is_zero(homogeneous_vector->d0)) {
return BGC_FAILURE;
@@ -192,7 +192,7 @@ inline int bgc_fp32_hg_vector3_rescale(BGC_FP32_HgVector3* homogeneous_vector, c
return BGC_SUCCESS;
}
-inline int bgc_fp64_hg_vector3_rescale(BGC_FP64_HgVector3* homogeneous_vector, const double new_ratio)
+inline int bgc_fp64_hg_vector3_rescale(BGC_FP64_HmgVector3* homogeneous_vector, const double new_ratio)
{
if (bgc_fp64_is_zero(homogeneous_vector->d0)) {
return BGC_FAILURE;
diff --git a/basic-geometry/position2.h b/basic-geometry/position2.h
index 6706c3a..82370a9 100644
--- a/basic-geometry/position2.h
+++ b/basic-geometry/position2.h
@@ -1,22 +1,11 @@
#ifndef _BGC_POSITION2_H_INCLUDED_
#define _BGC_POSITION2_H_INCLUDED_
+#include "./types.h"
#include "./vector2.h"
-#include "./affine2.h"
+#include "./matrix2x2.h"
#include "./turn2.h"
-// ==================== Types ==================== //
-
-typedef struct {
- BGC_FP32_Turn2 turn;
- BGC_FP32_Vector2 shift;
-} BGC_FP32_Position2;
-
-typedef struct {
- BGC_FP64_Turn2 turn;
- BGC_FP64_Vector2 shift;
-} BGC_FP64_Position2;
-
// ==================== Reset ==================== //
inline void bgc_fp32_position2_reset(BGC_FP32_Position2* position)
diff --git a/basic-geometry/position3.h b/basic-geometry/position3.h
index c91bf7b..49d7b0f 100644
--- a/basic-geometry/position3.h
+++ b/basic-geometry/position3.h
@@ -1,22 +1,11 @@
#ifndef _BGC_POSITION3_H_INCLUDED_
#define _BGC_POSITION3_H_INCLUDED_
+#include "./types.h"
#include "./vector3.h"
-#include "./affine3.h"
+#include "./matrix3x3.h"
#include "./turn3.h"
-// ==================== Types ==================== //
-
-typedef struct {
- BGC_FP32_Turn3 turn;
- BGC_FP32_Vector3 shift;
-} BGC_FP32_Position3;
-
-typedef struct {
- BGC_FP64_Turn3 turn;
- BGC_FP64_Vector3 shift;
-} BGC_FP64_Position3;
-
// ==================== Reset ==================== //
inline void bgc_fp32_position3_reset(BGC_FP32_Position3 * position)
diff --git a/basic-geometry/slerp.c b/basic-geometry/slerp.c
deleted file mode 100644
index 2eca4a7..0000000
--- a/basic-geometry/slerp.c
+++ /dev/null
@@ -1,95 +0,0 @@
-#include "./slerp.h"
-
-extern inline void bgc_fp32_slerp_reset(BGC_FP32_Turn3Slerp* slerp);
-extern inline void bgc_fp64_slerp_reset(BGC_FP64_Turn3Slerp* slerp);
-
-extern inline void bgc_fp32_slerp_make_full(BGC_FP32_Turn3Slerp* slerp, const BGC_FP32_Turn3* start, const BGC_FP32_Turn3* end);
-extern inline void bgc_fp64_slerp_make_full(BGC_FP64_Turn3Slerp* slerp, const BGC_FP64_Turn3* start, const BGC_FP64_Turn3* end);
-
-extern inline void bgc_fp32_slerp_make_shortened(BGC_FP32_Turn3Slerp* slerp, const BGC_FP32_Turn3* start, const BGC_FP32_Turn3* end);
-extern inline void bgc_fp64_slerp_make_shortened(BGC_FP64_Turn3Slerp* slerp, const BGC_FP64_Turn3* start, const BGC_FP64_Turn3* end);
-
-extern inline void bgc_fp32_slerp_get_phase_versor(BGC_FP32_Turn3* versor, const BGC_FP32_Turn3Slerp* slerp, const float phase);
-extern inline void bgc_fp64_slerp_get_phase_versor(BGC_FP64_Turn3* versor, const BGC_FP64_Turn3Slerp* slerp, const double phase);
-
-void bgc_fp32_slerp_make(BGC_FP32_Turn3Slerp* slerp, const BGC_FP32_Turn3* start, const BGC_FP32_Turn3* augment)
-{
- const float square_vector = augment->_versor.x1 * augment->_versor.x1 + augment->_versor.x2 * augment->_versor.x2 + augment->_versor.x3 * augment->_versor.x3;
-
- if (isnan(square_vector)) {
- bgc_fp32_slerp_reset(slerp);
- return;
- }
-
- if (square_vector <= BGC_FP32_SQUARE_EPSILON) {
- slerp->_s0_cos_weight = start->_versor.s0;
- slerp->_x1_cos_weight = start->_versor.x1;
- slerp->_x2_cos_weight = start->_versor.x2;
- slerp->_x3_cos_weight = start->_versor.x3;
-
- slerp->_s0_sin_weight = 0.0f;
- slerp->_x1_sin_weight = 0.0f;
- slerp->_x2_sin_weight = 0.0f;
- slerp->_x3_sin_weight = 0.0f;
-
- slerp->radians = 0.0f;
- return;
- }
-
- const float vector_modulus = sqrtf(square_vector);
-
- slerp->radians = atan2f(vector_modulus, augment->_versor.s0);
-
- const float multiplier = 1.0f / vector_modulus;
-
- slerp->_s0_cos_weight = start->_versor.s0;
- slerp->_x1_cos_weight = start->_versor.x1;
- slerp->_x2_cos_weight = start->_versor.x2;
- slerp->_x3_cos_weight = start->_versor.x3;
-
- slerp->_s0_sin_weight = -multiplier * (augment->_versor.x1 * start->_versor.x1 + augment->_versor.x2 * start->_versor.x2 + augment->_versor.x3 * start->_versor.x3);
- slerp->_x1_sin_weight = multiplier * (augment->_versor.x1 * start->_versor.s0 + augment->_versor.x2 * start->_versor.x3 - augment->_versor.x3 * start->_versor.x2);
- slerp->_x2_sin_weight = multiplier * (augment->_versor.x2 * start->_versor.s0 - augment->_versor.x1 * start->_versor.x3 + augment->_versor.x3 * start->_versor.x1);
- slerp->_x3_sin_weight = multiplier * (augment->_versor.x3 * start->_versor.s0 - augment->_versor.x2 * start->_versor.x1 + augment->_versor.x1 * start->_versor.x2);
-}
-
-void bgc_fp64_slerp_make(BGC_FP64_Turn3Slerp* slerp, const BGC_FP64_Turn3* start, const BGC_FP64_Turn3* augment)
-{
- const double square_vector = augment->_versor.x1 * augment->_versor.x1 + augment->_versor.x2 * augment->_versor.x2 + augment->_versor.x3 * augment->_versor.x3;
-
- if (isnan(square_vector)) {
- bgc_fp64_slerp_reset(slerp);
- return;
- }
-
- if (square_vector <= BGC_FP64_SQUARE_EPSILON) {
- slerp->_s0_cos_weight = start->_versor.s0;
- slerp->_x1_cos_weight = start->_versor.x1;
- slerp->_x2_cos_weight = start->_versor.x2;
- slerp->_x3_cos_weight = start->_versor.x3;
-
- slerp->_s0_sin_weight = 0.0;
- slerp->_x1_sin_weight = 0.0;
- slerp->_x2_sin_weight = 0.0;
- slerp->_x3_sin_weight = 0.0;
-
- slerp->radians = 0.0;
- return;
- }
-
- const double vector_modulus = sqrt(square_vector);
-
- slerp->radians = atan2(vector_modulus, augment->_versor.s0);
-
- const double multiplier = 1.0 / vector_modulus;
-
- slerp->_s0_cos_weight = start->_versor.s0;
- slerp->_x1_cos_weight = start->_versor.x1;
- slerp->_x2_cos_weight = start->_versor.x2;
- slerp->_x3_cos_weight = start->_versor.x3;
-
- slerp->_s0_sin_weight = -multiplier * (augment->_versor.x1 * start->_versor.x1 + augment->_versor.x2 * start->_versor.x2 + augment->_versor.x3 * start->_versor.x3);
- slerp->_x1_sin_weight = multiplier * (augment->_versor.x1 * start->_versor.s0 + augment->_versor.x2 * start->_versor.x3 - augment->_versor.x3 * start->_versor.x2);
- slerp->_x2_sin_weight = multiplier * (augment->_versor.x2 * start->_versor.s0 - augment->_versor.x1 * start->_versor.x3 + augment->_versor.x3 * start->_versor.x1);
- slerp->_x3_sin_weight = multiplier * (augment->_versor.x3 * start->_versor.s0 - augment->_versor.x2 * start->_versor.x1 + augment->_versor.x1 * start->_versor.x2);
-}
diff --git a/basic-geometry/slerp.h b/basic-geometry/slerp.h
deleted file mode 100644
index b2595e5..0000000
--- a/basic-geometry/slerp.h
+++ /dev/null
@@ -1,112 +0,0 @@
-#ifndef _BGC_SLERP_H_INCLUDED_
-#define _BGC_SLERP_H_INCLUDED_
-
-#include "./types.h"
-#include "./turn3.h"
-
-inline void bgc_fp32_slerp_reset(BGC_FP32_Turn3Slerp* slerp)
-{
- slerp->_s0_cos_weight = 1.0f;
- slerp->_s0_sin_weight = 0.0f;
-
- slerp->_x1_cos_weight = 0.0f;
- slerp->_x1_sin_weight = 0.0f;
-
- slerp->_x2_cos_weight = 0.0f;
- slerp->_x2_sin_weight = 0.0f;
-
- slerp->_x3_cos_weight = 0.0f;
- slerp->_x3_sin_weight = 0.0f;
-
- slerp->radians = 0.0f;
-}
-
-inline void bgc_fp64_slerp_reset(BGC_FP64_Turn3Slerp* slerp)
-{
- slerp->_s0_cos_weight = 1.0;
- slerp->_s0_sin_weight = 0.0;
-
- slerp->_x1_cos_weight = 0.0;
- slerp->_x1_sin_weight = 0.0;
-
- slerp->_x2_cos_weight = 0.0;
- slerp->_x2_sin_weight = 0.0;
-
- slerp->_x3_cos_weight = 0.0;
- slerp->_x3_sin_weight = 0.0;
-
- slerp->radians = 0.0;
-}
-
-void bgc_fp32_slerp_make(BGC_FP32_Turn3Slerp* slerp, const BGC_FP32_Turn3* start, const BGC_FP32_Turn3* augment);
-void bgc_fp64_slerp_make(BGC_FP64_Turn3Slerp* slerp, const BGC_FP64_Turn3* start, const BGC_FP64_Turn3* augment);
-
-inline void bgc_fp32_slerp_make_full(BGC_FP32_Turn3Slerp* slerp, const BGC_FP32_Turn3* start, const BGC_FP32_Turn3* end)
-{
- BGC_FP32_Turn3 augment;
-
- bgc_fp32_turn3_exclude(&augment, end, start);
-
- bgc_fp32_slerp_make(slerp, start, &augment);
-}
-
-inline void bgc_fp64_slerp_make_full(BGC_FP64_Turn3Slerp* slerp, const BGC_FP64_Turn3* start, const BGC_FP64_Turn3* end)
-{
- BGC_FP64_Turn3 augment;
-
- bgc_fp64_turn3_exclude(&augment, end, start);
-
- bgc_fp64_slerp_make(slerp, start, &augment);
-}
-
-inline void bgc_fp32_slerp_make_shortened(BGC_FP32_Turn3Slerp* slerp, const BGC_FP32_Turn3* start, const BGC_FP32_Turn3* end)
-{
- BGC_FP32_Turn3 augment;
-
- bgc_fp32_turn3_exclude(&augment, end, start);
- bgc_fp32_turn3_shorten(&augment);
-
- bgc_fp32_slerp_make(slerp, start, &augment);
-}
-
-inline void bgc_fp64_slerp_make_shortened(BGC_FP64_Turn3Slerp* slerp, const BGC_FP64_Turn3* start, const BGC_FP64_Turn3* end)
-{
- BGC_FP64_Turn3 augment;
-
- bgc_fp64_turn3_exclude(&augment, end, start);
- bgc_fp64_turn3_shorten(&augment);
-
- bgc_fp64_slerp_make(slerp, start, &augment);
-}
-
-inline void bgc_fp32_slerp_get_phase_versor(BGC_FP32_Turn3* versor, const BGC_FP32_Turn3Slerp* slerp, const float phase)
-{
- const float angle = slerp->radians * phase;
- const float cosine = cosf(angle);
- const float sine = sinf(angle);
-
- bgc_fp32_turn3_set_raw_values(
- versor,
- slerp->_s0_cos_weight * cosine + slerp->_s0_sin_weight * sine,
- slerp->_x1_cos_weight * cosine + slerp->_x1_sin_weight * sine,
- slerp->_x2_cos_weight * cosine + slerp->_x2_sin_weight * sine,
- slerp->_x3_cos_weight * cosine + slerp->_x3_sin_weight * sine
- );
-}
-
-inline void bgc_fp64_slerp_get_phase_versor(BGC_FP64_Turn3* versor, const BGC_FP64_Turn3Slerp* slerp, const double phase)
-{
- const double angle = slerp->radians * phase;
- const double cosine = cos(angle);
- const double sine = sin(angle);
-
- bgc_fp64_turn3_set_raw_values(
- versor,
- slerp->_s0_cos_weight * cosine + slerp->_s0_sin_weight * sine,
- slerp->_x1_cos_weight * cosine + slerp->_x1_sin_weight * sine,
- slerp->_x2_cos_weight * cosine + slerp->_x2_sin_weight * sine,
- slerp->_x3_cos_weight * cosine + slerp->_x3_sin_weight * sine
- );
-}
-
-#endif
diff --git a/basic-geometry/slerp3.c b/basic-geometry/slerp3.c
new file mode 100644
index 0000000..8161d27
--- /dev/null
+++ b/basic-geometry/slerp3.c
@@ -0,0 +1,104 @@
+#include "./slerp3.h"
+
+extern inline void bgc_fp32_slerp_reset(BGC_FP32_Slerp3* slerp);
+extern inline void bgc_fp64_slerp_reset(BGC_FP64_Slerp3* slerp);
+
+extern inline void bgc_fp32_slerp_make_full(BGC_FP32_Slerp3* slerp, const BGC_FP32_Turn3* start, const BGC_FP32_Turn3* end);
+extern inline void bgc_fp64_slerp_make_full(BGC_FP64_Slerp3* slerp, const BGC_FP64_Turn3* start, const BGC_FP64_Turn3* end);
+
+extern inline void bgc_fp32_slerp_make_shortened(BGC_FP32_Slerp3* slerp, const BGC_FP32_Turn3* start, const BGC_FP32_Turn3* end);
+extern inline void bgc_fp64_slerp_make_shortened(BGC_FP64_Slerp3* slerp, const BGC_FP64_Turn3* start, const BGC_FP64_Turn3* end);
+
+extern inline void bgc_fp32_slerp_get_phase_turn(BGC_FP32_Turn3* versor, const BGC_FP32_Slerp3* slerp, const float phase);
+extern inline void bgc_fp64_slerp_get_phase_turn(BGC_FP64_Turn3* versor, const BGC_FP64_Slerp3* slerp, const double phase);
+
+extern inline void bgc_fp32_slerp_get_phase_rotation_matrix(BGC_FP32_Matrix3x3* rotation_matrix, const BGC_FP32_Slerp3* slerp, const float phase);
+extern inline void bgc_fp64_slerp_get_phase_rotation_matrix(BGC_FP64_Matrix3x3* rotation_matrix, const BGC_FP64_Slerp3* slerp, const double phase);
+
+extern inline void bgc_fp32_slerp_get_phase_reverse_matrix(BGC_FP32_Matrix3x3* reverse_matrix, const BGC_FP32_Slerp3* slerp, const float phase);
+extern inline void bgc_fp64_slerp_get_phase_rotation_matrix(BGC_FP64_Matrix3x3* reverse_matrix, const BGC_FP64_Slerp3* slerp, const double phase);
+
+extern inline void bgc_fp32_slerp_get_phase_both_matrices(BGC_FP32_Matrix3x3* rotation_matrix, BGC_FP32_Matrix3x3* reverse_matrix, const BGC_FP32_Slerp3* slerp, const float phase);
+extern inline void bgc_fp64_slerp_get_phase_both_matrices(BGC_FP64_Matrix3x3* rotation_matrix, BGC_FP64_Matrix3x3* reverse_matrix, const BGC_FP64_Slerp3* slerp, const double phase);
+
+void bgc_fp32_slerp_make(BGC_FP32_Slerp3* slerp, const BGC_FP32_Turn3* start, const BGC_FP32_Turn3* augment)
+{
+ const float square_vector = augment->_versor.x1 * augment->_versor.x1 + augment->_versor.x2 * augment->_versor.x2 + augment->_versor.x3 * augment->_versor.x3;
+
+ if (isnan(square_vector)) {
+ bgc_fp32_slerp_reset(slerp);
+ return;
+ }
+
+ if (square_vector <= BGC_FP32_SQUARE_EPSILON) {
+ slerp->_cosine_weight.s0 = start->_versor.s0;
+ slerp->_cosine_weight.x1 = start->_versor.x1;
+ slerp->_cosine_weight.x2 = start->_versor.x2;
+ slerp->_cosine_weight.x3 = start->_versor.x3;
+
+ slerp->_sine_weight.s0 = 0.0f;
+ slerp->_sine_weight.x1 = 0.0f;
+ slerp->_sine_weight.x2 = 0.0f;
+ slerp->_sine_weight.x3 = 0.0f;
+
+ slerp->radians = 0.0f;
+ return;
+ }
+
+ const float vector_modulus = sqrtf(square_vector);
+
+ slerp->radians = atan2f(vector_modulus, augment->_versor.s0);
+
+ const float multiplier = 1.0f / vector_modulus;
+
+ slerp->_cosine_weight.s0 = start->_versor.s0;
+ slerp->_cosine_weight.x1 = start->_versor.x1;
+ slerp->_cosine_weight.x2 = start->_versor.x2;
+ slerp->_cosine_weight.x3 = start->_versor.x3;
+
+ slerp->_sine_weight.s0 = -multiplier * (augment->_versor.x1 * start->_versor.x1 + augment->_versor.x2 * start->_versor.x2 + augment->_versor.x3 * start->_versor.x3);
+ slerp->_sine_weight.x1 = multiplier * (augment->_versor.x1 * start->_versor.s0 + augment->_versor.x2 * start->_versor.x3 - augment->_versor.x3 * start->_versor.x2);
+ slerp->_sine_weight.x2 = multiplier * (augment->_versor.x2 * start->_versor.s0 - augment->_versor.x1 * start->_versor.x3 + augment->_versor.x3 * start->_versor.x1);
+ slerp->_sine_weight.x3 = multiplier * (augment->_versor.x3 * start->_versor.s0 - augment->_versor.x2 * start->_versor.x1 + augment->_versor.x1 * start->_versor.x2);
+}
+
+void bgc_fp64_slerp_make(BGC_FP64_Slerp3* slerp, const BGC_FP64_Turn3* start, const BGC_FP64_Turn3* augment)
+{
+ const double square_vector = augment->_versor.x1 * augment->_versor.x1 + augment->_versor.x2 * augment->_versor.x2 + augment->_versor.x3 * augment->_versor.x3;
+
+ if (isnan(square_vector)) {
+ bgc_fp64_slerp_reset(slerp);
+ return;
+ }
+
+ if (square_vector <= BGC_FP64_SQUARE_EPSILON) {
+ slerp->_cosine_weight.s0 = start->_versor.s0;
+ slerp->_cosine_weight.x1 = start->_versor.x1;
+ slerp->_cosine_weight.x2 = start->_versor.x2;
+ slerp->_cosine_weight.x3 = start->_versor.x3;
+
+ slerp->_sine_weight.s0 = 0.0;
+ slerp->_sine_weight.x1 = 0.0;
+ slerp->_sine_weight.x2 = 0.0;
+ slerp->_sine_weight.x3 = 0.0;
+
+ slerp->radians = 0.0;
+ return;
+ }
+
+ const double vector_modulus = sqrt(square_vector);
+
+ slerp->radians = atan2(vector_modulus, augment->_versor.s0);
+
+ const double multiplier = 1.0 / vector_modulus;
+
+ slerp->_cosine_weight.s0 = start->_versor.s0;
+ slerp->_cosine_weight.x1 = start->_versor.x1;
+ slerp->_cosine_weight.x2 = start->_versor.x2;
+ slerp->_cosine_weight.x3 = start->_versor.x3;
+
+ slerp->_sine_weight.s0 = -multiplier * (augment->_versor.x1 * start->_versor.x1 + augment->_versor.x2 * start->_versor.x2 + augment->_versor.x3 * start->_versor.x3);
+ slerp->_sine_weight.x1 = multiplier * (augment->_versor.x1 * start->_versor.s0 + augment->_versor.x2 * start->_versor.x3 - augment->_versor.x3 * start->_versor.x2);
+ slerp->_sine_weight.x2 = multiplier * (augment->_versor.x2 * start->_versor.s0 - augment->_versor.x1 * start->_versor.x3 + augment->_versor.x3 * start->_versor.x1);
+ slerp->_sine_weight.x3 = multiplier * (augment->_versor.x3 * start->_versor.s0 - augment->_versor.x2 * start->_versor.x1 + augment->_versor.x1 * start->_versor.x2);
+}
diff --git a/basic-geometry/slerp3.h b/basic-geometry/slerp3.h
new file mode 100644
index 0000000..0af260d
--- /dev/null
+++ b/basic-geometry/slerp3.h
@@ -0,0 +1,207 @@
+#ifndef _BGC_SLERP_H_INCLUDED_
+#define _BGC_SLERP_H_INCLUDED_
+
+#include "./types.h"
+#include "./quaternion.h"
+#include "./turn3.h"
+
+// =================== Reset ==================== //
+
+inline void bgc_fp32_slerp_reset(BGC_FP32_Slerp3* slerp)
+{
+ slerp->_cosine_weight.s0 = 1.0f;
+ slerp->_cosine_weight.x1 = 0.0f;
+ slerp->_cosine_weight.x2 = 0.0f;
+ slerp->_cosine_weight.x3 = 0.0f;
+
+ slerp->_sine_weight.s0 = 0.0f;
+ slerp->_sine_weight.x1 = 0.0f;
+ slerp->_sine_weight.x2 = 0.0f;
+ slerp->_sine_weight.x3 = 0.0f;
+
+ slerp->radians = 0.0f;
+}
+
+inline void bgc_fp64_slerp_reset(BGC_FP64_Slerp3* slerp)
+{
+ slerp->_cosine_weight.s0 = 1.0;
+ slerp->_cosine_weight.x1 = 0.0;
+ slerp->_cosine_weight.x2 = 0.0;
+ slerp->_cosine_weight.x3 = 0.0;
+
+ slerp->_sine_weight.s0 = 0.0;
+ slerp->_sine_weight.x1 = 0.0;
+ slerp->_sine_weight.x2 = 0.0;
+ slerp->_sine_weight.x3 = 0.0;
+
+ slerp->radians = 0.0;
+}
+
+// ==================== Make ==================== //
+
+void bgc_fp32_slerp_make(BGC_FP32_Slerp3* slerp, const BGC_FP32_Turn3* start, const BGC_FP32_Turn3* augment);
+void bgc_fp64_slerp_make(BGC_FP64_Slerp3* slerp, const BGC_FP64_Turn3* start, const BGC_FP64_Turn3* augment);
+
+// ================= Make Full ================== //
+
+inline void bgc_fp32_slerp_make_full(BGC_FP32_Slerp3* slerp, const BGC_FP32_Turn3* start, const BGC_FP32_Turn3* end)
+{
+ BGC_FP32_Turn3 augment;
+
+ bgc_fp32_turn3_exclude(&augment, end, start);
+
+ bgc_fp32_slerp_make(slerp, start, &augment);
+}
+
+inline void bgc_fp64_slerp_make_full(BGC_FP64_Slerp3* slerp, const BGC_FP64_Turn3* start, const BGC_FP64_Turn3* end)
+{
+ BGC_FP64_Turn3 augment;
+
+ bgc_fp64_turn3_exclude(&augment, end, start);
+
+ bgc_fp64_slerp_make(slerp, start, &augment);
+}
+
+// =============== Make Shortened =============== //
+
+inline void bgc_fp32_slerp_make_shortened(BGC_FP32_Slerp3* slerp, const BGC_FP32_Turn3* start, const BGC_FP32_Turn3* end)
+{
+ BGC_FP32_Turn3 augment;
+
+ bgc_fp32_turn3_exclude(&augment, end, start);
+ bgc_fp32_turn3_shorten(&augment);
+
+ bgc_fp32_slerp_make(slerp, start, &augment);
+}
+
+inline void bgc_fp64_slerp_make_shortened(BGC_FP64_Slerp3* slerp, const BGC_FP64_Turn3* start, const BGC_FP64_Turn3* end)
+{
+ BGC_FP64_Turn3 augment;
+
+ bgc_fp64_turn3_exclude(&augment, end, start);
+ bgc_fp64_turn3_shorten(&augment);
+
+ bgc_fp64_slerp_make(slerp, start, &augment);
+}
+
+// =============== Get Phase Turn =============== //
+
+inline void bgc_fp32_slerp_get_phase_turn(BGC_FP32_Turn3* turn, const BGC_FP32_Slerp3* slerp, const float phase)
+{
+ const float angle = slerp->radians * phase;
+ const float cosine = cosf(angle);
+ const float sine = sinf(angle);
+
+ BGC_FP32_Quaternion q;
+
+ bgc_fp32_quaternion_multiply_by_real(&q, &slerp->_cosine_weight, cosine);
+ bgc_fp32_quaternion_add_scaled(&q, &q, &slerp->_sine_weight, sine);
+
+ bgc_fp32_turn3_set_quaternion(turn, &q);
+}
+
+inline void bgc_fp64_slerp_get_phase_turn(BGC_FP64_Turn3* turn, const BGC_FP64_Slerp3* slerp, const double phase)
+{
+ const double angle = slerp->radians * phase;
+ const double cosine = cos(angle);
+ const double sine = sin(angle);
+
+ BGC_FP64_Quaternion q;
+
+ bgc_fp64_quaternion_multiply_by_real(&q, &slerp->_cosine_weight, cosine);
+ bgc_fp64_quaternion_add_scaled(&q, &q, &slerp->_sine_weight, sine);
+
+ bgc_fp64_turn3_set_quaternion(turn, &q);
+}
+
+// ========= Get Phase Rotation Matrix ========== //
+
+inline void bgc_fp32_slerp_get_phase_rotation_matrix(BGC_FP32_Matrix3x3* rotation_matrix, const BGC_FP32_Slerp3* slerp, const float phase)
+{
+ const float angle = slerp->radians * phase;
+ const float cosine = cosf(angle);
+ const float sine = sinf(angle);
+
+ BGC_FP32_Quaternion q;
+
+ bgc_fp32_quaternion_multiply_by_real(&q, &slerp->_cosine_weight, cosine);
+ bgc_fp32_quaternion_add_scaled(&q, &q, &slerp->_sine_weight, sine);
+
+ bgc_fp32_quaternion_get_rotation_matrix(rotation_matrix, &q);
+}
+
+inline void bgc_fp64_slerp_get_phase_rotation_matrix(BGC_FP64_Matrix3x3* rotation_matrix, const BGC_FP64_Slerp3* slerp, const double phase)
+{
+ const double angle = slerp->radians * phase;
+ const double cosine = cos(angle);
+ const double sine = sin(angle);
+
+ BGC_FP64_Quaternion q;
+
+ bgc_fp64_quaternion_multiply_by_real(&q, &slerp->_cosine_weight, cosine);
+ bgc_fp64_quaternion_add_scaled(&q, &q, &slerp->_sine_weight, sine);
+
+ bgc_fp64_quaternion_get_rotation_matrix(rotation_matrix, &q);
+}
+
+// ========== Get Phase Reverse Matrix ========== //
+
+inline void bgc_fp32_slerp_get_phase_reverse_matrix(BGC_FP32_Matrix3x3* reverse_matrix, const BGC_FP32_Slerp3* slerp, const float phase)
+{
+ const float angle = slerp->radians * phase;
+ const float cosine = cosf(angle);
+ const float sine = sinf(angle);
+
+ BGC_FP32_Quaternion q;
+
+ bgc_fp32_quaternion_multiply_by_real(&q, &slerp->_cosine_weight, cosine);
+ bgc_fp32_quaternion_add_scaled(&q, &q, &slerp->_sine_weight, sine);
+
+ bgc_fp32_quaternion_get_reverse_matrix(reverse_matrix, &q);
+}
+
+inline void bgc_fp64_slerp_get_phase_reverse_matrix(BGC_FP64_Matrix3x3* reverse_matrix, const BGC_FP64_Slerp3* slerp, const double phase)
+{
+ const double angle = slerp->radians * phase;
+ const double cosine = cos(angle);
+ const double sine = sin(angle);
+
+ BGC_FP64_Quaternion q;
+
+ bgc_fp64_quaternion_multiply_by_real(&q, &slerp->_cosine_weight, cosine);
+ bgc_fp64_quaternion_add_scaled(&q, &q, &slerp->_sine_weight, sine);
+
+ bgc_fp64_quaternion_get_reverse_matrix(reverse_matrix, &q);
+}
+
+// ========== Get Phase Both Matrices =========== //
+
+inline void bgc_fp32_slerp_get_phase_both_matrices(BGC_FP32_Matrix3x3* rotation_matrix, BGC_FP32_Matrix3x3* reverse_matrix, const BGC_FP32_Slerp3* slerp, const float phase)
+{
+ const float angle = slerp->radians * phase;
+ const float cosine = cosf(angle);
+ const float sine = sinf(angle);
+
+ BGC_FP32_Quaternion q;
+
+ bgc_fp32_quaternion_multiply_by_real(&q, &slerp->_cosine_weight, cosine);
+ bgc_fp32_quaternion_add_scaled(&q, &q, &slerp->_sine_weight, sine);
+
+ bgc_fp32_quaternion_get_both_matrices(rotation_matrix, reverse_matrix, &q);
+}
+
+inline void bgc_fp64_slerp_get_phase_both_matrices(BGC_FP64_Matrix3x3* rotation_matrix, BGC_FP64_Matrix3x3* reverse_matrix, const BGC_FP64_Slerp3* slerp, const double phase)
+{
+ const double angle = slerp->radians * phase;
+ const double cosine = cos(angle);
+ const double sine = sin(angle);
+
+ BGC_FP64_Quaternion q;
+
+ bgc_fp64_quaternion_multiply_by_real(&q, &slerp->_cosine_weight, cosine);
+ bgc_fp64_quaternion_add_scaled(&q, &q, &slerp->_sine_weight, sine);
+
+ bgc_fp64_quaternion_get_both_matrices(rotation_matrix, reverse_matrix, &q);
+}
+
+#endif
diff --git a/basic-geometry/types.h b/basic-geometry/types.h
index 812ecff..1a15a4f 100644
--- a/basic-geometry/types.h
+++ b/basic-geometry/types.h
@@ -145,23 +145,41 @@ typedef struct {
BGC_FP64_Quaternion _versor;
} BGC_FP64_Turn3;
-// ================ Turn3 Slerp ================= //
+// =================== Slerp3 =================== //
typedef struct {
- float _s0_cos_weight, _s0_sin_weight;
- float _x1_cos_weight, _x1_sin_weight;
- float _x2_cos_weight, _x2_sin_weight;
- float _x3_cos_weight, _x3_sin_weight;
+ BGC_FP32_Quaternion _cosine_weight, _sine_weight;
float radians;
-} BGC_FP32_Turn3Slerp;
+} BGC_FP32_Slerp3;
typedef struct {
- double _s0_cos_weight, _s0_sin_weight;
- double _x1_cos_weight, _x1_sin_weight;
- double _x2_cos_weight, _x2_sin_weight;
- double _x3_cos_weight, _x3_sin_weight;
+ BGC_FP64_Quaternion _cosine_weight, _sine_weight;
double radians;
-} BGC_FP64_Turn3Slerp;
+} BGC_FP64_Slerp3;
+
+// ================= Position2 ================== //
+
+typedef struct {
+ BGC_FP32_Turn2 turn;
+ BGC_FP32_Vector2 shift;
+} BGC_FP32_Position2;
+
+typedef struct {
+ BGC_FP64_Turn2 turn;
+ BGC_FP64_Vector2 shift;
+} BGC_FP64_Position2;
+
+// ================= Position3 ================== //
+
+typedef struct {
+ BGC_FP32_Turn3 turn;
+ BGC_FP32_Vector3 shift;
+} BGC_FP32_Position3;
+
+typedef struct {
+ BGC_FP64_Turn3 turn;
+ BGC_FP64_Vector3 shift;
+} BGC_FP64_Position3;
// =========== Homogeneous 3D Vector ============ //
@@ -169,13 +187,13 @@ typedef struct {
typedef struct
{
float x1, x2, x3, d0;
-} BGC_FP32_HgVector3;
+} BGC_FP32_HmgVector3;
// Homogeneous 3D Vector
typedef struct
{
double x1, x2, x3, d0;
-} BGC_FP64_HgVector3;
+} BGC_FP64_HmgVector3;
// =========== Homogeneous Matrix3x3 ============ //
@@ -186,7 +204,7 @@ typedef struct
float r2c1, r2c2, r2c3, r2d0;
float r3c1, r3c2, r3c3, r3d0;
float d0c1, d0c2, d0c3, d0d0;
-} BGC_FP32_HgMatrix3x3;
+} BGC_FP32_HmgMatrix3x3;
// Homogeneous Matrix3x3 based on double type
typedef struct
@@ -195,36 +213,36 @@ typedef struct
double r2c1, r2c2, r2c3, r2d0;
double r3c1, r3c2, r3c3, r3d0;
double d0c1, d0c2, d0c3, d0d0;
-} BGC_FP64_HgMatrix3x3;
+} BGC_FP64_HmgMatrix3x3;
-// ================ Dual Number ================= //
+// ================ Dual Scalar ================= //
typedef struct {
- float real, dual;
-} BGC_FP32_DualNumber;
+ float real_part, dual_part;
+} BGC_FP32_DualScalar;
typedef struct {
- double real, dual;
-} BGC_FP64_DualNumber;
+ double real_part, dual_part;
+} BGC_FP64_DualScalar;
// ================ Dual Vector ================= //
typedef struct {
- BGC_FP32_Vector3 real, dual;
+ BGC_FP32_Vector3 real_part, dual_part;
} BGC_FP32_DualVector3;
typedef struct {
- BGC_FP64_Vector3 real, dual;
+ BGC_FP64_Vector3 real_part, dual_part;
} BGC_FP64_DualVector3;
// ============== Dual Quaternion =============== //
typedef struct {
- BGC_FP32_Quaternion real, dual;
+ BGC_FP32_Quaternion real_part, dual_part;
} BGC_FP32_DualQuaternion;
typedef struct {
- BGC_FP64_Quaternion real, dual;
+ BGC_FP64_Quaternion real_part, dual_part;
} BGC_FP64_DualQuaternion;
-#endif // _BGC_MATRIX_TYPES_H_
+#endif