Переделка методов turn3_find_direction_difference, возврат функций матриц поворота для turn3

This commit is contained in:
Andrey Pokidov 2026-02-07 02:53:21 +07:00
parent 2ce4b64ca3
commit 78d1661c5d
2 changed files with 198 additions and 106 deletions

View file

Internal server error - Personal Git Server: Beyond coding. We Forge.

500

Internal server error

Forgejo version: 11.0.1+gitea-1.22.0

@ -201,92 +201,95 @@ void bgc_fp64_turn3_set_rotation(BGC_FP64_Turn3* turn, const double x1, const do
} }
} }
// ========= Make Direction Difference ========== // // ========= Find Direction Difference ========== //
static int _bgc_fp32_turn3_make_direction_turn(BGC_FP32_Turn3* turn, const BGC_FP32_Vector3* start, const BGC_FP32_Vector3* end, const float square_modulus_product) int bgc_fp32_turn3_find_direction_difference(BGC_FP32_Turn3* turn, const BGC_FP32_Vector3* first, const BGC_FP32_Vector3* second)
{ {
BGC_FP32_Vector3 orthogonal_axis; const float first_square_modulus = bgc_fp32_vector3_get_square_modulus(first);
bgc_fp32_vector3_get_cross_product(&orthogonal_axis, start, end);
const float scalar_product = bgc_fp32_vector3_get_dot_product(start, end);
const float square_modulus = bgc_fp32_vector3_get_square_modulus(&orthogonal_axis);
const float square_sine = square_modulus / square_modulus_product;
if (square_sine > BGC_FP32_SQUARE_EPSILON) {
const float cosine = scalar_product / sqrtf(square_modulus_product);
const float angle = 0.5f * atan2f(sqrtf(square_sine), cosine);
const float multiplier = sinf(angle) * sqrtf(1.0f / square_modulus);
bgc_fp32_turn3_set_raw_values(turn, cosf(angle), orthogonal_axis.x1 * multiplier, orthogonal_axis.x2 * multiplier, orthogonal_axis.x3 * multiplier);
return BGC_SOME_TURN;
}
if (scalar_product < 0.0f) {
return BGC_OPPOSITE;
}
bgc_fp32_turn3_reset(turn); bgc_fp32_turn3_reset(turn);
return BGC_ZERO_TURN; if (first_square_modulus <= BGC_FP32_SQUARE_EPSILON) {
return BGC_ERROR_TURN3_FIRST_VECTOR_ZERO;
}
const float second_square_modulus = bgc_fp32_vector3_get_square_modulus(second);
if (second_square_modulus <= BGC_FP32_SQUARE_EPSILON) {
return BGC_ERROR_TURN3_SECOND_VECTOR_ZERO;
}
BGC_FP32_Vector3 axis;
bgc_fp32_vector3_get_cross_product(&axis, first, second);
const float square_product = first_square_modulus * second_square_modulus;
const float dot_product = bgc_fp32_vector3_get_dot_product(first, second);
const float axis_square_modulus = bgc_fp32_vector3_get_square_modulus(&axis);
if (axis_square_modulus <= BGC_FP32_SQUARE_EPSILON * square_product) {
if (dot_product < 0.0f) {
return BGC_ERROR_TURN3_VECTORS_OPPOSITE;
}
return BGC_SUCCESS;
}
const float axis_modulus = sqrtf(axis_square_modulus);
const float trigonometry_fix = sqrtf(1.0f / square_product);
const float angle = 0.5f * atan2f(axis_modulus * trigonometry_fix, dot_product * trigonometry_fix);