Включение позиции и аффинного преобразования в проект для Visual Studio
This commit is contained in:
parent
7175c4148a
commit
3c2b89f369
9 changed files with 191 additions and 12 deletions
156
basic-geometry-dev/affine3.c
Normal file
156
basic-geometry-dev/affine3.c
Normal 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;
|
||||||
|
}
|
||||||
6
basic-geometry-dev/affine3.h
Normal file
6
basic-geometry-dev/affine3.h
Normal 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
|
||||||
|
|
@ -20,12 +20,16 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="main.c" />
|
<ClCompile Include="main.c" />
|
||||||
|
<ClCompile Include="affine3.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\basic-geometry\basic-geometry.vcxproj">
|
<ProjectReference Include="..\basic-geometry\basic-geometry.vcxproj">
|
||||||
<Project>{40ca6fb4-135f-4d54-a8d9-7338ba56e6a7}</Project>
|
<Project>{40ca6fb4-135f-4d54-a8d9-7338ba56e6a7}</Project>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="affine3.h" />
|
||||||
|
</ItemGroup>
|
||||||
<PropertyGroup Label="Globals">
|
<PropertyGroup Label="Globals">
|
||||||
<VCProjectVersion>16.0</VCProjectVersion>
|
<VCProjectVersion>16.0</VCProjectVersion>
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
|
|
||||||
|
|
@ -18,5 +18,13 @@
|
||||||
<ClCompile Include="main.c">
|
<ClCompile Include="main.c">
|
||||||
<Filter>Исходные файлы</Filter>
|
<Filter>Исходные файлы</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="affine3.c">
|
||||||
|
<Filter>Исходные файлы</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="affine3.h">
|
||||||
|
<Filter>Файлы заголовков</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
@ -469,10 +469,7 @@ void test_basis_difference_fp64()
|
||||||
print_versor_fp64(&turn);
|
print_versor_fp64(&turn);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef union {
|
#include "affine3.h"
|
||||||
int si32;
|
|
||||||
float fp32;
|
|
||||||
} uni_number;
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
|
|
@ -490,11 +487,11 @@ int main()
|
||||||
*/
|
*/
|
||||||
//test_basis_difference_fp64();
|
//test_basis_difference_fp64();
|
||||||
|
|
||||||
uni_number number;
|
printf("Affine3 performance test: %f\n", test_bgc_affine3_performance(10000000, 10));
|
||||||
|
|
||||||
number.fp32 = 1.0f;
|
printf("sizeof(BgcAffine3FP32) = %zu\n", sizeof(BgcAffine3FP32));
|
||||||
|
//printf("offsetof(shift) = %zu\n", offsetof(BgcAffine3FP32, shift));
|
||||||
printf("%x\n", number.si32);
|
printf("sizeof(BgcMatrix3x3FP32) = %zu\n", sizeof(BgcMatrix3x3FP32));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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_matrix3x3_get_right_product_fp32(&affine->distortion, initial_point, &distorted);
|
||||||
bgc_vector3_add_fp32(&affine->shift, &distorted, transformed_point);
|
bgc_vector3_add_fp32(&affine->shift, &distorted, transformed_point);
|
||||||
#else
|
#else
|
||||||
const float x1 = affine->r1c1 * initial_point->x1 + affine->r1c2 * initial_point->x2 + affine->r1c3 * initial_point->x3 + affine->shift1;
|
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 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 x3 = (affine->r3c1 * initial_point->x1 + affine->r3c2 * initial_point->x2) + (affine->r3c3 * initial_point->x3 + affine->shift3);
|
||||||
|
|
||||||
transformed_point->x1 = x1;
|
transformed_point->x1 = x1;
|
||||||
transformed_point->x2 = x2;
|
transformed_point->x2 = x2;
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@
|
||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClInclude Include="affine3.h" />
|
||||||
<ClInclude Include="angle.h" />
|
<ClInclude Include="angle.h" />
|
||||||
<ClInclude Include="basic-geometry.h" />
|
<ClInclude Include="basic-geometry.h" />
|
||||||
<ClInclude Include="complex.h" />
|
<ClInclude Include="complex.h" />
|
||||||
|
|
@ -38,6 +39,7 @@
|
||||||
<ClInclude Include="vector3.h" />
|
<ClInclude Include="vector3.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="affine3.c" />
|
||||||
<ClCompile Include="angle.c" />
|
<ClCompile Include="angle.c" />
|
||||||
<ClInclude Include="complex.c" />
|
<ClInclude Include="complex.c" />
|
||||||
<ClInclude Include="cotes-number.c" />
|
<ClInclude Include="cotes-number.c" />
|
||||||
|
|
|
||||||
|
|
@ -72,6 +72,9 @@
|
||||||
<ClInclude Include="types.h">
|
<ClInclude Include="types.h">
|
||||||
<Filter>Файлы заголовков</Filter>
|
<Filter>Файлы заголовков</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="affine3.h">
|
||||||
|
<Filter>Файлы заголовков</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="angle.c">
|
<ClCompile Include="angle.c">
|
||||||
|
|
@ -113,5 +116,8 @@
|
||||||
<ClCompile Include="slerp.c">
|
<ClCompile Include="slerp.c">
|
||||||
<Filter>Исходные файлы</Filter>
|
<Filter>Исходные файлы</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="affine3.c">
|
||||||
|
<Filter>Исходные файлы</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
@ -47,7 +47,7 @@
|
||||||
#define BGC_AXIS_REVERSE_X3 -3
|
#define BGC_AXIS_REVERSE_X3 -3
|
||||||
|
|
||||||
#if !defined(BGC_AFFINE_USE_MATRIX)
|
#if !defined(BGC_AFFINE_USE_MATRIX)
|
||||||
#define BGC_AFFINE_USE_MATRIX 0
|
#define BGC_AFFINE_USE_MATRIX 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
inline int bgc_is_correct_axis(const int axis)
|
inline int bgc_is_correct_axis(const int axis)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue