diff --git a/basic-geometry-dev/affine3.c b/basic-geometry-dev/affine3.c new file mode 100644 index 0000000..934bd92 --- /dev/null +++ b/basic-geometry-dev/affine3.c @@ -0,0 +1,156 @@ +#include +#include +#include +#include "affine3.h" + +#ifdef _WIN64 +#include +#else +#include +#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; +} \ No newline at end of file diff --git a/basic-geometry-dev/affine3.h b/basic-geometry-dev/affine3.h new file mode 100644 index 0000000..d805692 --- /dev/null +++ b/basic-geometry-dev/affine3.h @@ -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 diff --git a/basic-geometry-dev/basic-geometry-dev.vcxproj b/basic-geometry-dev/basic-geometry-dev.vcxproj index a59cbf8..ea906eb 100644 --- a/basic-geometry-dev/basic-geometry-dev.vcxproj +++ b/basic-geometry-dev/basic-geometry-dev.vcxproj @@ -20,12 +20,16 @@ + {40ca6fb4-135f-4d54-a8d9-7338ba56e6a7} + + + 16.0 Win32Proj diff --git a/basic-geometry-dev/basic-geometry-dev.vcxproj.filters b/basic-geometry-dev/basic-geometry-dev.vcxproj.filters index 48814f7..e073d59 100644 --- a/basic-geometry-dev/basic-geometry-dev.vcxproj.filters +++ b/basic-geometry-dev/basic-geometry-dev.vcxproj.filters @@ -18,5 +18,13 @@ Исходные файлы + + Исходные файлы + + + + + Файлы заголовков + \ No newline at end of file diff --git a/basic-geometry-dev/main.c b/basic-geometry-dev/main.c index bf970ae..04912ed 100644 --- a/basic-geometry-dev/main.c +++ b/basic-geometry-dev/main.c @@ -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; } diff --git a/basic-geometry/affine3.h b/basic-geometry/affine3.h index 6500cb0..161bbf5 100644 --- a/basic-geometry/affine3.h +++ b/basic-geometry/affine3.h @@ -279,9 +279,9 @@ inline void bgc_affine3_transform_point_fp32(const BgcAffine3FP32 * affine, cons bgc_matrix3x3_get_right_product_fp32(&affine->distortion, initial_point, &distorted); bgc_vector3_add_fp32(&affine->shift, &distorted, transformed_point); #else - const float x1 = affine->r1c1 * initial_point->x1 + affine->r1c2 * initial_point->x2 + affine->r1c3 * initial_point->x3 + affine->shift1; - const float x2 = affine->r2c1 * initial_point->x1 + affine->r2c2 * initial_point->x2 + affine->r2c3 * initial_point->x3 + affine->shift2; - const float x3 = affine->r3c1 * initial_point->x1 + affine->r3c2 * initial_point->x2 + affine->r3c3 * initial_point->x3 + affine->shift3; + const float x1 = (affine->r1c1 * initial_point->x1 + affine->r1c2 * initial_point->x2) + (affine->r1c3 * initial_point->x3 + affine->shift1); + const float x2 = (affine->r2c1 * initial_point->x1 + affine->r2c2 * initial_point->x2) + (affine->r2c3 * initial_point->x3 + affine->shift2); + const float x3 = (affine->r3c1 * initial_point->x1 + affine->r3c2 * initial_point->x2) + (affine->r3c3 * initial_point->x3 + affine->shift3); transformed_point->x1 = x1; transformed_point->x2 = x2; diff --git a/basic-geometry/basic-geometry.vcxproj b/basic-geometry/basic-geometry.vcxproj index 11eab0f..571c855 100644 --- a/basic-geometry/basic-geometry.vcxproj +++ b/basic-geometry/basic-geometry.vcxproj @@ -19,6 +19,7 @@ + @@ -38,6 +39,7 @@ + diff --git a/basic-geometry/basic-geometry.vcxproj.filters b/basic-geometry/basic-geometry.vcxproj.filters index cc4282f..79ea2e7 100644 --- a/basic-geometry/basic-geometry.vcxproj.filters +++ b/basic-geometry/basic-geometry.vcxproj.filters @@ -72,6 +72,9 @@ Файлы заголовков + + Файлы заголовков + @@ -113,5 +116,8 @@ Исходные файлы + + Исходные файлы + \ No newline at end of file diff --git a/basic-geometry/utilities.h b/basic-geometry/utilities.h index 46c713f..03ad443 100644 --- a/basic-geometry/utilities.h +++ b/basic-geometry/utilities.h @@ -47,7 +47,7 @@ #define BGC_AXIS_REVERSE_X3 -3 #if !defined(BGC_AFFINE_USE_MATRIX) -#define BGC_AFFINE_USE_MATRIX 0 +#define BGC_AFFINE_USE_MATRIX 1 #endif inline int bgc_is_correct_axis(const int axis)