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} });