Развитие дуальный чисел, векторов и кватернионов, а также гомогенных векторов и матриц
This commit is contained in:
parent
3f96b661a9
commit
b87518cd3f
21 changed files with 1787 additions and 1511 deletions
|
|
@ -64,6 +64,22 @@
|
|||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="cotes-number.h" />
|
||||
<Unit filename="dual-number.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="dual-number.h" />
|
||||
<Unit filename="dual-quaternion.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="dual-quaternion.h" />
|
||||
<Unit filename="dual-vector3.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="dual-vector3.h" />
|
||||
<Unit filename="hg-matrix3x3.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="hg-matrix3x3.h" />
|
||||
<Unit filename="hg-vector3.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
|
|
|
|||
|
|
@ -250,36 +250,36 @@ inline void bgc_fp64_cotes_number_exclude(BGC_FP64_CotesNumber* difference, cons
|
|||
|
||||
inline void bgc_fp32_cotes_number_get_rotation_matrix(BGC_FP32_Matrix2x2* matrix, const BGC_FP32_CotesNumber* number)
|
||||
{
|
||||
matrix->row1_col1 = number->_cos;
|
||||
matrix->row1_col2 = -number->_sin;
|
||||
matrix->row2_col1 = number->_sin;
|
||||
matrix->row2_col2 = number->_cos;
|
||||
matrix->r1c1 = number->_cos;
|
||||
matrix->r1c2 = -number->_sin;
|
||||
matrix->r2c1 = number->_sin;
|
||||
matrix->r2c2 = number->_cos;
|
||||
}
|
||||
|
||||
inline void bgc_fp64_cotes_number_get_rotation_matrix(BGC_FP64_Matrix2x2* matrix, const BGC_FP64_CotesNumber* number)
|
||||
{
|
||||
matrix->row1_col1 = number->_cos;
|
||||
matrix->row1_col2 = -number->_sin;
|
||||
matrix->row2_col1 = number->_sin;
|
||||
matrix->row2_col2 = number->_cos;
|
||||
matrix->r1c1 = number->_cos;
|
||||
matrix->r1c2 = -number->_sin;
|
||||
matrix->r2c1 = number->_sin;
|
||||
matrix->r2c2 = number->_cos;
|
||||
}
|
||||
|
||||
// ============== Reverse Matrix ================ //
|
||||
|
||||
inline void bgc_fp32_cotes_number_get_reverse_matrix(BGC_FP32_Matrix2x2* matrix, const BGC_FP32_CotesNumber* number)
|
||||
{
|
||||
matrix->row1_col1 = number->_cos;
|
||||
matrix->row1_col2 = number->_sin;
|
||||
matrix->row2_col1 = -number->_sin;
|
||||
matrix->row2_col2 = number->_cos;
|
||||
matrix->r1c1 = number->_cos;
|
||||
matrix->r1c2 = number->_sin;
|
||||
matrix->r2c1 = -number->_sin;
|
||||
matrix->r2c2 = number->_cos;
|
||||
}
|
||||
|
||||
inline void bgc_fp64_cotes_number_get_reverse_matrix(BGC_FP64_Matrix2x2* matrix, const BGC_FP64_CotesNumber* number)
|
||||
{
|
||||
matrix->row1_col1 = number->_cos;
|
||||
matrix->row1_col2 = number->_sin;
|
||||
matrix->row2_col1 = -number->_sin;
|
||||
matrix->row2_col2 = number->_cos;
|
||||
matrix->r1c1 = number->_cos;
|
||||
matrix->r1c2 = number->_sin;
|
||||
matrix->r2c1 = -number->_sin;
|
||||
matrix->r2c2 = number->_cos;
|
||||
}
|
||||
|
||||
// ================ Turn Vector ================= //
|
||||
|
|
|
|||
|
|
@ -11,3 +11,24 @@ inline void bgc_fp64_dual_number_copy(BGC_FP64_DualNumber* destination, const BG
|
|||
|
||||
inline void bgc_fp32_dual_number_swap(BGC_FP32_DualNumber* first, BGC_FP32_DualNumber* second);
|
||||
inline void bgc_fp64_dual_number_swap(BGC_FP64_DualNumber* first, BGC_FP64_DualNumber* second);
|
||||
|
||||
inline void bgc_fp32_dual_number_add(BGC_FP32_DualNumber* sum, const BGC_FP32_DualNumber* first, const BGC_FP32_DualNumber* second);
|
||||
inline void bgc_fp64_dual_number_add(BGC_FP64_DualNumber* sum, const BGC_FP64_DualNumber* first, const BGC_FP64_DualNumber* second);
|
||||
|
||||
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);
|
||||
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);
|
||||
|
||||
inline void bgc_fp32_dual_number_subtract(BGC_FP32_DualNumber* difference, const BGC_FP32_DualNumber* minuend, const BGC_FP32_DualNumber* subtrahend);
|
||||
inline void bgc_fp64_dual_number_subtract(BGC_FP64_DualNumber* difference, const BGC_FP64_DualNumber* minuend, const BGC_FP64_DualNumber* subtrahend);
|
||||
|
||||
inline void bgc_fp32_dual_number_multiply(BGC_FP32_DualNumber* product, const BGC_FP32_DualNumber* multiplicand, const float multiplier);
|
||||
inline void bgc_fp64_dual_number_multiply(BGC_FP64_DualNumber* product, const BGC_FP64_DualNumber* multiplicand, const double multiplier);
|
||||
|
||||
inline void bgc_fp32_dual_number_divide(BGC_FP32_DualNumber* quotient, const BGC_FP32_DualNumber* dividend, const float divisor);
|
||||
inline void bgc_fp64_dual_number_divide(BGC_FP64_DualNumber* quotient, const BGC_FP64_DualNumber* dividend, const double divisor);
|
||||
|
||||
inline void bgc_fp32_dual_number_get_mean2(BGC_FP32_DualNumber* mean, const BGC_FP32_DualNumber* first, const BGC_FP32_DualNumber* second);
|
||||
inline void bgc_fp64_dual_number_get_mean2(BGC_FP64_DualNumber* mean, const BGC_FP64_DualNumber* first, const BGC_FP64_DualNumber* second);
|
||||
|
||||
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);
|
||||
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);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef _BGC_DUAL_NUMBER_H_
|
||||
#define _BGC_DUAL_NUMBER_H_
|
||||
|
||||
#include "utilities.h"
|
||||
|
||||
// =================== Types ==================== //
|
||||
|
||||
typedef struct {
|
||||
|
|
@ -67,4 +69,100 @@ inline void bgc_fp64_dual_number_swap(BGC_FP64_DualNumber* first, BGC_FP64_DualN
|
|||
first->dual = second->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(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(BGC_FP64_DualNumber* product, const BGC_FP64_DualNumber* multiplicand, const double multiplier)
|
||||
{
|
||||
product->real = multiplicand->real * multiplier;
|
||||
product->dual = multiplicand->dual * multiplier;
|
||||
}
|
||||
|
||||
// =================== Divide =================== //
|
||||
|
||||
inline void bgc_fp32_dual_number_divide(BGC_FP32_DualNumber* quotient, const BGC_FP32_DualNumber* dividend, const float divisor)
|
||||
{
|
||||
bgc_fp32_dual_number_multiply(quotient, dividend, 1.0f / divisor);
|
||||
}
|
||||
|
||||
inline void bgc_fp64_dual_number_divide(BGC_FP64_DualNumber* quotient, const BGC_FP64_DualNumber* dividend, const double divisor)
|
||||
{
|
||||
bgc_fp64_dual_number_multiply(quotient, dividend, 1.0 / divisor);
|
||||
}
|
||||
|
||||
// ================ 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;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
10
basic-geometry/dual-quaternion.c
Normal file
10
basic-geometry/dual-quaternion.c
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
#include "dual-quaternion.h"
|
||||
|
||||
extern inline void bgc_fp32_dual_quaternion_reset(BGC_FP32_DualQuaternion* quaternion);
|
||||
extern inline void bgc_fp64_dual_quaternion_reset(BGC_FP64_DualQuaternion* quaternion);
|
||||
|
||||
extern inline void bgc_fp32_dual_quaternion_copy(BGC_FP32_DualQuaternion* destination, const BGC_FP32_DualQuaternion* source);
|
||||
extern inline void bgc_fp64_dual_quaternion_copy(BGC_FP64_DualQuaternion* destination, const BGC_FP64_DualQuaternion* source);
|
||||
|
||||
extern inline void bgc_fp32_dual_quaternion_swap(BGC_FP32_DualQuaternion* first, BGC_FP32_DualQuaternion* second);
|
||||
extern inline void bgc_fp64_dual_quaternion_swap(BGC_FP64_DualQuaternion* first, BGC_FP64_DualQuaternion* second);
|
||||
58
basic-geometry/dual-quaternion.h
Normal file
58
basic-geometry/dual-quaternion.h
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
#ifndef _BGC_DUAL_QUATERNION_H_
|
||||
#define _BGC_DUAL_QUATERNION_H_
|
||||
|
||||
#include "quaternion.h"
|
||||
|
||||
// =================== Types ==================== //
|
||||
|
||||
typedef struct {
|
||||
BGC_FP32_Quaternion real, dual;
|
||||
} BGC_FP32_DualQuaternion;
|
||||
|
||||
typedef struct {
|
||||
BGC_FP64_Quaternion real, dual;
|
||||
} BGC_FP64_DualQuaternion;
|
||||
|
||||
// =================== Reset ==================== //
|
||||
|
||||
inline void bgc_fp32_dual_quaternion_reset(BGC_FP32_DualQuaternion* quaternion)
|
||||
{
|
||||
bgc_fp32_quaternion_reset(&quaternion->real);
|
||||
bgc_fp32_quaternion_reset(&quaternion->dual);
|
||||
}
|
||||
|
||||
inline void bgc_fp64_dual_quaternion_reset(BGC_FP64_DualQuaternion* quaternion)
|
||||
{
|
||||
bgc_fp64_quaternion_reset(&quaternion->real);
|
||||
bgc_fp64_quaternion_reset(&quaternion->dual);
|
||||
}
|
||||
|
||||
// ==================== 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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
// ==================== 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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -1,22 +1,34 @@
|
|||
#include "./dual-vector3.h"
|
||||
|
||||
inline void bgc_fp32_dual_vector3_reset(BGC_FP32_DualVector3* vector);
|
||||
inline void bgc_fp64_dual_vector3_reset(BGC_FP64_DualVector3* vector);
|
||||
extern inline void bgc_fp32_dual_vector3_reset(BGC_FP32_DualVector3* vector);
|
||||
extern inline void bgc_fp64_dual_vector3_reset(BGC_FP64_DualVector3* vector);
|
||||
|
||||
inline void bgc_fp32_dual_vector3_make(BGC_FP32_DualVector3* vector, const BGC_FP32_Vector3* real, const BGC_FP32_Vector3* dual);
|
||||
inline void bgc_fp64_dual_vector3_make(BGC_FP64_DualVector3* vector, const BGC_FP64_Vector3* real, const BGC_FP64_Vector3* dual);
|
||||
extern inline void bgc_fp32_dual_vector3_make(BGC_FP32_DualVector3* vector, const BGC_FP32_Vector3* real, const BGC_FP32_Vector3* dual);
|
||||
extern inline void bgc_fp64_dual_vector3_make(BGC_FP64_DualVector3* vector, const BGC_FP64_Vector3* real, const BGC_FP64_Vector3* dual);
|
||||
|
||||
inline void bgc_fp32_dual_vector3_set_real_values(BGC_FP32_DualVector3* vector, const float x1, const float x2, const float x3);
|
||||
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_copy(BGC_FP32_DualVector3* destination, const BGC_FP32_DualVector3* source);
|
||||
extern inline void bgc_fp64_dual_vector3_copy(BGC_FP64_DualVector3* destination, const BGC_FP64_DualVector3* source);
|
||||
|
||||
inline void bgc_fp32_dual_vector3_set_dual_values(BGC_FP32_DualVector3* vector, const float x1, const float x2, const float x3);
|
||||
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_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);
|
||||
|
||||
inline void bgc_fp32_dual_vector3_add(BGC_FP32_DualVector3* sum, const BGC_FP32_DualVector3* first, const BGC_FP32_DualVector3* second);
|
||||
inline void bgc_fp64_dual_vector3_add(BGC_FP64_DualVector3* sum, const BGC_FP64_DualVector3* first, const 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);
|
||||
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
|
||||
inline void bgc_fp32_dual_vector3_subtract(BGC_FP32_DualVector3* difference, const BGC_FP32_DualVector3* minuend, const BGC_FP32_DualVector3* subtrahend);
|
||||
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_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);
|
||||
|
||||
extern 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);
|
||||
extern 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);
|
||||
|
||||
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_divide(BGC_FP32_DualVector3* quotient, const BGC_FP32_DualVector3* dividend, const float divisor);
|
||||
extern inline void bgc_fp64_dual_vector3_divide(BGC_FP64_DualVector3* quotient, const BGC_FP64_DualVector3* dividend, const double divisor);
|
||||
|
|
|
|||
|
|
@ -41,6 +41,34 @@ inline void bgc_fp64_dual_vector3_make(BGC_FP64_DualVector3* vector, const BGC_F
|
|||
bgc_fp64_vector3_copy(&vector->dual, dual);
|
||||
}
|
||||
|
||||
// ==================== 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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
// ==================== 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);
|
||||
}
|
||||
|
||||
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)
|
||||
|
|
@ -115,6 +143,32 @@ inline void bgc_fp64_dual_vector3_subtract(BGC_FP64_DualVector3* difference, con
|
|||
bgc_fp64_vector3_subtract(&difference->dual, &minuend->dual, &subtrahend->dual);
|
||||
}
|
||||
|
||||
// ================== Multiply ================== //
|
||||
|
||||
inline void bgc_fp32_dual_vector3_multiply(BGC_FP32_DualVector3* product, const BGC_FP32_DualVector3* multiplicand, const float multiplier)
|
||||
{
|
||||
bgc_fp32_vector3_multiply(&product->real, &multiplicand->real, multiplier);
|
||||
bgc_fp32_vector3_multiply(&product->dual, &multiplicand->dual, multiplier);
|
||||
}
|
||||
|
||||
inline void bgc_fp64_dual_vector3_multiply(BGC_FP64_DualVector3* product, const BGC_FP64_DualVector3* multiplicand, const double multiplier)
|
||||
{
|
||||
bgc_fp64_vector3_multiply(&product->real, &multiplicand->real, multiplier);
|
||||
bgc_fp64_vector3_multiply(&product->dual, &multiplicand->dual, multiplier);
|
||||
}
|
||||
|
||||
// =================== Divide =================== //
|
||||
|
||||
inline void bgc_fp32_dual_vector3_divide(BGC_FP32_DualVector3* quotient, const BGC_FP32_DualVector3* dividend, const float divisor)
|
||||
{
|
||||
bgc_fp32_dual_vector3_multiply(quotient, dividend, 1.0f / divisor);
|
||||
}
|
||||
|
||||
inline void bgc_fp64_dual_vector3_divide(BGC_FP64_DualVector3* quotient, const BGC_FP64_DualVector3* dividend, const double divisor)
|
||||
{
|
||||
bgc_fp64_dual_vector3_multiply(quotient, dividend, 1.0 / divisor);
|
||||
}
|
||||
|
||||
// ================== Average2 ================== //
|
||||
|
||||
inline void bgc_fp32_dual_vector3_get_mean2(BGC_FP32_DualVector3* mean, const BGC_FP32_DualVector3* vector1, const BGC_FP32_DualVector3* vector2)
|
||||
|
|
@ -133,14 +187,14 @@ inline void bgc_fp64_dual_vector3_get_mean2(BGC_FP64_DualVector3* mean, const BG
|
|||
|
||||
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_mean2(&mean->real, &vector1->real, &vector2->real, &vector3->real);
|
||||
bgc_fp32_vector3_get_mean2(&mean->dual, &vector1->dual, &vector2->dual, &vector3->dual);
|
||||
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);
|
||||
}
|
||||
|
||||
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_mean2(&mean->real, &vector1->real, &vector2->real, &vector3->real);
|
||||
bgc_fp64_vector3_get_mean2(&mean->dual, &vector1->dual, &vector2->dual, &vector3->dual);
|
||||
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);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,10 +0,0 @@
|
|||
#include "dual-versor.h"
|
||||
|
||||
extern inline void bgc_fp32_dual_versor_reset(BGC_FP32_DualVersor* number);
|
||||
extern inline void bgc_fp64_dual_versor_reset(BGC_FP64_DualVersor* number);
|
||||
|
||||
extern inline void bgc_fp32_dual_versor_copy(BGC_FP32_DualVersor* destination, const BGC_FP32_DualVersor* source);
|
||||
extern inline void bgc_fp64_dual_versor_copy(BGC_FP64_DualVersor* destination, const BGC_FP64_DualVersor* source);
|
||||
|
||||
extern inline void bgc_fp32_dual_versor_swap(BGC_FP32_DualVersor* first, BGC_FP32_DualVersor* second);
|
||||
extern inline void bgc_fp64_dual_versor_swap(BGC_FP64_DualVersor* first, BGC_FP64_DualVersor* second);
|
||||
|
|
@ -1,147 +0,0 @@
|
|||
#ifndef _BGC_DUAL_VERSOR_H_
|
||||
#define _BGC_DUAL_VERSOR_H_
|
||||
|
||||
// =================== Types ==================== //
|
||||
|
||||
typedef struct {
|
||||
struct {
|
||||
float s0, x1, x2, x3;
|
||||
} _real, _dual;
|
||||
} BGC_FP32_DualVersor;
|
||||
|
||||
typedef struct {
|
||||
struct {
|
||||
double s0, x1, x2, x3;
|
||||
} _real, _dual;
|
||||
} BGC_FP64_DualVersor;
|
||||
|
||||
// =================== Reset ==================== //
|
||||
|
||||
inline void bgc_fp32_dual_versor_reset(BGC_FP32_DualVersor* number)
|
||||
{
|
||||
number->_real.s0 = 1.0f;
|
||||
number->_real.x1 = 0.0f;
|
||||
number->_real.x2 = 0.0f;
|
||||
number->_real.x3 = 0.0f;
|
||||
|
||||
number->_dual.s0 = 0.0f;
|
||||
number->_dual.x1 = 0.0f;
|
||||
number->_dual.x2 = 0.0f;
|
||||
number->_dual.x3 = 0.0f;
|
||||
}
|
||||
|
||||
inline void bgc_fp64_dual_versor_reset(BGC_FP64_DualVersor* number)
|
||||
{
|
||||
number->_real.s0 = 1.0f;
|
||||
number->_real.x1 = 0.0f;
|
||||
number->_real.x2 = 0.0f;
|
||||
number->_real.x3 = 0.0f;
|
||||
|
||||
number->_dual.s0 = 0.0f;
|
||||
number->_dual.x1 = 0.0f;
|
||||
number->_dual.x2 = 0.0f;
|
||||
number->_dual.x3 = 0.0f;
|
||||
}
|
||||
|
||||
// ==================== Copy ==================== //
|
||||
|
||||
inline void bgc_fp32_dual_versor_copy(BGC_FP32_DualVersor* destination, const BGC_FP32_DualVersor* source)
|
||||
{
|
||||
destination->_real.s0 = source->_real.s0;
|
||||
destination->_real.x1 = source->_real.x1;
|
||||
destination->_real.x2 = source->_real.x2;
|
||||
destination->_real.x3 = source->_real.x3;
|
||||
|
||||
destination->_dual.s0 = source->_dual.s0;
|
||||
destination->_dual.x1 = source->_dual.x1;
|
||||
destination->_dual.x2 = source->_dual.x2;
|
||||
destination->_dual.x3 = source->_dual.x3;
|
||||
}
|
||||
|
||||
inline void bgc_fp64_dual_versor_copy(BGC_FP64_DualVersor* destination, const BGC_FP64_DualVersor* source)
|
||||
{
|
||||
destination->_real.s0 = source->_real.s0;
|
||||
destination->_real.x1 = source->_real.x1;
|
||||
destination->_real.x2 = source->_real.x2;
|
||||
destination->_real.x3 = source->_real.x3;
|
||||
|
||||
destination->_dual.s0 = source->_dual.s0;
|
||||
destination->_dual.x1 = source->_dual.x1;
|
||||
destination->_dual.x2 = source->_dual.x2;
|
||||
destination->_dual.x3 = source->_dual.x3;
|
||||
}
|
||||
|
||||
// ==================== Swap ==================== //
|
||||
|
||||
inline void bgc_fp32_dual_versor_swap(BGC_FP32_DualVersor* first, BGC_FP32_DualVersor* second)
|
||||
{
|
||||
// Real
|
||||
float s0 = second->_real.s0;
|
||||
float x1 = second->_real.x1;
|
||||
float x2 = second->_real.x2;
|
||||
float x3 = second->_real.x3;
|
||||
|
||||
second->_real.s0 = first->_real.s0;
|
||||
second->_real.x1 = first->_real.x1;
|
||||