Включение позиции и аффинного преобразования в проект для Visual Studio

This commit is contained in:
Andrey Pokidov 2026-01-27 02:34:34 +07:00
parent 7175c4148a
commit 3c2b89f369
9 changed files with 191 additions and 12 deletions

View file

@ -0,0 +1,156 @@
#include <stdio.h>
#include <stdlib.h>
#include <basic-geometry.h>
#include "affine3.h"
#ifdef _WIN64
#include <windows.h>
#else
#include <time.h>
#endif // _WINDOWS_
BgcAffine3FP32* _create_bgc_affine3_list(int affine_amount)
{
BgcAffine3FP32* affines = malloc(affine_amount * sizeof(BgcAffine3FP32));
if (affines == 0) {
return 0;
}
for (int i = 0; i < affine_amount; i++) {
bgc_affine3_reset_fp32(&affines[i]);
}
return affines;
}
float get_random_value_fp32()
{
return rand() * (2.0f / RAND_MAX) - 1.0f;
}
BgcAffine3FP32* _create_bgc_affine3_random_list(int affine_amount)
{
BgcAffine3FP32* affines = malloc(affine_amount * sizeof(BgcAffine3FP32));
if (affines == 0) {
return 0;
}
BgcPosition3FP32 position;
for (int i = 0; i < affine_amount; i++) {
bgc_versor_set_values_fp32(
get_random_value_fp32(),
get_random_value_fp32(),
get_random_value_fp32(),
get_random_value_fp32(),
&position.turn
);
position.shift.x1 = get_random_value_fp32();
position.shift.x2 = get_random_value_fp32();
position.shift.x3 = get_random_value_fp32();
bgc_position3_get_affine3_map_fp32(&position, &affines[i]);
}
return affines;
}
BgcVector3FP32* _create_bgc_vector3_list(int amount)
{
return malloc(amount * sizeof(BgcVector3FP32));
}
BgcVector3FP32* _create_bgc_vector3_random_list(int amount)
{
BgcVector3FP32* vectors = _create_bgc_vector3_list(amount);
if (vectors == 0) {
return 0;
}
for (int i = 0; i < amount; i++) {
vectors[i].x1 = get_random_value_fp32();
vectors[i].x2 = get_random_value_fp32();
vectors[i].x3 = get_random_value_fp32();
}
return vectors;
}
float test_bgc_affine3_performance(int affine_amount, int vector_per_affine)
{
BgcAffine3FP32* affines;
BgcVector3FP32* source_vectors;
BgcVector3FP32* result_vectors;
int vector_index = 0;
float time = -1.0f;
#ifdef _WIN64
ULONGLONG start, end;
start = GetTickCount64();
srand((unsigned int)(start & 0xfffffff));
#else
struct timespec start, end;
clock_gettime(0, &start);
srand((unsigned int)(start.tv_nsec & 0xfffffff));
#endif // _WIN64
affines = _create_bgc_affine3_random_list(affine_amount);
if (affines == 0) {
return time;
}
source_vectors = _create_bgc_vector3_random_list(affine_amount * vector_per_affine);
if (source_vectors == 0) {
free(affines);
return time;
}
result_vectors = _create_bgc_vector3_list(affine_amount * vector_per_affine);
if (result_vectors == 0) {
free(source_vectors);
free(affines);
return time;
}
#ifdef _WIN64
start = GetTickCount64();
#else
clock_gettime(CLOCK_REALTIME, &start);
#endif // _WIN64
for (int i = 0; i < affine_amount; i++)
{
for (int j = 0; j < vector_per_affine; j++) {
bgc_affine3_transform_point_fp32(&affines[i], &source_vectors[vector_index], &result_vectors[vector_index]);
vector_index++;
}
}
#ifdef _WIN64
end = GetTickCount64();
time = (end - start) * 0.001f;
#else
clock_gettime(CLOCK_REALTIME, &end);
time = (float)(end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) * 0.000000001f;
#endif // _WIN64
printf("Result vector [0] = (%f, %f, %f)\n", result_vectors[0].x1, result_vectors[0].x2, result_vectors[0].x3);
free(result_vectors);
free(source_vectors);
free(affines);
return time;
}

View file

@ -0,0 +1,6 @@
#ifndef _BGC_DEV_AFFINE3_H_
#define _BGC_DEV_AFFINE3_H_
float test_bgc_affine3_performance(int affine_amount, int vector_per_affine);
#endif

View file

@ -20,12 +20,16 @@
</ItemGroup>
<ItemGroup>
<ClCompile Include="main.c" />
<ClCompile Include="affine3.c" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\basic-geometry\basic-geometry.vcxproj">
<Project>{40ca6fb4-135f-4d54-a8d9-7338ba56e6a7}</Project>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<ClInclude Include="affine3.h" />
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>

View file

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

View file

@ -469,10 +469,7 @@ void test_basis_difference_fp64()
print_versor_fp64(&turn);
}
typedef union {
int si32;
float fp32;
} uni_number;
#include "affine3.h"
int main()
{
@ -490,11 +487,11 @@ int main()
*/
//test_basis_difference_fp64();
uni_number number;
printf("Affine3 performance test: %f\n", test_bgc_affine3_performance(10000000, 10));
number.fp32 = 1.0f;
printf("%x\n", number.si32);
printf("sizeof(BgcAffine3FP32) = %zu\n", sizeof(BgcAffine3FP32));
//printf("offsetof(shift) = %zu\n", offsetof(BgcAffine3FP32, shift));
printf("sizeof(BgcMatrix3x3FP32) = %zu\n", sizeof(BgcMatrix3x3FP32));
return 0;
}