From 1b50b04c1ced15396d3be41854b08d73d2dc7ead Mon Sep 17 00:00:00 2001 From: allem Date: Sat, 14 Sep 2019 00:05:55 -0400 Subject: [PATCH] use multiplicities class; fix cmakelists typo --- cosets/CMakeLists.txt | 2 +- cosets/src/mirrors.cpp | 9 ++++----- cosets/src/util/coxeter.hpp | 32 ++++++++++++++++++++++++++++++++ cosets/src/util/mirrors.hpp | 5 +++-- 4 files changed, 40 insertions(+), 8 deletions(-) diff --git a/cosets/CMakeLists.txt b/cosets/CMakeLists.txt index 3b9bca0..4e40d31 100644 --- a/cosets/CMakeLists.txt +++ b/cosets/CMakeLists.txt @@ -13,6 +13,6 @@ add_custom_command( ${CMAKE_CURRENT_BINARY_DIR}/shaders ) -add_executable(coxeter scr/coxeter.cpp) +add_executable(coxeter src/coxeter.cpp) add_executable(mirror src/mirrors.cpp) target_link_libraries(mirror PRIVATE glm) diff --git a/cosets/src/mirrors.cpp b/cosets/src/mirrors.cpp index aa9d2b4..51ba1d6 100644 --- a/cosets/src/mirrors.cpp +++ b/cosets/src/mirrors.cpp @@ -1,11 +1,10 @@ #include "util/mirrors.hpp" int main(int argc, char *argv[]) { - auto normals = mirror<3>({ - {}, - {4}, - {2, 3} - }); + auto normals = mirror<3>(Multiplicites<3>({ + {0, 1, 4}, + {1, 2, 3} + })); for (const auto &normal : normals) { std::cout << glm::to_string(normal) << std::endl; diff --git a/cosets/src/util/coxeter.hpp b/cosets/src/util/coxeter.hpp index 19af6e2..d8e0f4e 100644 --- a/cosets/src/util/coxeter.hpp +++ b/cosets/src/util/coxeter.hpp @@ -4,6 +4,38 @@ #include #include +struct Mult { + int a, b, mult; +}; + +template +struct Multiplicites { + std::vector mults; + + explicit Multiplicites(std::vector vals) { + mults = std::vector(N * (N - 1) / 2, 2); + for (const auto &mult : vals) { + set(mult.a, mult.b, mult.mult); + } + } + + void set(int a, int b, int mult) { + if (a > N or b > N) throw std::logic_error("mirror does not exist"); + if (a == b) throw std::logic_error("cannot compare mirror to itself"); + if (a < b) std::swap(a, b); // a is bigger + + mults[a + b] = mult; + } + + int get(int a, int b) const { + if (a > N or b > N) throw std::logic_error("mirror does not exist"); + if (a == b) throw std::logic_error("cannot compare mirror to itself"); + if (a < b) std::swap(a, b); // a is bigger + + return mults[a + b]; + } +}; + struct Table { int N; diff --git a/cosets/src/util/mirrors.hpp b/cosets/src/util/mirrors.hpp index 06ce895..fc18e37 100644 --- a/cosets/src/util/mirrors.hpp +++ b/cosets/src/util/mirrors.hpp @@ -6,9 +6,10 @@ #include #include "numeric.hpp" +#include "coxeter.hpp" template -std::vector mirror(const float (&arr)[N][N]) { +std::vector mirror(const Multiplicites &mults) { static_assert(1 <= N and N <= 4, "Vector size is unsupported"); std::vector mirrors{}; @@ -16,7 +17,7 @@ std::vector mirror(const float (&arr)[N][N]) { 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[m] = (cos(M_PI / mults.get(p, m)) - dot(m, vp, vq)) / vq[m]; } vp[p] = std::sqrt(1 - glm::dot(vp, vp));