summaryrefslogtreecommitdiff
path: root/c++/ico.hpp
diff options
context:
space:
mode:
authorClaudius "keldu" Holeksa <mail@keldu.de>2026-11-02 21:22:23 +0100
committerClaudius "keldu" Holeksa <mail@keldu.de>2026-11-02 21:22:23 +0100
commit5ca778dba2fa6fa89fbea0fe76a3d1fbba6bc143 (patch)
tree2324178fbb9cc6c562d1953cc1135aa9373b588a /c++/ico.hpp
parent5c8c822546039e7422a0dcb0841adbcbc9fb4d60 (diff)
downloadsims-icosahedrical_destruction-5ca778dba2fa6fa89fbea0fe76a3d1fbba6bc143.tar.gz
Restructure
Diffstat (limited to 'c++/ico.hpp')
-rw-r--r--c++/ico.hpp170
1 files changed, 0 insertions, 170 deletions
diff --git a/c++/ico.hpp b/c++/ico.hpp
deleted file mode 100644
index 257f12d..0000000
--- a/c++/ico.hpp
+++ /dev/null
@@ -1,170 +0,0 @@
-#pragma once
-
-#include <array>
-#include <cassert>
-#include <cstdint>
-
-namespace kel {
-namespace impl {
-struct ico_surface_helper {
- /**
- * On each triangle we assume a ccw order and we start on the top-left part of the
- * triangle. The orientation of the triangle is determined by the horizontal line
- * (on the 2D foldout of the icosahedron) which is the down direction.
- */
- static constexpr std::array<std::array<uint8_t,3u>, 20u> neighbour_map {{
- {1,4,5},//0
- {2,0,6},//1
- {3,1,7},//2
- {4,2,8},//3
- {0,3,9},//4
- {14,10,0},//5
- {10,11,1},//6
- {11,12,2},//7
- {12,13,3},//8
- {13,14,4},//9
- {6,5,15},//10
- {7,6,16},//11
- {8,7,17},//12
- {9,8,18},//13
- {5,9,19},//14
- {19,16,10},//15
- {15,17,11},//16
- {16,18,12},//17
- {17,19,13},//18
- {18,15,14} //19
- }};
-};
-}
-
-template<uint64_t SubD>
-class ico_addr {
-private:
- std::array<uint8_t, SubD> vals_;
-public:
- uint8_t& at(uint64_t i){
- return vals_[i];
- }
-
- const uint8_t& at(uint64_t i) const {
- return vals_[i];
- }
-
- constexpr uint64_t size() const {
- return SubD;
- }
-
- bool is_equal(const ico_addr<SubD>& rhs) const {
- bool eq = true;
-
- for(uint64_t i = 0u; i < size(); ++i){
- eq &= (at(i) == rhs.at(i));
- }
-
- return eq;
- }
-
- bool has_zero() const {
- uint64_t z_ctr = 0u;
- for(uint64_t i = 1u; i < size(); ++i){
- z_ctr += (at(i) == 0u ? 1u : 0u);
- }
- return (z_ctr > 0u);
- }
-
- std::array<uint64_t,4u> count_groups() const {
- std::array<uint64_t,4u> grps{0,0,0,0};
-
- for(uint64_t i = 1u; i < size(); ++i){
- auto& addr_i = vals_[i];
- assert(addr_i < 4);
-
- ++grps[addr_i];
- }
-
- return grps;
- }
-
- uint64_t count_non_zero_groups() const {
- auto ctr = count_groups();
-
- uint64_t grp_ctr = 0u;
- for(uint64_t i = 1u; i < ctr.size(); ++i){
- grp_ctr += (ctr[i] > 0u ? 1u : 0u);
- }
- return grp_ctr;
- }
-
- bool has_all_non_zero_groups() const {
- auto ctr = count_non_zero_groups();
- return (ctr == 3u);
- }
-
- ico_addr<SubD> go_to(uint8_t dir_i){
- ico_addr<SubD> cpy_addr;
- cpy_addr.vals_ = vals_;
-
- if(at(size() - 1u) == 0u){
- cpy_addr.at(size() - 1u) = dir_i + 1u;
- }
- if(at(size() - 1u) == (dir_i + 1u)){
- cpy_addr.at(size() - 1u) = 0u;
- }
-
- return cpy_addr;
- }
-
- bool borders_root() const {
- return not (has_all_non_zero_groups() or has_zero());
- }
-};
-
-template<typename T, uint64_t D>
-class ico_triangle {
-private:
- std::array<ico_triangle<T,D-1u>,4u> subdivs_;
-public:
-
- ico_triangle<T,D-1u>& at(uint8_t i){
- return subdivs_[i];
- }
-
- template<uint64_t AddrOrigLen>
- ico_triangle<T,0u> at(const ico_addr<AddrOrigLen>& addr, uint64_t next_i){
- auto& addr_i = addr[next_i];
-
- auto& sub_triangle = subdivs_[addr_i];
- if constexpr ( D == 1u){
- return sub_triangle;
- }
- return sub_triangle.at(addr,next_i+1u);
- }
-};
-
-template<typename T>
-class ico_triangle<T,0u> final {
-private:
- T val_;
-public:
-};
-
-namespace impl {
-}
-
-template<typename T, uint64_t SubD>
-class icosahedron final {
-private:
- std::array<ico_triangle<T,SubD>,20u> surfaces_;
-public:
-
- template<uint64_t AddrD>
- ico_triangle<T,SubD+1u-AddrD> at(const ico_addr<AddrD>& addr){
- static_assert(AddrD <= (SubD+1u), "Addr length to large.");
- static_assert(AddrD > 0u, "Addr length to small.");
-
- auto& root_addr = addr[0u];
- auto& root_triangle = surfaces_[root_addr];
- return root_triangle.at(addr, 1u);
- }
-};
-}