Уменшение количества внутренних методов за счёт методов получения матрицы поворота для веросора; исправления в методах проверки матрицы поворота; добавление методов вычисления поворота (turn3) по матрице поворота 3x3

This commit is contained in:
Andrey Pokidov 2026-04-03 02:22:11 +07:00
parent abf99a7126
commit 54c762da14
9 changed files with 448 additions and 351 deletions

View file

@ -21,6 +21,8 @@
<ItemGroup> <ItemGroup>
<ClCompile Include="main.c" /> <ClCompile Include="main.c" />
<ClCompile Include="affine3.c" /> <ClCompile Include="affine3.c" />
<ClCompile Include="printing_utils.c" />
<ClCompile Include="vector3_pair_difference.c" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\basic-geometry\basic-geometry.vcxproj"> <ProjectReference Include="..\basic-geometry\basic-geometry.vcxproj">
@ -29,6 +31,8 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="affine3.h" /> <ClInclude Include="affine3.h" />
<ClInclude Include="printing_utils.h" />
<ClInclude Include="vector3_pair_difference.h" />
</ItemGroup> </ItemGroup>
<PropertyGroup Label="Globals"> <PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion> <VCProjectVersion>16.0</VCProjectVersion>

View file

@ -21,10 +21,22 @@
<ClCompile Include="affine3.c"> <ClCompile Include="affine3.c">
<Filter>Исходные файлы</Filter> <Filter>Исходные файлы</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="printing_utils.c">
<Filter>Исходные файлы</Filter>
</ClCompile>
<ClCompile Include="vector3_pair_difference.c">
<Filter>Исходные файлы</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="affine3.h"> <ClInclude Include="affine3.h">
<Filter>Файлы заголовков</Filter> <Filter>Файлы заголовков</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="printing_utils.h">
<Filter>Файлы заголовков</Filter>
</ClInclude>
<ClInclude Include="vector3_pair_difference.h">
<Filter>Файлы заголовков</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>

View file

