From 7e8aaeb25d89d54e7d7d9c3a1af1b30194d5e2f5 Mon Sep 17 00:00:00 2001 From: David Allemang Date: Fri, 13 Sep 2019 20:45:27 -0400 Subject: [PATCH 1/3] mirror normals outline --- cosets/CMakeLists.txt | 3 +++ cosets/src/mirror.cpp | 60 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 cosets/src/mirror.cpp diff --git a/cosets/CMakeLists.txt b/cosets/CMakeLists.txt index c8cf75b..61e4c6b 100644 --- a/cosets/CMakeLists.txt +++ b/cosets/CMakeLists.txt @@ -17,3 +17,6 @@ add_custom_command( ) 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..4fe887e --- /dev/null +++ b/cosets/src/mirror.cpp @@ -0,0 +1,60 @@ +#include +#include +#include +#include +#include + +template +using vecn = glm::vec; + +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; +} + +template +std::vector mirror(const float (&arr)[N - 1][N - 1]) { + 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]; + float a = cos(M_PI / arr[p-1][m]); + float b = dot(m, vp, vq); + float c = vq[m]; + float d = a - b / c; + vp[m] = d; + } + vp[p] = std::sqrt(1 - glm::dot(vp, vp)); + + for (const auto &v : mirrors) { + if (glm::dot(vp, v) > 0) { + vp *= -1; + break; + } + } + + mirrors[p] = vp; + } + + return mirrors; +} + +int main(int argc, char *argv[]) { + int planes = 3; + auto normals = mirror<3>((float[2][2]) { + {4}, + {2, 3} + }); + + for (const auto &normal : normals) { + std::cout << glm::to_string(normal) << std::endl; + } + + return 0; +} \ No newline at end of file From ac072710fcf86567ff33a846645031c1beb57108 Mon Sep 17 00:00:00 2001 From: allem Date: Fri, 13 Sep 2019 23:00:33 -0400 Subject: [PATCH 2/3] mirror computation working nicely --- cosets/src/mirror.cpp | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/cosets/src/mirror.cpp b/cosets/src/mirror.cpp index 4fe887e..bca334b 100644 --- a/cosets/src/mirror.cpp +++ b/cosets/src/mirror.cpp @@ -3,6 +3,13 @@ #include #include #include +#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; +} template using vecn = glm::vec; @@ -16,7 +23,7 @@ float dot(int n, glm::vec4 a, glm::vec4 b) { } template -std::vector mirror(const float (&arr)[N - 1][N - 1]) { +std::vector mirror(const float (&arr)[N][N]) { static_assert(1 <= N and N <= 4, "Vector size is unsupported"); std::vector mirrors{}; @@ -24,11 +31,7 @@ std::vector mirror(const float (&arr)[N - 1][N - 1]) { glm::vec4 vp{}; for (int m = 0; m < p; ++m) { glm::vec4 vq = mirrors[m]; - float a = cos(M_PI / arr[p-1][m]); - float b = dot(m, vp, vq); - float c = vq[m]; - float d = a - b / c; - vp[m] = d; + vp[m] = (cos(M_PI / arr[p][m]) - dot(m, vp, vq)) / vq[m]; } vp[p] = std::sqrt(1 - glm::dot(vp, vp)); @@ -39,15 +42,15 @@ std::vector mirror(const float (&arr)[N - 1][N - 1]) { } } - mirrors[p] = vp; + mirrors.push_back(round(vp, 15)); } return mirrors; } int main(int argc, char *argv[]) { - int planes = 3; - auto normals = mirror<3>((float[2][2]) { + auto normals = mirror<3>({ + {}, {4}, {2, 3} }); From f0d1ac84b927e91d5366c906695a025137614e39 Mon Sep 17 00:00:00 2001 From: allem Date: Fri, 13 Sep 2019 23:05:31 -0400 Subject: [PATCH 3/3] move glm utilities into numeric.hpp; misc cleanup --- cosets/CMakeLists.txt | 11 ++++------- cosets/src/mirror.cpp | 17 +---------------- cosets/src/tc.cpp | 2 +- cosets/src/util/numeric.hpp | 17 +++++++++++++++++ 4 files changed, 23 insertions(+), 24 deletions(-) create mode 100644 cosets/src/util/numeric.hpp diff --git a/cosets/CMakeLists.txt b/cosets/CMakeLists.txt index 61e4c6b..5a14367 100644 --- a/cosets/CMakeLists.txt +++ b/cosets/CMakeLists.txt @@ -6,14 +6,11 @@ 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) diff --git a/cosets/src/mirror.cpp b/cosets/src/mirror.cpp index bca334b..098e5c4 100644 --- a/cosets/src/mirror.cpp +++ b/cosets/src/mirror.cpp @@ -5,22 +5,7 @@ #include #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; -} - -template -using vecn = glm::vec; - -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; -} +#include "util/numeric.hpp" template std::vector mirror(const float (&arr)[N][N]) { 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; +}