Отказ от терминов Versor и Cotes Number в пользу Turn3 и Turn2, использование кватернионов внутри Turn3

This commit is contained in:
Andrey Pokidov 2026-02-04 21:02:15 +07:00
parent 38cff7e27d
commit b470a3194b
27 changed files with 1815 additions and 2045 deletions

View file

@ -1,7 +1,7 @@
#ifndef _BGC_VERSOR_SLERP_H_
#define _BGC_VERSOR_SLERP_H_
#include "./versor.h"
#include "./turn3.h"
typedef struct {
float s0_cos_weight, s0_sin_weight;
@ -53,54 +53,54 @@ inline void bgc_fp64_slerp_reset(BGC_FP64_Slerp* slerp)
slerp->radians = 0.0;
}
void bgc_fp32_slerp_make(BGC_FP32_Slerp* slerp, const BGC_FP32_Versor* start, const BGC_FP32_Versor* augment);
void bgc_fp64_slerp_make(BGC_FP64_Slerp* slerp, const BGC_FP64_Versor* start, const BGC_FP64_Versor* augment);
void bgc_fp32_slerp_make(BGC_FP32_Slerp* slerp, const BGC_FP32_Turn3* start, const BGC_FP32_Turn3* augment);
void bgc_fp64_slerp_make(BGC_FP64_Slerp* slerp, const BGC_FP64_Turn3* start, const BGC_FP64_Turn3* augment);
inline void bgc_fp32_slerp_make_full(BGC_FP32_Slerp* slerp, const BGC_FP32_Versor* start, const BGC_FP32_Versor* end)
inline void bgc_fp32_slerp_make_full(BGC_FP32_Slerp* slerp, const BGC_FP32_Turn3* start, const BGC_FP32_Turn3* end)
{
BGC_FP32_Versor augment;
BGC_FP32_Turn3 augment;
bgc_fp32_versor_exclude(&augment, end, start);
bgc_fp32_turn3_exclude(&augment, end, start);
bgc_fp32_slerp_make(slerp, start, &augment);
}
inline void bgc_fp64_slerp_make_full(BGC_FP64_Slerp* slerp, const BGC_FP64_Versor* start, const BGC_FP64_Versor* end)
inline void bgc_fp64_slerp_make_full(BGC_FP64_Slerp* slerp, const BGC_FP64_Turn3* start, const BGC_FP64_Turn3* end)
{
BGC_FP64_Versor augment;
BGC_FP64_Turn3 augment;
bgc_fp64_versor_exclude(&augment, end, start);
bgc_fp64_turn3_exclude(&augment, end, start);
bgc_fp64_slerp_make(slerp, start, &augment);
}
inline void bgc_fp32_slerp_make_shortened(BGC_FP32_Slerp* slerp, const BGC_FP32_Versor* start, const BGC_FP32_Versor* end)
inline void bgc_fp32_slerp_make_shortened(BGC_FP32_Slerp* slerp, const BGC_FP32_Turn3* start, const BGC_FP32_Turn3* end)
{
BGC_FP32_Versor augment;
BGC_FP32_Turn3 augment;
bgc_fp32_versor_exclude(&augment, end, start);
bgc_fp32_versor_shorten(&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_Slerp* slerp, const BGC_FP64_Versor* start, const BGC_FP64_Versor* end)
inline void bgc_fp64_slerp_make_shortened(BGC_FP64_Slerp* slerp, const BGC_FP64_Turn3* start, const BGC_FP64_Turn3* end)
{
BGC_FP64_Versor augment;
BGC_FP64_Turn3 augment;
bgc_fp64_versor_exclude(&augment, end, start);
bgc_fp64_versor_shorten(&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_Versor* versor, const BGC_FP32_Slerp* slerp, const float phase)
inline void bgc_fp32_slerp_get_phase_versor(BGC_FP32_Turn3* versor, const BGC_FP32_Slerp* slerp, const float phase)
{
const float angle = slerp->radians * phase;
const float cosine = cosf(angle);
const float sine = sinf(angle);
bgc_fp32_versor_make(
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,
@ -109,13 +109,13 @@ inline void bgc_fp32_slerp_get_phase_versor(BGC_FP32_Versor* versor, const BGC_F
);
}
inline void bgc_fp64_slerp_get_phase_versor(BGC_FP64_Versor* versor, const BGC_FP64_Slerp* slerp, const double phase)
inline void bgc_fp64_slerp_get_phase_versor(BGC_FP64_Turn3* versor, const BGC_FP64_Slerp* slerp, const double phase)
{
const double angle = slerp->radians * phase;
const double cosine = cos(angle);
const double sine = sin(angle);
bgc_fp64_versor_make(
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,