diff --git a/cosets/CMakeLists.txt b/cosets/CMakeLists.txt index c8cf75b..5a14367 100644 --- a/cosets/CMakeLists.txt +++ b/cosets/CMakeLists.txt @@ -6,14 +6,14 @@ add_executable(${PROJECT_NAME} target_link_libraries(${PROJECT_NAME} PRIVATE glad glm glfw) -target_include_directories(${PROJECT_NAME} - PRIVATE include) - add_custom_command( - TARGET cosets POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${CMAKE_CURRENT_SOURCE_DIR}/src/shaders - ${CMAKE_CURRENT_BINARY_DIR}/shaders + TARGET cosets POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + ${CMAKE_CURRENT_SOURCE_DIR}/src/shaders + ${CMAKE_CURRENT_BINARY_DIR}/shaders ) add_executable(coxeter src/tc.cpp) + +add_executable(mirror src/mirror.cpp) +target_link_libraries(mirror PRIVATE glm) diff --git a/cosets/src/mirror.cpp b/cosets/src/mirror.cpp new file mode 100644 index 0000000..098e5c4 --- /dev/null +++ b/cosets/src/mirror.cpp @@ -0,0 +1,48 @@ +#include +#include +#include +#include +#include +#include + +#include "util/numeric.hpp" + +template +std::vector mirror(const float (&arr)[N][N]) { + static_assert(1 <= N and N <= 4, "Vector size is unsupported"); + + std::vector mirrors{}; + for (int p = 0; p < N; ++p) { + glm::vec4 vp{}; + for (int m = 0; m < p; ++m) { + glm::vec4 vq = mirrors[m]; + vp[m] = (cos(M_PI / arr[p][m]) - dot(m, vp, vq)) / vq[m]; + } + vp[p] = std::sqrt(1 - glm::dot(vp, vp)); + + for (const auto &v : mirrors) { + if (glm::dot(vp, v) > 0) { + vp *= -1; + break; + } + } + + mirrors.push_back(round(vp, 15)); + } + + return mirrors; +} + +int main(int argc, char *argv[]) { + auto normals = mirror<3>({ + {}, + {4}, + {2, 3} + }); + + for (const auto &normal : normals) { + std::cout << glm::to_string(normal) << std::endl; + } + + return 0; +} \ No newline at end of file diff --git a/cosets/src/tc.cpp b/cosets/src/tc.cpp index 4db7b3b..013714e 100644 --- a/cosets/src/tc.cpp +++ b/cosets/src/tc.cpp @@ -98,7 +98,7 @@ struct Row { this->to = cos; } - bool learn(Table *table) { + [[nodiscard]] bool learn(Table *table) { if (r - l == 0) { return false; } diff --git a/cosets/src/util/numeric.hpp b/cosets/src/util/numeric.hpp new file mode 100644 index 0000000..b4ab66c --- /dev/null +++ b/cosets/src/util/numeric.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include + +glm::vec4 round(glm::vec4 f, int prec) { + auto dec = (float) pow(10, prec); + auto res = glm::trunc(f * dec + 0.5f) / dec; + return res; +} + +float dot(int n, glm::vec4 a, glm::vec4 b) { + float sum = 0; + for (int i = 0; i < n; ++i) { + sum += a[i] * b[i]; + } + return sum; +}