diff --git a/libs/geom/include/psemek/geom/mesh.hpp b/libs/geom/include/psemek/geom/mesh.hpp new file mode 100644 index 00000000..ac904be9 --- /dev/null +++ b/libs/geom/include/psemek/geom/mesh.hpp @@ -0,0 +1,54 @@ +#pragma once + +#include +#include + +#include +#include + +namespace psemek::geom +{ + + template + std::vector> vertices(box const & b) + { + std::vector> result; + + for (std::size_t mask = 0; mask < (1 << N); ++mask) + { + point p; + for (std::size_t i = 0; i < N; ++i) + { + p[i] = (mask & (1 << i)) ? b[i].max : b[i].min; + } + result.push_back(p); + } + + return result; + } + + template + std::vector> edges(box const &) + { + static_assert(N > 0); // who knows?.. + + std::vector> result; + + for (std::size_t i = 0; i < N; ++i) + { + for (std::size_t mask = 0; mask < (1 << (N - 1)); ++mask) + { + auto const lo = mask & ((1 << i) - 1); + auto const hi = mask ^ lo; + + auto const idx0 = lo | (hi << 1); + auto const idx1 = idx0 | (1 << i); + + result.push_back({static_cast(idx0), static_cast(idx1)}); + } + } + + return result; + } + +}