@ -9,7 +9,9 @@
#include <time.h> #include <time.h>
#endif // _WINDOWS_ #endif // _WINDOWS_
#include "printing_utils.h"
#include "vector3_pair_difference.h" #include "vector3_pair_difference.h"
#include "affine3.h"
typedef struct { typedef struct {
BGC_FP32_Turn3 versor1, versor2, result; BGC_FP32_Turn3 versor1, versor2, result;
@ -132,20 +134,56 @@ int main() {
} }
*/ */
void test_fp32_quaternion_set_matrix()
{
BGC_FP32_Turn3 turn;
BGC_FP32_Matrix3x3 rotation;
BGC_FP32_Quaternion quaternion;
bgc_fp32_turn3_set_rotation(&turn, 1.0f, 1.0f, 1.0f, 120.0f, BGC_ANGLE_UNIT_DEGREES);
#include "affine3.h" bgc_fp32_turn3_get_rotation_matrix(&rotation, &turn);
if (bgc_fp32_quaternion_set_rotation_matrix(&quaternion, &rotation) == BGC_FAILURE) {
printf("Failed\n");
return;
}
print_fp32_quaternion(&quaternion);
print_fp32_quaternion(&turn._versor);
}
void test_fp64_quaternion_set_matrix()
{
BGC_FP64_Turn3 turn;
BGC_FP64_Matrix3x3 rotation;
BGC_FP64_Quaternion quaternion;
bgc_fp64_turn3_set_rotation(&turn, 1.0, 1.0, 1.0, 120.0, BGC_ANGLE_UNIT_DEGREES);
bgc_fp64_turn3_get_rotation_matrix(&rotation, &turn);
if (bgc_fp64_quaternion_set_rotation_matrix(&quaternion, &rotation) == BGC_FAILURE) {
printf("Failed\n");
return;
}
print_fp64_quaternion(&quaternion);
print_fp64_quaternion(&turn._versor);
}
int main() int main()
{ {
//test_fp32_pair_difference(); //test_fp32_pair_difference();
test_fp64_pair_difference(); //test_fp64_pair_difference();
//printf("Affine3 performance test: %f\n", test_bgc_affine3_performance(10000000, 10)); //printf("Affine3 performance test: %f\n", test_bgc_affine3_performance(10000000, 10));
//printf("sizeof(BGC_FP32_Affine3) = %zu\n", sizeof(BGC_FP32_Affine3)); //printf("sizeof(BGC_FP32_Affine3) = %zu\n", sizeof(BGC_FP32_Affine3));
//printf("offsetof(shift) = %zu\n", offsetof(BGC_FP32_Affine3, shift)); //printf("offsetof(shift) = %zu\n", offsetof(BGC_FP32_Affine3, shift));
//printf("sizeof(BGC_FP32_Matrix3x3) = %zu\n", sizeof(BGC_FP32_Matrix3x3)); //printf("sizeof(BGC_FP32_Matrix3x3) = %zu\n", sizeof(BGC_FP32_Matrix3x3));
test_fp32_quaternion_set_matrix();
return 0; return 0;
} }

View file

@ -129,28 +129,20 @@ inline int bgc_fp64_matrix2x2_is_singular(const BGC_FP64_Matrix2x2* const matrix
inline int bgc_fp32_matrix2x2_is_rotation(const BGC_FP32_Matrix2x2* const matrix) inline int bgc_fp32_matrix2x2_is_rotation(const BGC_FP32_Matrix2x2* const matrix)
{ {
BGC_FP32_Matrix2x2 product; const float r1r1 = matrix->r1c1 * matrix->r1c1 + matrix->r1c2 * matrix->r1c2;
const float r1r2 = matrix->r1c1 * matrix->r2c1 + matrix->r1c2 * matrix->r2c2;
const float r2r2 = matrix->r2c1 * matrix->r2c1 + matrix->r2c2 * matrix->r2c2;
product.r1c1 = matrix->r1c1 * matrix->r1c1 + matrix->r1c2 * matrix->r2c1; return bgc_fp32_is_square_unit(r1r1) && bgc_fp32_is_square_unit(r2r2) && bgc_fp32_is_zero(r1r2);
product.r1c2 = matrix->r1c1 * matrix->r1c2 + matrix->r1c2 * matrix->r2c2;
product.r2c1 = matrix->r2c1 * matrix->r1c1 + matrix->r2c2 * matrix->r2c1;
product.r2c2 = matrix->r2c1 * matrix->r1c2 + matrix->r2c2 * matrix->r2c2;
return bgc_fp32_matrix2x2_is_identity(&product);
} }
inline int bgc_fp64_matrix2x2_is_rotation(const BGC_FP64_Matrix2x2* const matrix) inline int bgc_fp64_matrix2x2_is_rotation(const BGC_FP64_Matrix2x2* const matrix)
{ {
BGC_FP64_Matrix2x2 product; const double r1r1 = matrix->r1c1 * matrix->r1c1 + matrix->r1c2 * matrix->r1c2;
const double r1r2 = matrix->r1c1 * matrix->r2c1 + matrix->r1c2 * matrix->r2c2;
const double r2r2 = matrix->r2c1 * matrix->r2c1 + matrix->r2c2 * matrix->r2c2;
product.r1c1 = matrix->r1c1 * matrix->r1c1 + matrix->r1c2 * matrix->r2c1; return bgc_fp64_is_square_unit(r1r1) && bgc_fp64_is_square_unit(r2r2) && bgc_fp64_is_zero(r1r2);
product.r1c2 = matrix->r1c1 * matrix->r1c2 + matrix->r1c2 * matrix->r2c2;
product.r2c1 = matrix->r2c1 * matrix->r1c1 + matrix->r2c2 * matrix->r2c1;
product.r2c2 = matrix->r2c1 * matrix->r1c2 + matrix->r2c2 * matrix->r2c2;
return bgc_fp64_matrix2x2_is_identity(&product);
} }
// ==================== Copy ==================== // // ==================== Copy ==================== //

View file

@ -294,40 +294,38 @@ inline int bgc_fp64_matrix3x3_is_singular(const BGC_FP64_Matrix3x3* const matrix
inline int bgc_fp32_matrix3x3_is_rotation(const BGC_FP32_Matrix3x3* const matrix) inline int bgc_fp32_matrix3x3_is_rotation(const BGC_FP32_Matrix3x3* const matrix)
{ {
BGC_FP32_Matrix3x3 product; const float r1r1 = matrix->r1c1 * matrix->r1c1 + matrix->r1c2 * matrix->r1c2 + matrix->r1c3 * matrix->r1c3;
const float r2r2 = matrix->r2c1 * matrix->r2c1 + matrix->r2c2 * matrix->r2c2 + matrix->r2c3 * matrix->r2c3;
const float r3r3 = matrix->r3c1 * matrix->r3c1 + matrix->r3c2 * matrix->r3c2 + matrix->r3c3 * matrix->r3c3;
product.r1c1 = matrix->r1c1 * matrix->r1c1 + matrix->r1c2 * matrix->r2c1 + matrix->r1c3 * matrix->r3c1; const float r1r2 = matrix->r1c1 * matrix->r2c1 + matrix->r1c2 * matrix->r2c2 + matrix->r1c3 * matrix->r2c3;
product.r1c2 = matrix->r1c1 * matrix->r1c2 + matrix->r1c2 * matrix->r2c2 + matrix->r1c3 * matrix->r3c2; const float r1r3 = matrix->r1c1 * matrix->r3c1 + matrix->r1c2 * matrix->r3c2 + matrix->r1c3 * matrix->r3c3;
product.r1c3 = matrix->r1c1 * matrix->r1c3 + matrix->r1c2 * matrix->r2c3 + matrix->r1c3 * matrix->r3c3; const float r2r3 = matrix->r2c1 * matrix->r3c1 + matrix->r2c2 * matrix->r3c2 + matrix->r2c3 * matrix->r3c3;
product.r2c1 = matrix->r2c1 * matrix->r1c1 + matrix->r2c2 * matrix->r2c1 + matrix->r2c3 * matrix->r3c1; return bgc_fp32_is_square_unit(r1r1)
product.r2c2 = matrix->r2c1 * matrix->r1c2 + matrix->r2c2 * matrix->r2c2 + matrix->r2c3 * matrix->r3c2; && bgc_fp32_is_square_unit(r2r2)
product.r2c3 = matrix->r2c1 * matrix->r1c3 + matrix->r2c2 * matrix->r2c3 + matrix->r2c3 * matrix->r3c3; && bgc_fp32_is_square_unit(r3r3)
&& bgc_fp32_is_zero(r1r2)
product.r3c1 = matrix->r3c1 * matrix->r1c1 + matrix->r3c2 * matrix->r2c1 + matrix->r3c3 * matrix->r3c1; && bgc_fp32_is_zero(r1r3)
product.r3c2 = matrix->r3c1 * matrix->r1c2 + matrix->r3c2 * matrix->r2c2 + matrix->r3c3 * matrix->r3c2; && bgc_fp32_is_zero(r2r3);
product.r3c3 = matrix->r3c1 * matrix->r1c3 + matrix->r3c2 * matrix->r2c3 + matrix->r3c3 * matrix->r3c3;
return bgc_fp32_matrix3x3_is_identity(&product);
} }
inline int bgc_fp64_matrix3x3_is_rotation(const BGC_FP64_Matrix3x3* const matrix) inline int bgc_fp64_matrix3x3_is_rotation(const BGC_FP64_Matrix3x3* const matrix)
{ {
BGC_FP64_Matrix3x3 product; const double r1r1 = matrix->r1c1 * matrix->r1c1 + matrix->r1c2 * matrix->r1c2 + matrix->r1c3 * matrix->r1c3;
const double r2r2 = matrix->r2c1 * matrix->r2c1 + matrix->r2c2 * matrix->r2c2 + matrix->r2c3 * matrix->r2c3;
const double r3r3 = matrix->r3c1 * matrix->r3c1 + matrix->r3c2 * matrix->r3c2 + matrix->r3c3 * matrix->r3c3;
product.r1c1 = matrix->r1c1 * matrix->r1c1 + matrix->r1c2 * matrix->r2c1 + matrix->r1c3 * matrix->r3c1; const double r1r2 = matrix->r1c1 * matrix->r2c1 + matrix->r1c2 * matrix->r2c2 + matrix->r1c3 * matrix->r2c3;
product.r1c2 = matrix->r1c1 * matrix->r1c2 + matrix->r1c2 * matrix->r2c2 + matrix->r1c3 * matrix->r3c2; const double r1r3 = matrix->r1c1 * matrix->r3c1 + matrix->r1c2 * matrix->r3c2 + matrix->r1c3 * matrix->r3c3;
product.r1c3 = matrix->r1c1 * matrix->r1c3 + matrix->r1c2 * matrix->r2c3 + matrix->r1c3 * matrix->r3c3; const double r2r3 = matrix->r2c1 * matrix->r3c1 + matrix->r2c2 * matrix->r3c2 + matrix->r2c3 * matrix->r3c3;
product.r2c1 = matrix->r2c1 * matrix->r1c1 + matrix->r2c2 * matrix->r2c1 + matrix->r2c3 * matrix->r3c1; return bgc_fp64_is_square_unit(r1r1)
product.r2c2 = matrix->r2c1 * matrix->r1c2 + matrix->r2c2 * matrix->r2c2 + matrix->r2c3 * matrix->r3c2; && bgc_fp64_is_square_unit(r2r2)
product.r2c3 = matrix->r2c1 * matrix->r1c3 + matrix->r2c2 * matrix->r2c3 + matrix->r2c3 * matrix->r3c3; && bgc_fp64_is_square_unit(r3r3)
&& bgc_fp64_is_zero(r1r2)
product.r3c1 = matrix->r3c1 * matrix->r1c1 + matrix->r3c2 * matrix->r2c1 + matrix->r3c3 * matrix->r3c1; && bgc_fp64_is_zero(r1r3)
product.r3c2 = matrix->r3c1 * matrix->r1c2 + matrix->r3c2 * matrix->r2c2 + matrix->r3c3 * matrix->r3c2; && bgc_fp64_is_zero(r2r3);
product.r3c3 = matrix->r3c1 * matrix->r1c3 + matrix->r3c2 * matrix->r2c3 + matrix->r3c3 * matrix->r3c3;
return bgc_fp64_matrix3x3_is_identity(&product);
} }
// ================ Get Inverse ================= // // ================ Get Inverse ================= //

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

@ -121,18 +121,6 @@ extern inline int bgc_fp64_quaternion_turn_vector(BGC_FP64_Vector3* const turned
extern inline int bgc_fp32_quaternion_turn_vector_back(BGC_FP32_Vector3* const turned_vector, const BGC_FP32_Quaternion* const quaternion, const BGC_FP32_Vector3* const original_vector); extern inline int bgc_fp32_quaternion_turn_vector_back(BGC_FP32_Vector3* const turned_vector, const BGC_FP32_Quaternion* const quaternion, const BGC_FP32_Vector3* const original_vector);
extern inline int bgc_fp64_quaternion_turn_vector_back(BGC_FP64_Vector3* const turned_vector, const BGC_FP64_Quaternion* const quaternion, const BGC_FP64_Vector3* const original_vector); extern inline int bgc_fp64_quaternion_turn_vector_back(BGC_FP64_Vector3* const turned_vector, const BGC_FP64_Quaternion* const quaternion, const BGC_FP64_Vector3* const original_vector);
extern inline void _bgc_fp32_versor_get_rotation_matrix(BGC_FP32_Matrix3x3* const matrix, const BGC_FP32_Quaternion* const versor);
extern inline void _bgc_fp64_versor_get_rotation_matrix(BGC_FP64_Matrix3x3* const matrix, const BGC_FP64_Quaternion* const versor);
extern inline void _bgc_fp32_versor_get_reverse_matrix(BGC_FP32_Matrix3x3* const matrix, const BGC_FP32_Quaternion* const versor);
extern inline void _bgc_fp64_versor_get_reverse_matrix(BGC_FP64_Matrix3x3* const matrix, const BGC_FP64_Quaternion* const versor);
extern inline int bgc_fp32_quaternion_get_rotation_matrix(BGC_FP32_Matrix3x3* const rotation, const BGC_FP32_Quaternion* const quaternion);
extern inline int bgc_fp64_quaternion_get_rotation_matrix(BGC_FP64_Matrix3x3* const rotation, const BGC_FP64_Quaternion* const quaternion);
extern inline int bgc_fp32_quaternion_get_reverse_matrix(BGC_FP32_Matrix3x3* const reverse, const BGC_FP32_Quaternion* const quaternion);
extern inline int bgc_fp64_quaternion_get_reverse_matrix(BGC_FP64_Matrix3x3* const reverse, const BGC_FP64_Quaternion* const quaternion);
extern inline int bgc_fp32_quaternion_get_both_matrices(BGC_FP32_Matrix3x3* const rotation, BGC_FP32_Matrix3x3* const reverse, const BGC_FP32_Quaternion* const quaternion); extern inline int bgc_fp32_quaternion_get_both_matrices(BGC_FP32_Matrix3x3* const rotation, BGC_FP32_Matrix3x3* const reverse, const BGC_FP32_Quaternion* const quaternion);
extern inline int bgc_fp64_quaternion_get_both_matrices(BGC_FP64_Matrix3x3* const rotation, BGC_FP64_Matrix3x3* const reverse, const BGC_FP64_Quaternion* const quaternion); extern inline int bgc_fp64_quaternion_get_both_matrices(BGC_FP64_Matrix3x3* const rotation, BGC_FP64_Matrix3x3* const reverse, const BGC_FP64_Quaternion* const quaternion);
@ -222,3 +210,341 @@ int bgc_fp64_quaternion_get_power(BGC_FP64_Quaternion* const power, const BGC_FP
return BGC_SUCCESS; return BGC_SUCCESS;
} }
// ============ Get Rotation Matrix ============= //
int bgc_fp32_quaternion_get_rotation_matrix(BGC_FP32_Matrix3x3* const rotation, const BGC_FP32_Quaternion* const quaternion)
{
const float ss = quaternion->s * quaternion->s;
const float xx = quaternion->x * quaternion->x;
const float yy = quaternion->y * quaternion->y;
const float zz = quaternion->z * quaternion->z;
const float square_modulus = (ss + xx) + (yy + zz);
if (square_modulus <= BGC_FP32_SQUARE_EPSILON || isnan(square_modulus))
{
bgc_fp32_matrix3x3_make_identity(rotation);
return BGC_FAILURE;
}
const float corrector1 = 1.0f / square_modulus;
const float sx = quaternion->s * quaternion->x;
const float sy = quaternion->s * quaternion->y;
const float sz = quaternion->s * quaternion->z;
const float xy = quaternion->x * quaternion->y;
const float xz = quaternion->x * quaternion->z;