versor  3.0
C++11 library for Geometric algebra
vsr_ncube.h
1 #ifndef VSR_NCUBE_H_INCLUDED
2 #define VSR_NCUBE_H_INCLUDED
3 
4 #include "vsr_products.h"
5 #include "vsr_generic_op.h"
6 #include <vector>
7 
8 namespace vsr{
9 
10 using namespace std;
11 
12  struct CubeEdge{
13  int a, b;
14  CubeEdge(int _a, int _b) : a(_a), b(_b){}
15 
16  void print() { printf("%d, %d\n", a, b);}
17  };
18 
20 template<int DIM>
21 struct NCube{
22 
23 
24 
25  typedef NEVec<DIM> TVec;//EGAMV< DIM, typename Blade1<DIM>::VEC > TVec;
26  typedef NEBiv<DIM> TBiv;//EGAMV< DIM, typename Blade1<DIM>::VEC > TVec;
27 
28  typedef NEVec<3> Vec3;// EGAMV< 3, typename Blade1<3>::VEC > Vec3;
29 
30  int NumVert = pow(2.f,DIM);
31 
32  vector<TVec> roots;
33  vector<CubeEdge> edges;
34 
35  void init() {
36  TVec va, vb;
37  va[DIM-1] = -.5;
38  vb[DIM-1] = .5;
39 
40  auto next = NCube<DIM-1>();
41 
42  for (auto i : next.roots ){
43  roots.push_back( TVec(i+va) );
44  roots.push_back( TVec(i+vb) );
45  }
46 
47  int d = pow(2.f, DIM-1);
48  for (auto i : next.edges ){
49  edges.push_back(i);
50  edges.push_back( CubeEdge(i.a + d, i.b + d));
51  }
52 
53  for (int i = 0; i < next.NumVert; ++i ){
54  edges.push_back( CubeEdge(i, i + d) );
55  }
56  }
57 
58  vector< Vec3 > project(VT dist){
59  vector< Vec3 > res;
60  for (auto i : roots ){
61  res.push_back( Proj<DIM>::Call(dist, i) );
62  }
63  return res;
64  }
65 
66  vector< float > val( VT dist){
67  vector<float> v;
68  for (auto i : roots){
69  v.push_back( Proj<DIM>::Val(dist,i) );
70  }
71  return v;
72  }
73 
74  NCube(){ init(); }
75 
76  /* TBiv biv( int which, float amt = 1.0){ */
77  /* return TVec */
78  /* } */
79 
80  void spin( TBiv& b ){
81  for (auto& i : roots){
82  i = i.sp( Gen::rot( b ) );
83  }
84  }
85 
86  /* vector<Vec3> proj(float dist, bool ortho = false){ */
87  /* vector<Vec3> vec; */
88  /* for (auto& i : roots){ */
89  /* Vec3 v; */
90  /* if (ortho) v = Proj<DIM>::Ortho<3>(i); */
91  /* else v = Proj<DIM>::Call(dist, i); */
92  /* vec.push_back(v); */
93  /* } */
94  /* return vec; */
95  /* } */
96 
97  void print() {
98  for (auto i : roots ) { i.bprint(); i.vprint(); }
99  for (auto i : edges) { i.print(); }
100 
101  }
102 
103 
104 };
105 
106 
108 template<>
109 struct NCube<1>{
110  typedef EGAMV< 1, typename Blade1<1>::VEC > TVec;
111  int NumVert = 2;
112 
113  vector<TVec> roots;
114  vector<CubeEdge> edges;
115 
116  NCube(){ init(); }
117 
118  void init(){
119  roots.push_back( TVec(-.5) );
120  roots.push_back( TVec(.5) );
121  edges.push_back( CubeEdge(0,1) );
122  };
123 
124  void print() {
125  for (auto i : roots) { i.bprint(); i.vprint(); }
126  for (auto i : edges) { i.print(); }
127  }
128 
129 };
130 
131 }//vsr::
132 
133 #endif
ND Cube.
Definition: vsr_ncube.h:21
Definition: vsr_ncube.h:12
Generic Geometric Number Types (templated on an algebra and a basis )
Definition: vsr_algebra.h:69
static Rot rot(const Biv &b)
vsr::cga::Rotor from vsr::cga::Bivector
core namespaced operations that are metric-agnostic
the versor library namespace
Definition: vsr_algebra.h:29