From aae46c3fe521c52ac40dad12f1b61ca4e6a4b00f Mon Sep 17 00:00:00 2001 From: Andrey Pokidov Date: Fri, 17 Apr 2026 23:03:08 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A4=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B2=D1=8B=D1=87=D0=B8=D1=81=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B4=D0=BB=D0=B8=D0=BD=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D0=B4?= =?UTF-8?q?=D1=83=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20=D0=B2=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic-geometry/dual-vector3.c | 6 +++++ basic-geometry/dual-vector3.h | 48 +++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/basic-geometry/dual-vector3.c b/basic-geometry/dual-vector3.c index 54bca52..fd7f61e 100644 --- a/basic-geometry/dual-vector3.c +++ b/basic-geometry/dual-vector3.c @@ -3,6 +3,12 @@ extern inline void bgc_fp32_dual_vector3_reset(BGC_FP32_DualVector3* const vector); extern inline void bgc_fp64_dual_vector3_reset(BGC_FP64_DualVector3* const vector); +extern inline void bgc_fp32_dual_vector3_get_squared_length(BGC_FP32_DualNumber* const squared_length, const BGC_FP32_DualVector3* const vector); +extern inline void bgc_fp64_dual_vector3_get_squared_length(BGC_FP64_DualNumber* const squared_length, const BGC_FP64_DualVector3* const vector); + +extern inline void bgc_fp32_dual_vector3_get_length(BGC_FP32_DualNumber* const length, const BGC_FP32_DualVector3* const vector); +extern inline void bgc_fp64_dual_vector3_get_length(BGC_FP64_DualNumber* const length, const BGC_FP64_DualVector3* const vector); + extern inline void bgc_fp32_dual_vector3_copy(BGC_FP32_DualVector3* const destination, const BGC_FP32_DualVector3* const source); extern inline void bgc_fp64_dual_vector3_copy(BGC_FP64_DualVector3* const destination, const BGC_FP64_DualVector3* const source); diff --git a/basic-geometry/dual-vector3.h b/basic-geometry/dual-vector3.h index 9033cf4..7ddf740 100644 --- a/basic-geometry/dual-vector3.h +++ b/basic-geometry/dual-vector3.h @@ -18,6 +18,54 @@ inline void bgc_fp64_dual_vector3_reset(BGC_FP64_DualVector3* const vector) bgc_fp64_vector3_reset(&vector->dual_part); } +// =============== Squared Length =============== // + +inline void bgc_fp32_dual_vector3_get_squared_length(BGC_FP32_DualNumber* const squared_length, const BGC_FP32_DualVector3* const vector) +{ + squared_length->real_part = bgc_fp32_vector3_get_squared_length(&vector->real_part); + squared_length->dual_part = 2.0f * bgc_fp32_vector3_get_dot_product(&vector->real_part, &vector->dual_part); +} + +inline void bgc_fp64_dual_vector3_get_squared_length(BGC_FP64_DualNumber* const squared_length, const BGC_FP64_DualVector3* const vector) +{ + squared_length->real_part = bgc_fp64_vector3_get_squared_length(&vector->real_part); + squared_length->dual_part = 2.0 * bgc_fp64_vector3_get_dot_product(&vector->real_part, &vector->dual_part); +} + +// =================== Length =================== // + +inline void bgc_fp32_dual_vector3_get_length(BGC_FP32_DualNumber* const length, const BGC_FP32_DualVector3* const vector) +{ + const float square_real_part = bgc_fp32_vector3_get_squared_length(&vector->real_part); + + if (square_real_part <= BGC_FP32_SQUARE_EPSILON) { + length->real_part = 0.0f; + length->dual_part = 0.0f; + return; + } + + const float real_part = sqrtf(square_real_part); + + length->real_part = real_part; + length->dual_part = bgc_fp32_vector3_get_dot_product(&vector->real_part, &vector->dual_part) / real_part; +} + +inline void bgc_fp64_dual_vector3_get_length(BGC_FP64_DualNumber* const length, const BGC_FP64_DualVector3* const vector) +{ + const double square_real_part = bgc_fp64_vector3_get_squared_length(&vector->real_part); + + if (square_real_part <= BGC_FP64_SQUARE_EPSILON) { + length->real_part = 0.0; + length->dual_part = 0.0; + return; + } + + const double real_part = sqrt(square_real_part); + + length->real_part = real_part; + length->dual_part = bgc_fp64_vector3_get_dot_product(&vector->real_part, &vector->dual_part) / real_part; +} + // ==================== Copy ==================== // inline void bgc_fp32_dual_vector3_copy(BGC_FP32_DualVector3* const destination, const BGC_FP32_DualVector3* const source)