From eec9c0b0d8ed3f0a67c6ad8270deb0bca61afc71 Mon Sep 17 00:00:00 2001 From: allem Date: Wed, 8 Jan 2020 23:43:40 -0500 Subject: [PATCH] allow higher dimensions in mirror solver --- vendor/toddcox | 2 +- vis/include/mirror.hpp | 39 ++++++++++++++++++++++++++++++--------- vis/src/main.cpp | 18 ++++++++++++------ 3 files changed, 43 insertions(+), 16 deletions(-) diff --git a/vendor/toddcox b/vendor/toddcox index 4fd22f3..7cfb0a3 160000 --- a/vendor/toddcox +++ b/vendor/toddcox @@ -1 +1 @@ -Subproject commit 4fd22f343ec17192bbab112d14faffa4a5e00aa6 +Subproject commit 7cfb0a380311cdd7c050407b3642bbb8a07f417d diff --git a/vis/include/mirror.hpp b/vis/include/mirror.hpp index 948f360..1a4315f 100644 --- a/vis/include/mirror.hpp +++ b/vis/include/mirror.hpp @@ -20,28 +20,49 @@ float dot(int n, const glm::vec4 &a, const glm::vec4 &b) { return sum; } +float dot(int n, const std::vector &a, const std::vector &b) { + float sum = 0; + for (int i = 0; i < n; ++i) { + sum += a[i] * b[i]; + } + return sum; +} + std::vector mirror(const tc::Group &group) { - std::vector mirrors; + std::vector> mirrors; for (int p = 0; p < group.ngens; ++p) { - glm::vec4 vp{}; + std::vector vp; for (int m = 0; m < p; ++m) { - glm::vec4 vq = mirrors[m]; - vp[m] = (cos(M_PI / group.get(p, m)) - dot(m, vp, vq)) / vq[m]; + auto &vq = mirrors[m]; + vp.push_back((cos(M_PI / group.get(p, m)) - dot(m, vp, vq)) / vq[m]); } - vp[p] = std::sqrt(1 - glm::dot(vp, vp)); + vp.push_back(std::sqrt(1 - dot(p, vp, vp))); for (const auto &v : mirrors) { - if (glm::dot(vp, v) > 0) { - vp *= -1; + if (dot(p, vp, vp) > 0) { + for (auto &e : vp) { + e *= -1; + } break; } } - mirrors.push_back(round(vp, 15)); + mirrors.push_back(vp); } - return mirrors; + std::vector res; + for (const auto &vec : mirrors) { + glm::vec4 rvec{}; + + // ortho proj + for (int i = 0; i < std::min(vec.size(), 4LU); ++i) { + rvec[i] = vec[i]; + } + + res.push_back(rvec); + } + return res; } glm::vec4 project(const glm::vec4 &vec, const glm::vec4 &target) { diff --git a/vis/src/main.cpp b/vis/src/main.cpp index ff10aca..7db9397 100644 --- a/vis/src/main.cpp +++ b/vis/src/main.cpp @@ -56,8 +56,8 @@ int main(int argc, char *argv[]) { "void main() {" " int i = gl_VertexID;" " vpos = view * pos;" - // " gl_Position = proj * vec4(vpos.xyz / (1), 1);" - " gl_Position = proj * vec4(vpos.xyz / (1 - vpos.w), 1);" + " gl_Position = proj * vec4(vpos.xyz / (1), 1);" + // " gl_Position = proj * vec4(vpos.xyz / (1 - vpos.w), 1);" " gl_PointSize = 5;" "}"; @@ -71,6 +71,7 @@ int main(int argc, char *argv[]) { "" "void main() {" " float d = smoothstep(-2, 2, vpos.z);" + " vec3 off = 1.04 * vec3(0, 2, 4) + 2 * vec3(vpos.w);" " color = vec4(c * d, 1);" "}"; @@ -107,12 +108,17 @@ int main(int argc, char *argv[]) { } //endregion - auto group = tc::group::B(4); + auto group = tc::group::H(3); auto res = group.solve(); auto mirrors = mirror(group); - auto corners = plane_intersections(mirrors); + std::cout << "Solved " << res.size() << std::endl; + std::cout << "Mirror lengths:" << std::endl; + for (const auto &m : mirrors) { + std::cout << glm::length(m) << " (" << m.x << " " << m.y << " " << m.z << " " << m.w << ")" << std::endl; + } - auto start = barycentric(corners, {1.00f, 0.50f, 0.50f, 0.50f}); + auto corners = plane_intersections(mirrors); + auto start = barycentric(corners, {1.00, 1.00, 1.00, 1.00}); auto points = res.path.walk(start, mirrors, reflect); GLuint vbo; @@ -139,7 +145,7 @@ int main(int argc, char *argv[]) { auto aspect = (float) width / (float) height; auto pheight = 1.4f; auto pwidth = aspect * pheight; - glm::mat4 proj = glm::ortho(-pwidth, pwidth, -pheight, pheight); + glm::mat4 proj = glm::ortho(-pwidth, pwidth, -pheight, pheight, -100.0f, 100.0f); glUniformMatrix4fv(0, 1, false, glm::value_ptr(proj)); auto t = (float) glfwGetTime() / 3;